Урок №140. Перевантаження операторів через звичайні функції

  Юрій  | 

  Оновл. 16 Лют 2021  | 

 112

На попередньому уроці ми перевантажували operator+() через дружню функцію:

Використання дружньої функції для перевантаження оператора зручно тим, що ми маємо прямий доступ до всіх членів класу, з яким працюємо. У прикладі, наведеному вище, наша дружня функція перевантаження оператора + має прямий доступ до закритого члену m_dollars класу Dollars.

Однак, якщо нам не потрібен доступ до членів певного класу, ми можемо перевантажити оператор і через звичайну функцію. Зверніть увагу, в класі Dollars є геттер getDollars(), за допомогою якого ми можемо отримати доступ до m_dollars ззовні класу. Перепишемо перевантаження оператора + через звичайну функцію:

Оскільки принцип перевантаження операторів через звичайні і дружні функції майже ідентичний (вони просто мають різні рівні/умови доступу до закритих членів класу), то єдина відмінність полягає в тому, що у випадку з дружньою функцією, її потрібно обов’язково оголосити в класі + визначити поза тілом класу (або в класі), в той час як звичайну функцію досить просто визначити поза тілом класу, без вказівки додаткового прототипу функції.

Dollars.h:

Dollars.cpp:

main.cpp:

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

Правило: Використовуйте перевантаження операторів через звичайні функції, замість дружніх, якщо для цього не потрібне додавання додаткових функцій в клас.

Оцінити статтю:

1 Зірка2 Зірки3 Зірки4 Зірки5 Зірок (2 оцінок, середня: 5,00 з 5)
Loading...

Залишити відповідь

Ваш E-mail не буде опублікований. Обов'язкові поля відмічені *