14.6. Перевизначення операцій (резюме)
Створюючи новий тип даних. ми були змушені пояснити компілятору, як слід виконувати звичайні операції (додавання, віднімання, порівняння, введення / висновок і т.п.) з об'єктами нового типу. По суті справи, операції - це найпростіші функції, на вхід яких надходить один або два операнда, над ними виконується обумовлене дію і формується повертається значення. У цьому сенсі перевизначення операцій, практично, нічим не відрізняється від перевизначення функцій. У найзагальнішому вигляді операція переопределяется наступним чином:
Тут - позначення знака операції.
Єдина відмінність від перевизначення функції полягає в специфічному імені, що його замінює ім'я функції.
У зв'язку з тим, що повинна бути збережена логіка обробки компілятором арифметичних і логічних формул, процедур введення / виведення, операторів присвоювання, инкрементирования і декрементірованія, на перевизначення операцій накладаються три важливих обмеження:
- пріоритет операцій. описаний в стандарті мови C ++, міняти не можна;
- кількість операндів, яке спочатку було оголошено в мові, для кожної операції має бути збережено;
- не можна перевизначати операції '.' (Роздільник в складових іменах), '. *' (Звернення до полю об'єкта через покажчик), '::' (специфікатор приналежності), '?:' (Умовний вираз), '#' (директива препроцесора), '##' (операція конкатенації в препроцесорів).
При написанні процедури перевизначення двомісній операції треба пам'ятати, що аргумент a1. розташований лівіше знака операції. передається в функцію-член класу двома способами. По-перше, як поля об'єкта, оголошені в якості членів-даних класу. По-друге, як прихований покажчик this. Тому перший операнд операції як аргумент в функції перевизначення не вказується.
Ще одне обмеження на функцію перевизначення операції полягає в тому, що серед її параметрів не можна користуватися значеннями за замовчуванням.
Розглянемо варіанти перевизначення двомісних операцій на прикладі класу Tpoint. представляє точку з парою цілочисельних координат:
Операція складання, оголошена в наведеному вище прикладі, приймає другий доданок як значення. Тому опис нової процедури може виглядати наступним чином: