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

  Юрий  | 

  |

  Обновл. 25 Сен 2021  | 

 38983

 ǀ   3 

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

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

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

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

Dollars.h:

Dollars.cpp:

main.cpp:

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

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

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

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (242 оценок, среднее: 4,95 из 5)
Загрузка...

Комментариев: 3

  1. Алексей:

    Можно ведь и так:

    1. Виталий:

      Можно, но не нужно. В прошлом уроке про это писали, что перегрузка — это не метод класса, поэтому надо стараться выносить её реализацию за пределы класса.

  2. Илья:

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

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

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