Урок 132. Перегрузка операторов через обычные функции

   ⁄ 

 Обновлено 6 Апр 2018  ⁄ 

⁄   843

В предыдущем уроке мы перегружали operator+ через дружественную функцию:

Использование дружественной функции для перегрузки оператора удобно тем, что мы имеем прямой доступ ко всем членам класса, с которым работаем. В примере выше, наша дружественная функция перегрузки оператора + имеет прямой доступ к закрытому члену m_dollars класса Dollars.

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

Поскольку принцип перегрузки операторов через обычные и дружественные функции почти идентичен (они просто имеют разные уровни/условия доступа к закрытым членам класса), то единственное отличие заключается в том, что в случае с дружественной функцией, её нужно обязательно объявить в классе + еще определить вне класса (или в классе), в то время как обычную функцию достаточно просто определить вне класса, без указания дополнительного прототипа функции.

Dollars.h:

Dollars.cpp:

main.cpp:

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

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

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (12 оценок, среднее: 4,92 из 5)
Загрузка...
Подписаться на обновления:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

ПОДПИСЫВАЙТЕСЬ

НА КАНАЛ RAVESLI В TELEGRAM

@ravesli

ПОДПИСАТЬСЯ БЕСПЛАТНО