2009-12-07 17 views
5

¿Por qué es que a veces una anulación del operador se define como un método en la clase, como¿Por qué los operadores son a veces independientes y, a veces, métodos de clase?

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

ya veces es una función separada, como

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

¿Son equivalentes? ¿Qué reglas gobiernan cuando lo haces de una manera y cuando lo haces la otra?

+0

voy a votar a cerrar como un duplicado de http://stackoverflow.com/questions/1145022 (Evidentemente mi búsqueda-fu no era bueno) –

+0

posible duplicado de [ diferencia entre el operador global y el operador miembro] (http://stackoverflow.com/questions/1145022/difference-between-global-operator-and-member-operator) –

Respuesta

10

Si usted quiere ser capaz de hacer algo como 3 + obj tiene que definir un libre (no miembro) operador.

Si desea que sus operadores estén protegidos o sean privados, debe crearlos.

Algunos operadores no pueden ser funciones gratuitas, por ejemplo, operator->.

Esto ya ha sido respondida aquí:

difference between global operator and member operator

1

Si el operador se define fuera de una clase, se considera global y le permite tener otros tipos en el lado izquierdo del operador.

Por ejemplo, dada una clase Foo, con un operador global + que podría hacer:

Foo f; 
Foo f2 = 55 + f; 
5

Si usted tiene un operador binario como +, que normalmente quiere conversiones de tipos que se realizarán en los dos operandos. Por ejemplo, un operador de concatenación de cadenas necesita poder convertir uno o ambos de sus operandos de un char * a una cadena. Si ese es el caso, entonces no puede ser una función miembro, ya que el operando de la izquierda sería * this, y no se realizaría una conversión.

Ej:

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