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
Respuesta
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.
Entonces me imagino que el operador + = también tiene el mandato de ser miembro – Chubsdad
operador + = no está declarado implícitamente. – flodin
@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
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.
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
@Chubsdad, esa no es su pregunta, esa es otra pregunta, no dude en responderla, pero Charles (y otros) han respondido a esta pregunta. – Motti
@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
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.
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.
- 1. sobrecarga del operador C++
- 2. ¿Sobrecarga del operador?
- 3. Sobrecarga y sobrecarga del operador en Java
- 4. Scala: método \ sobrecarga del operador
- 5. Sobrecarga del operador en Clojure
- 6. Sobrecarga del operador en .NET
- 7. Sobrecarga del operador en Java
- 8. C++ sobrecarga del operador estático
- 9. Sobrecarga del operador en C++
- 10. Sobrecarga del operador de flujo
- 11. Sobrecarga del operador + en C++
- 12. operador [] = ¿sobrecarga?
- 13. Preguntas sobre la sobrecarga del operador
- 14. pregunta de sobrecarga del operador de rubí
- 15. C# Clase abstracta Sobrecarga del operador
- 16. Sobrecarga elegante del operador en D
- 17. ¿Sobrecarga del operador de tipografía global?
- 18. ¿Java soporta la sobrecarga del operador?
- 19. Sobrecarga del operador en plantillas de clase
- 20. Sobrecarga del operador posterior al incremento
- 21. Dart support operador sobrecarga
- 22. C++ operador == sobrecarga
- 23. Operador = sobrecarga en C++
- 24. Operador sobrecarga == versus Igual()
- 25. Sobrecarga + Operador con plantillas
- 26. F # (.. ..) operador uso/sobrecarga
- 27. Operador de comparación sobrecarga
- 28. C# en el operador-sobrecarga
- 29. operador con plantilla() sobrecarga C++
- 30. sobrecarga operador para deshacer referencias
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) –