Разница между перегруженными операторами-членами и внешними функциями в C++ заключается в том, как определяется функция оператора. 1
Перегруженные операторы-члены определяются как нестатические функции-члены класса с именем operator@, где @ — символ(ы) оператора. 4 В случае перегрузки унарного оператора эта функция не должна иметь параметров, а в случае бинарного должна иметь ровно один параметр. 4
Внешние функции определяются как отдельные функции, которые не являются членами класса. 1 Количество параметров такой функции совпадает с количеством операндов оператора. 1 Например, у функции, которая представляет унарный оператор, будет один параметр, а у функции, которая представляет бинарный оператор, — два параметра. 1
Выбор между этими двумя подходами зависит от того, как оператор должен работать с объектами: если оператор модифицирует объект, то его стоит делать членом класса, а когда оператор выполняет действие с другим объектом и возвращает другой объект (или ничего не возвращает), то лучше написать его как независимую функцию. 3