Почему операторы иногда автономные, а иногда методы класса? - PullRequest
5 голосов
/ 07 декабря 2009

Почему иногда переопределение оператора определяется как метод в классе, например

MyClass& MyClass::operatorFoo(MyClass& other) { .... return this; };

и иногда это отдельная функция, например

MyClass& operatorFoo(MyClass& first, MyClass& bar)

Они эквивалентны? Какие правила действуют, когда вы делаете это одним способом, а когда вы делаете это другим?

Ответы [ 3 ]

10 голосов
/ 07 декабря 2009

Если вы хотите иметь возможность делать что-то вроде 3 + obj, вам нужно определить свободный (не член) оператор.

Если вы хотите сделать своих операторов защищенными или частными, вы должны сделать их методами.

Некоторые операторы не могут быть свободными функциями, например, operator->.

Здесь уже есть ответ:

разница между глобальным оператором и оператором-членом

5 голосов
/ 07 декабря 2009

Если у вас есть бинарный оператор, такой как +, вы обычно хотите, чтобы преобразования типов выполнялись для обоих операндов. Например, оператор конкатенации строк должен иметь возможность преобразовывать один или оба своих операнда из char * в строку. Если это так, то это не может быть функция-член, так как левый операнд будет * this и не будет выполнять преобразование.

например:.

operator+( a, b );  // conversions performed on a and b
a->operator+( b );  // conversion can only be performed on b
1 голос
/ 07 декабря 2009

Если оператор определен вне класса, он считается глобальным и позволяет отображать другие типы в левой части оператора.

Например, для класса Foo с глобальным оператором + вы можете сделать:

Foo f;
Foo f2 = 55 + f;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...