У цьому підручнику ми дізнаємося про перевантаження операторів на прикладах.
У C ++ ми можемо змінити спосіб роботи операторів для визначених користувачем типів, таких як об'єкти та структури. Це відоме як перевантаження оператора . Наприклад,
Припустимо, ми створили три об'єкти c1, c2 і отримали результат із класу з іменем, Complex
що представляє комплексні числа.
Оскільки перевантаження оператора дозволяє нам змінити спосіб роботи операторів, ми можемо перевизначити, як +
працює оператор, і використовувати його для додавання комплексних чисел c1 і c2, написавши такий код:
result = c1 + c2;
замість чогось типу
result = c1.addNumbers(c2);
Це робить наш код інтуїтивним та простим для розуміння.
Примітка: Ми не можемо використовувати оператор перевантаження для основних типів даних , таких як int
, float
, char
і так далі.
Синтаксис для перевантаження оператора C ++
Для перевантаження оператора ми використовуємо спеціальну operator
функцію.
class className (… public returnType operator symbol (arguments) (… )… );
Ось,
returnType
є типом повернення функції.- оператор - це ключове слово.
symbol
є оператором, який ми хочемо перевантажити. Як:+
,<
,-
,++
і т.д.arguments
- це аргументи, передані функції.
Перевантаження оператора в одинарних операторах
Одинарні оператори працюють лише з одним операндом. Оператор приросту ++
та зменшення - --
це приклади одинарних операторів.
Приклад1: Перевантаження оператора ++ (одинарний оператор)
// Overload ++ when used as prefix #include using namespace std; class Count ( private: int value; public: // Constructor to initialize count to 5 Count() : value(5) () // Overload ++ when used as prefix void operator ++ () ( ++value; ) void display() ( cout << "Count: " << value << endl; ) ); int main() ( Count count1; // Call the "void operator ++ ()" function ++count1; count1.display(); return 0; )
Вихідні дані
Кількість: 6
Тут, коли ми використовуємо ++count1;
, void operator ++ ()
називається. Це збільшує атрибут value для об'єкта count1 на 1.
Примітка: Коли ми перевантажуємо оператори, ми можемо використовувати його для роботи будь-яким способом, який нам подобається. Наприклад, ми могли використати ++
для збільшення значення на 100.
Однак це робить наш код заплутаним і важким для розуміння. Наша робота програміста - використовувати перевантаження оператора правильно, послідовно та інтуїтивно зрозуміло.
Наведений приклад працює лише тоді, коли ++
використовується як префікс. Для того, щоб ++
працювати як постфікс, ми використовуємо цей синтаксис.
void operator ++ (int) ( // code )
Зверніть увагу на int
внутрішні дужки. Це синтаксис, який використовується для використання одинарних операторів як постфікса; це не параметр функції.
Приклад 2: Перевантаження оператора ++ (Одинарний оператор)
// Overload ++ when used as prefix and postfix #include using namespace std; class Count ( private: int value; public: // Constructor to initialize count to 5 Count() : value(5) () // Overload ++ when used as prefix void operator ++ () ( ++value; ) // Overload ++ when used as postfix void operator ++ (int) ( ++value; ) void display() ( cout << "Count: " << value << endl; ) ); int main() ( Count count1; // Call the "void operator ++ (int)" function count1++; count1.display(); // Call the "void operator ++ ()" function ++ count1; count1.display(); return 0; )
Вихідні дані
Кількість: 6 Кількість: 7
Приклад 2 працює , коли ++
використовується в якості префікса як і постфікса. Однак це не працює, якщо ми намагаємось зробити щось подібне:
Count count1, result; // Error result = ++count1;
Це тому, що тип повернення нашої операторської функції - void
. Ми можемо вирішити цю проблему, зробивши Count
як тип повернення функцію оператора.
// return Count when ++ used as prefix Count operator ++ () ( // code ) // return Count when ++ used as postfix Count operator ++ (int) ( // code )
Приклад 3: Повернене значення з функції оператора (++ Оператор)
#include using namespace std; class Count ( private: int value; public : // Constructor to initialize count to 5 Count() : value(5) () // Overload ++ when used as prefix Count operator ++ () ( Count temp; // Here, value is the value attribute of the calling object temp.value = ++value; return temp; ) // Overload ++ when used as postfix Count operator ++ (int) ( Count temp; // Here, value is the value attribute of the calling object temp.value = ++value; return temp; ) void display() ( cout << "Count: " << value << endl; ) ); int main() ( Count count1, result; // Call the "Count operator ++ ()" function result = ++count1; result.display(); // Call the "Count operator ++ (int)" function result = count1++; result.display(); return 0; )
Вихідні дані
Кількість: 6 Кількість: 7
Тут ми використали такий код для перевантаження оператора префікса:
// Overload ++ when used as prefix Count operator ++ () ( Count temp; // Here, value is the value attribute of the calling object temp.value = ++value; return temp; )
Код для перевантаження оператора постфіксу також однаковий. Зверніть увагу, що ми створили temp об'єкта і повернули його значення функції-оператору.
Також зверніть увагу на код
temp.value = ++value;
Значення змінної належить об’єкту count1, main()
оскільки count1 викликає функцію, тоді як temp.value належить об’єкту temp.
Перевантаження оператора в двійкових операторах
Двійкові оператори працюють над двома операндами. Наприклад,
result = num + 9;
Тут +
є двійковий оператор, який працює над операндами num і 9
.
Коли ми перевантажуємо двійковий оператор для визначених користувачем типів за допомогою коду:
obj3 = obj1 + obj2;
Функція оператора викликається за допомогою об'єкта obj1, а obj2 передається як аргумент функції.
Приклад 4: Перевантаження двійкового оператора C ++
// C++ program to overload the binary operator + // This program adds two complex numbers #include using namespace std; class Complex ( private: float real; float imag; public: // Constructor to initialize real and imag to 0 Complex() : real(0), imag(0) () void input() ( cout <> real; cin>> imag; ) // Overload the + operator Complex operator + (const Complex& obj) ( Complex temp; temp.real = real + obj.real; temp.imag = imag + obj.imag; return temp; ) void output() ( if (imag < 0) cout << "Output Complex number: " << real << imag << "i"; else cout << "Output Complex number: " << real << "+" << imag << "i"; ) ); int main() ( Complex complex1, complex2, result; cout << "Enter first complex number:"; complex1.input(); cout << "Enter second complex number:"; complex2.input(); // complex1 calls the operator function // complex2 is passed as an argument to the function result = complex1 + complex2; result.output(); return 0; )
Вихідні дані
Введіть перше комплексне число: Введіть відповідно дійсну та уявну частини: 9 5 Введіть друге комплексне число: Введіть відповідно дійсне та уявне частини: 7 6 Комплексне число: 16 + 11
У цій програмі функцією оператора є:
Complex operator + (const Complex& obj) ( // code )
Замість цього ми також могли б написати цю функцію, наприклад:
Complex operator + (Complex obj) ( // code )
Однак,
- використання
&
робить наш код ефективним, посилаючись на об’єкт complex2, замість того, щоб робити дублікат об’єкта всередині функції оператора. - використання
const
вважається гарною практикою, оскільки заважає функції оператора змінювати комплекс2.

Що слід пам’ятати при перевантаженні оператора C ++
- Два оператори
=
і&
вже перевантажені за замовчуванням у C ++. Наприклад, для копіювання об'єктів одного класу ми можемо безпосередньо використовувати=
оператор. Нам не потрібно створювати функцію оператора. - Перевантаження оператора не може змінити перевагу та асоціативність операторів. Однак, якщо ми хочемо змінити порядок оцінки, слід використовувати дужки.
- Є 4 оператори, які неможливо перевантажити в C ++. Вони є:
::
(роздільна здатність).
(вибір члена).*
(виділення члена через покажчик на функцію)?:
(потрійний оператор)
Відвідайте ці сторінки, щоб дізнатись більше про:
- Як правильно перевантажити оператор приросту?
- Як перевантажити двійковий оператор - відняти комплексні числа?