Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+ООП_Навч_посібник.doc
Скачиваний:
7
Добавлен:
01.07.2025
Размер:
6.58 Mб
Скачать

14.1.3. Особливості реалізації механізму перевантаження операторів

Дія перевантаженого оператора стосовно класу, для якого він визначається, не обов'язково повинно мати відношення до стандартної дії цього оператора стосовно вбудованих С++-типів. Наприклад, оператори "<<" і ">>", що вживаються до об'єктів cout і cin, мають мало спільного з аналогічними операторами, що застосовуються до значень цілочисельного типу. Але для поліпшення структурованості та читабельності коду програми створюваний програмістом перевантажений оператор повинен за змогою відображати традиційне призначення того або іншого оператора. Наприклад, оператор додавання "+", перевантажений для класу kooClass, концептуально подібний до операції "+", визначеної для цілочисельних типів. Адже навряд чи є логіка у визначенні для класу, наприклад, оператора додавання "+", який за своєю дією більше нагадуватиме оператор ділення "/". Таким чином, основна ідея створення програмістом перевантажених операторів – наділити їх новими (потрібними для нього) можливостями, які, проте, пов'язані з їх первинним призначенням.

На перевантаження операторів накладається ряд обмежень. По-перше, не можна змінювати пріоритет оператора. По-друге, не можна змінювати кількість операндів, що приймаються оператором, хоча операторна функція могла б ігнорувати будь-який операнд. Нарешті, за винятком оператора виклику функції (про нього піде мова попереду), операторні функції не можуть мати аргументів за замовчуванням. Деякі оператори взагалі не можна перевантажувати:

:: .* ?

Оператор ".*" – це оператор спеціального призначення, який буде розглядатися нижче у цьому навчальному посібнику.

14.1.4. Значення порядку слідування операндів

Перевантажуючи бінарні оператори, потрібно пам'ятати, що у багатьох випадках порядок слідування операндів має значення. Наприклад, вираз А + B комутативний, а вираз А – В – ні1. Отже, реалізуючи перевантажені версії не комутативних операторів, потрібно пам'ятати, який операнд знаходиться зліва від символу операції, а який – праворуч від нього. Наприклад, у наведеному нижче коді програми продемонстровано перевантаження оператора ділення для класу kooClass:

// Перевантаження бінарного оператора ділення "/".

kooClass kooClass::operator-(kooClass op2)

{

kooClass tmp; // Створення тимчасового об'єкта

tmp.x = x / op2.x;

tmp.y = y / op2.y;

tmp.z = z / op2.z;

return tmp; // Повертає модифікований тимчасовий об'єкт

}

Необхідно пам'ятати! Саме лівий операнд викликає операторну функцію. Правий операнд передається в безпосередньому вигляді.

Ось чому для коректного виконання операції віднімання використовується саме такий порядок слідування операндів:

х / op2.х.

14.2. Перевантаження операторів з використанням функцій-не членів класу

Бінарні операторні функції, які не є членами класу, мають два параметри, а унарні (теж не члени) – один.

Перевантаження бінарних і унарних операторів для класу можна реалізувати і з використанням функції, які не є членами цього класу. Однак такі функції необхідно оголосити "друзями" класу. Як ми вже зазначали вище, функції-не члени (у тому числі і функції-"друзі") не мають покажчика this. Отже, якщо для перевантаження бінарного оператора використовується функція-"друг" класу, безпосередньо передаються обидва операнди. Якщо ж за допомогою функції-"друга" класу перевантажується унарний оператор, то операторній функції передається один операнд. З використанням функцій-не членів класу не можна перевантажувати такі оператори:

=, (), [], –>.