2009-12-07 10 views
5

Perché è che a volte un override operatore è definito come un metodo nella classe, comePerché gli operatori a volte sono autonomi ea volte metodi di classe?

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

e, a volte si tratta di una funzione separata, come

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

Sono equivalente? Quali regole governano quando lo fai in un modo e quando lo fai l'altro?

+0

Sto votando per chiudere come un duplicato di http://stackoverflow.com/questions/1145022 (evidentemente la mia ricerca-fu non era buona) –

+0

possibile duplicato del [ differenza tra operatore globale e operatore membro] (http://stackoverflow.com/questions/1145022/difference-between-global-operator-and-member-operator) –

risposta

10

Se si vuole essere in grado di fare qualcosa di simile 3 + obj è necessario definire un libero (non membro) operatore.

Se si desidera rendere i propri operatori protetti o privati, è necessario renderli metodi.

Alcuni operatori non possono essere funzioni libere, ad es. operator->.

questo è già risposto qui:

difference between global operator and member operator

1

Se l'operatore è definito al di fuori di una classe è considerato globale e consente di visualizzare altri tipi sul lato sinistro dell'operatore.

Ad esempio, data una classe Foo, con un operatore globale + si potrebbe fare:

Foo f; 
Foo f2 = 55 + f; 
5

Se si dispone di un operatore binario come +, che normalmente vuole conversioni di tipo ad essere eseguite su entrambi gli operandi. Ad esempio, un operatore di concatenazione di stringhe deve essere in grado di convertire uno o entrambi i suoi operandi da un char * a una stringa. Se questo è il caso, allora non può essere una funzione membro, poiché l'operando di sinistra sarebbe * questo, e non avrebbe una conversione eseguita.

Esempio:

operator+(a, b); // conversions performed on a and b 
a->operator+(b); // conversion can only be performed on b 
Problemi correlati