La copia sirve para inicializar objetos nuevos al copiar los contenidos de los existentes, la asignación es para sobrescribir objetos existentes con los contenidos de otros objetos; los dos son cosas muy diferentes. En particular, este
SomeClass a;
SomeClass b = a;
es copia de inicialización - que está copiando a
para crear un nuevo SomeClass llama b
utilizando la sintaxis de la forma
T x = y;
Esto tiene el efecto de llamar a SomeClass
's constructor de copia (suponiendo que hay uno y está accesible). El constructor de copia predeterminado generado por el compilador haría una copia de memberwise de a
; puede reemplazarlo con el suyo según sea necesario, p.
SomeClass(const SomeClass& rhs)
: x(rhs.x)
{}
(Tenga en cuenta que este es un ejemplo muy aburrido, ya que sólo hace lo que el miembro por miembro por defecto copia puede constructor.)
Cambiando de tema, esta
SomeClass c(a);
es inicialización directa usando el constructor de copia. Será generalmente tienen el mismo efecto que el anterior, pero esto es digno de una lectura:
http://www.gotw.ca/gotw/036.htm
También, ver aquí:
http://www.gotw.ca/gotw/001.htm
Su último caso, a saber
b = c;
es asignación. La semántica de esto generalmente debe sobrescribir b
con los contenidos de c
(aunque algunas cosas, como std::auto_ptr
, tienen una semántica de asignación extraña, así que ten cuidado). Para implementar su propio operador de asignación, que escribir algo como esto (tenga en cuenta que este es un ejemplo muy aburrido, ya que sólo hace lo que pasara el operador de asignación miembro por miembro por defecto):
SomeClass& operator=(const SomeClass& rhs)
{
x = rhs.x;
return *this;
}
En la práctica, sin embargo, tiene que tenga cuidado con la seguridad de excepciones en situaciones como esta, lo que conduce a cosas como la popular expresión copiar y cambiar para implementar operadores de asignación. Ver aquí:
http://en.wikibooks.org/wiki/More_C++_Idioms/Copy-and-swap
Lo que llamas "cesión" se llama en realidad "inicialización", y lo que se llama "copia" se llama "asignación". – Philipp
'SomeClass a();' - Esa es una declaración de función. –
Posible duplicado: http://stackoverflow.com/questions/5368258/the-copy-constructor-and-assignment-operator –