2010-11-16 15 views
8

Por qué el operador sobrecargado = mandato para ser una función miembro ($ 13.5.3), pero no un operador de asignación compuesta, p. operador + = ($ 13.5.2)? ¿Estoy pasando por alto algo aquí?Sobrecarga del operador

+0

posible duplicado de [¿Por qué la función de amigo no se puede utilizar para sobrecargar el operador de asignación?] (Http://stackoverflow.com/questions/3933637/why-friend-function-cant-bent-be-used-for-overloading- asignación-operador) –

Respuesta

2

Las secciones se hace referencia tiene esto que decir acerca de ocultar las implementaciones de la clase base de operator=

Debido a que un operador de asignación de copia operator= se declara implícitamente por una clase si no declarada por el usuario (12.8),

Esta también puede ser la respuesta a su pregunta, ya que el compilador necesita saber si debe generar un operator=, debe saber si se definió dicho operador, si fuera definido fuera de la clase el compilador no podría saber si fue definido en una unidad de traducción diferente

p. Ej. operadores

//a.h 
class A { }; // compiler thinks A::operator= should be implicitly defined 

//b.h 
#include "a.h" 
A& operator=(A& This, const A& other) { /*...*/ } // Oops it's explicitly defined 

compuestos, por el contrario, no se definen de manera implícita, por tanto, no hay razón para obligarlos a declararse como funciones miembro.

+0

Entonces me imagino que el operador + = también tiene el mandato de ser miembro – Chubsdad

+0

operador + = no está declarado implícitamente. – flodin

+0

@flodin: function call operaor, p. Ej. tiene el mandato de ser una función miembro. ¿Por qué? Incluso eso no está implícitamente declarado – Chubsdad

4

El compilador siempre proporciona una asignación de copia operator=, como miembro, si el usuario no define una. Creo que fue solo por simplicidad y para evitar ambigüedades inesperadas que se hizo un requisito que operator= no se puede definir como una función libre.

Los operadores de conversión se encargan del caso cuando se desea asignar desde un tipo definido por el usuario a un tipo incorporado.

+0

Así que mi pregunta ahora es por qué ciertos operadores tienen el mandato de estar sobrecargados como miembros, p. operador [], operador() mientras que otros no? – Chubsdad

+1

@Chubsdad, esa no es su pregunta, esa es otra pregunta, no dude en responderla, pero Charles (y otros) han respondido a esta pregunta. – Motti

+0

@Motti: No estoy seguro si esto le sucede o no, pero al menos me pasa a mí. Al discutir y compartir, surge mucha más claridad sobre lo que uno quiere – Chubsdad

1

Junto con los constructores por defecto y de copia, operator = también se trata especialmente en C++. Eso significa que, incluso si no declara uno, el compilador le proporcionará una implementación predeterminada. Pero las implementaciones predeterminadas no siempre son el comportamiento que se adapta a las necesidades de su clase, es por eso que debe declararlas explícitamente (u ocultarlas, asignando visibilidad privada).

¿Y por qué el constructor predeterminado, el constructor de copias y el operador de asignación son tan especiales? Debido a que están involucrados en la inicialización de variable estándar y el paso de parámetros: cuando pasa un parámetro de clase a una función por valor (no por referencia o puntero), estas operaciones se llaman para copiar su contenido a la pila.

1

Según lo declarado por Charles, el compilador siempre proporciona una asignación de copia operator= si el usuario no define una. Esta función de miembro proporcionada por el compilador siempre tendrá prioridad sobre una función que no es miembro, por lo que incluso si pudiera definirla como una función no miembro, no se invocaría.