Зачем перегружать операторы, как свободные функции, а не функции-члены? C++
Собственно, читаю про перегрузку операторов и наткнулся на два способа перегрузки операторов:
- Как функция-член класса
- Как свободная функция
Так вот сам вопрос, зачем перегружать операторы как свободные функции? Ведь из свободной функции мы не можем получить доступ к приватным полям без геттеров, разве этот способ не менее эффективный, для чего он нужен и в каких случаях его использовать предпочтительнее, чем перегрузка как функции-члена?
Ответы (2 шт):
Ну, простейший пример. Допустим, некий класс, скажем, для больших чисел длинной арифметики Int.
Если определим оператор + для обычных чисел внутри класса, то
Int a;
Int b = a + 2;
будет работать. А
Int a;
Int b = 2 + a;
уже нет. Потому что первым аргументом при операторе-члене всегда идет объект класса. Так что вы просто не сможете написать оператор, в котором первым идет не объект класса.
А для свободного - можно написать и так, и эдак...
Одна из причин по которой для бинарных операторов свободные функции могут оказаться предпочтительными — это симметрия. Часто желательно, чтобы если корректным выражением является x@y, то корректным выражением было бы и y@x для любых допустимых типов. Для свободных функций мы можем выбирать произвольный тип первого операнда, когда как в случае функции-члена мы этого лишены.
Как говорит С. Мэейрс, лучше делать функцию свободную, чем дружественную, так как свободная обычная функция дает гарантию неприкосновенности к внутренним сокрытым данным.