Перевантаження оператора C ++ (з прикладами)

У цьому підручнику ми дізнаємося про перевантаження операторів на прикладах.

У 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 ++

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

Відвідайте ці сторінки, щоб дізнатись більше про:

  • Як правильно перевантажити оператор приросту?
  • Як перевантажити двійковий оператор - відняти комплексні числа?

Цікаві статті...