Перевантаження операторів - operator c (відео), purecodecpp

Не будемо говорити про очевидне - перейдемо до розбору самої перевантаження. У рядку 15 ми бачимо прототип методу класу Overload. void operator + (char *); Метод цей змусить працювати оператор + так, як ми того захочемо (так як ми визначимо нижче). Щоб перевантажити будь-якої оператор потрібно використовувати ключове слово operator. У нашому випадку, метод не повертає значень тому void. далі ключове слово operator і сам оператор +. Приймає цей метод покажчик на рядок.

У головній функції у нас визначені у випадковому порядку 4 рядки. Відображаємо їх на екрані (рядки 39 - 42). Нижче, в рядку 44, оголошений об'єкт Joke. Під час його створення, конструктор класу. очистить елемент класу str від "сміття" і він буде готовий для запису рядків. Залишилося виконати прості дії (рядки 46 - 49) - використовуючи перевантажений + записати всі рядки в одну (str) в правильному порядку.

Перевантаження операторів - operator c (відео), purecodecpp

Все вийшло. Ще, як видно в результаті, для числових даних оператор + спрацював правильно. Тому можна спокійно застосовувати його для арифметичних операцій в коді - компілятор вас "зрозуміє". Ще один момент - перевантаження оператора діє тільки в межах того класу, для якого вона визначена. Якщо ми визначимо ще один клас (Overload2 наприклад) але не перевантажимо для нього оператор, то спроба використовувати + для запису рядка куди-небудь приведе до помилки.

Є ряд винятків в С ++ - не всі оператори можна перевантажити. Ось перелік:

Перевантаження операторів - operator c (відео), purecodecpp

І ще трохи теорії:

- перевантаження операторів не може змінити пріоритет і порядок виконання операцій;

- немає можливості, за допомогою перевантаження, створити нові символи для операцій;

- бінарні оператори не можуть бути використані для перевизначення унарною операції і навпаки - унарний оператор не перевизначити бінарну операцію.

Я планую в майбутньому написати ще одну статтю про перевантаження операторів, де на прикладах хочу показати як перевантажити ++ інкремент, - декремент, == рівність, = присвоювання new і delete. Хоч би не забути :)

Щоб підтримати наш сайт - натисніть на скарбничку і виберіть будь-який зручний спосіб.

>> Наприклад, коли якась агресивна дія доводиться повторювати в коді багато разів, і просто болісно постійно використовувати для цього спеціальні функції - можна перевантажити оператор для цього.

В цілому то вірно, але перевантаження - це шикарний спосіб вистрілити собі в ногу (і ще отстрелить що-небудь товаришеві). Дуже небезпечна штука. Вона може як підвищити читаність коду, так і все зіпсувати.

У Маєрс були правила на цю тему (якщо їх не дотримуватися - в пеклі вас змусять підтримувати свій код всі 7 кіл). наприклад:
- оператор присвоювання повинен повертати посилання на * this;
- в операторі присвоєння здійснюйте перевірку самопрісваіванія;
- є целийел про перевантаження new і delete, але ІМХО 99% смертних просто не потрібно чіпати ці оператори;
- оголошуйте функції, які не є членами, коли перетворення типів повинно бути застосовано до всіх параметрів.
Ну і ряд інших правил (в кількох книжках).
Пропоную приділити увагу останньому правилом зі списку. У вас описаний оператор, який спрацює для

Joke + str1;
Але не спрацює для
str1 + Joke;

Але було б здорово якщо оператор працював би в обидві сторони. Для цього досить зробити його не членом класу (звичайною функцією). Адже це зовсім не складно? )

Схожі статті