2009-12-07 26 views
5

Dlaczego jest to, że czasami przesłanianie operator jest zdefiniowana jako metoda w klasie, jakDlaczego operatorzy czasami są samodzielni, a czasami są metodami klasy?

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

a czasami jest to odrębna funkcja, jak

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

są one równoważne? Jakie zasady rządzą, kiedy robisz to w jeden sposób, a kiedy robisz to drugi?

+0

mam głosu, aby zamknąć jako duplikat http://stackoverflow.com/questions/1145022 (Widocznie moje wyszukiwanie-fu nie był dobry) –

+0

możliwym duplikatu [ różnica między operatorem globalnym a operatorem członkowskim] (http://stackoverflow.com/questions/1145022/difference-between-global-operator-and-member-operator) –

Odpowiedz

10

Jeśli chcesz być w stanie zrobić coś takiego 3 + obj trzeba zdefiniować bezpłatne (non-member) operator.

Jeśli chcesz, aby twoi operatorzy byli chronieni lub prywatni, musisz zrobić z nich metody.

Niektóre operatory nie mogą być funkcjami bezpłatnymi, np. operator->.

to już odpowiedział tutaj:

difference between global operator and member operator

1

Jeśli operator jest zdefiniowany poza klasą, jest uważany za globalny i umożliwia wyświetlanie innych typów po lewej stronie operatora.

Na przykład, biorąc pod uwagę klasę Foo z operatorem globalnym + można zrobić:

Foo f; 
Foo f2 = 55 + f; 
5

Jeśli masz binarny operatora jak +, zwykle chcą typu konwersje mają być wykonywane na obu argumentów. Na przykład operator konkatenacji ciągów musi mieć możliwość przekonwertowania jednego lub obu argumentów operacji z znaku * na ciąg znaków. Jeśli tak jest, to nie może to być funkcja członkowska, ponieważ lewy operand będzie to * i nie będzie wykonywana konwersja.

Np

operator+(a, b); // conversions performed on a and b 
a->operator+(b); // conversion can only be performed on b 
Powiązane problemy