2012-06-09 8 views
9

Estaba leyendo the C++ FAQ. Allí me encontré con un punto en la guía para la sobrecarga de operadores utiliza:Importancia del operador de sobrecarga -() como función libre y no función de miembro?

Si proporciona operadores constructivos, deben permitir la promoción del operando de la izquierda (al menos en el caso en que la clase tiene un ctor de un solo parámetro eso no está marcado con la palabra clave explícita). Por ejemplo, si su clase Fraction admite la promoción de int a Fraction (a través del cóctel no explícito Fraction :: Fraction (int)), y si permite x - y para dos objetos Fraction, también debe permitir 42 - y. En la práctica, eso simplemente significa que su operador-() no debe ser una función miembro de Fraction. Normalmente lo harás amigo, aunque solo sea para forzarlo en público: parte de la clase, pero incluso si no es un amigo, no debería ser miembro.

¿Por qué el autor ha escrito que operator-() no debería ser función de miembro?

¿Cuáles son las malas consecuencias si hago operador-() como función miembro y cuáles son otras consecuencias?

+0

Tenga en cuenta que el título es incorrecto: 'operator()' no se puede implementar como una función libre. La mayoría de los operadores pueden, pero no todos. La cita se refiere a 'operador-', no 'operador()' –

+0

posible duplicado de [¿Debería el operador << ser implementado como un amigo o como una función miembro?] (Http://stackoverflow.com/questions/236801/should -operador-ser-implementado-como-un-amigo-o-como-un-miembro-función) –

Respuesta

16

Aquí es Fraction con el operador como una función miembro:

class Fraction 
{ 
    Fraction(int){...} 

    Fraction operator -(Fraction const& right) const { ... } 
}; 

Con él, se trata de un código válido:

Fraction x; 
Fraction y = x - 42; 

y su equivalente a x.operator-(Fraction(42)); pero esto no es:

Fraction z = 42 - x; 

Debido 42 no tiene ninguna función miembro de operator - en ella (por supuesto, no es ni siquiera una clase).

Sin embargo, si declara que su operador es una función gratuita, las operaciones de conversión se aplican a ambos argumentos. Por lo que este

Fraction z = 42 - x; 

se convierte en este

Fraction z = Fraction(42) - x; 

lo que equivale a operator-(Fraction(42), x).

+0

... ¿puedes por favor elaborar el significado de la función libre aquí? ¿Quieres decir amigo función? –

+0

@Abhishek Gupta: No, quise decir _free function_. Una _free function_ es una función en un ámbito de espacio de nombres, que es lo contrario de una _miembro function_. –

+0

También dígame, ¿cuál es el significado de los operadores constructivos? –

Cuestiones relacionadas