2012-04-02 10 views
5

¿Podría alguien explicarme la diferencia entre copiar y asignar?copia y asignación

SomeClass a; 
SomeClass b = a; // assignment 
SomeClass c(a); // assignment 
b = c; // copying 

pero ¿cuál es la diferencia, por qué hay dos construcciones diferentes en el idioma?

+1

Lo que llamas "cesión" se llama en realidad "inicialización", y lo que se llama "copia" se llama "asignación". – Philipp

+4

'SomeClass a();' - Esa es una declaración de función. –

+0

Posible duplicado: http://stackoverflow.com/questions/5368258/the-copy-constructor-and-assignment-operator –

Respuesta

1

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

2

Ésta es la inicialización (pero llama al constructor de copia):

SomeClass b = a; 

Así es la siguiente:

SomeClass c(a); 

Esta es la asignación:

b = c; 

Ah, y este isn't an initialization :

SomeClass a(); 
+0

diferencia - la asignación funciona en el objeto 'ya creado' mientras copia en el objeto recién construido que no existía antes. –

1

Las inicializaciones inicializan un objeto previamente no inicializado. Las asignaciones, por otro lado, sobrescriben un objeto ya inicializado y pueden tener que destruir el estado existente. Estas son diferentes operaciones; aunque generalmente tienen el mismo resultado para el objeto en el LHS, no son semánticamente equivalentes.

3

La inicialización solo se produce una vez, cuando se crea el objeto. Si al copiar quiere decir llamar al constructor de copia, entonces la copia es una forma de inicialización. La asignación puede suceder cualquier cantidad de veces.

Ahora, a su ejemplo, todos los que están equivocados:

SomeClass a(); 

Esto declara un método llamado a el que no toma parámetros y devuelve un objeto SomeClass.

SomeClass b = a; // actually copy constructor & initialization of b 
SomeClass c(a); // same 

Si a eran un objeto SomeClass, estos dos habría de inicialización, y se llama al constructor de copia - SomeClass::SomeClass(const SomeClass&). Ellos son equivalentes.

b = c; // assignment 

Si c es un objeto SomeClass, este es asignación. Llama callse SomeClass::operator =(const SomeClass&).

Cuestiones relacionadas