Некоторые различия между перегрузкой операторов как функций-членов и свободных функций в C++:
- Место объявления. 14 Чтобы перегрузить оператор как функцию-член, нужно объявить нестатическую функцию-член с именем operator@, где @ — символ(ы) оператора. 14 Для перегрузки оператора как свободную функцию необходимо объявить функцию с именем operator@. 14
- Параметры. 14 При перегрузке оператора как функцию-член, в случае унарного оператора функция не должна иметь параметров, а в случае бинарного — ровно один. 14 При перегрузке оператора как свободную функцию, в случае унарного оператора функция должна иметь один параметр, а в случае бинарного — два. 14
- Первый аргумент. 23 При перегрузке оператора как функцию-член, первым аргументом всегда идёт объект класса. 3 Для свободных функций можно выбирать произвольный тип первого операнда. 3
- Неявные преобразования. 1 Если оператор перегружен для некоторого класса X с использованием свободных функций, то этот оператор автоматически становится перегруженным для любого класса, имеющего неявное преобразование к X. 1 Для операторов, перегруженных как функция-член, это не всегда так. 1
- Виртуальное переопределение. 2 Виртуальная перегрузка будет выбираться динамическим типом первого операнда, что невозможно для свободных функций без дополнительного кода. 2
Среди операторов, которые можно перегружать двумя способами, унарные операторы и присваивающие версии бинарных операторов обычно перегружают как функцию-член, а оставшиеся бинарные операторы — как свободные функции. 1