2012-05-05 12 views
12

Duplicar posible:
How are C array members handled in copy control functions?C++: ¿cómo funciona la asignación de miembro?

Si no anulan los operator = de una clase, se utilizará la asignación miembro por miembro por defecto.

Pero, ¿qué significa?

struct A { 
    int array[100]; 
}; 
A a; 
A b=a; 

Ningún error. ¿Cómo funciona b frente a a 's array? Normalmente array_b = array_a no es válido.

Otra exampe:

struct A { 
    vector<int> vec; 
}; 
A a; 
A b=a; 

¿Cómo se hace frente b 's veca? A través de asignación (vec_b = vec_a), constructor (vec_b = vector<int>(vec_a)) u otra manera misteriosa?

+0

posible duplicado de http://stackoverflow.com/questions/4164279/how-are-c-array-members-handled-in-copy-control-functions – Invictus

Respuesta

9
A b=a; 

no es la asignación, que se llama como Copy Initialization.

Se llama al constructor de copia generado implícitamente para crear un nuevo objeto b del objeto existente a.
El constructor de copia generado implícitamente hace una copia del miembro array.

Para completar, voy a agregar aquí la cita estándar del duplicado marcado.

C++ 03 estándar: (objetos de clase copia) 12,8

Cada subobjeto se copia de la manera apropiada a su tipo:

  • si el subobjeto es de tipo de clase, se usa el constructor de copia para la clase;
  • si el subobjeto es una matriz, cada elemento se copia, de la manera apropiada para el tipo de elemento;
  • si el subobjeto es de tipo escalar, se utiliza el operador de asignación integrado.
+0

En general, sí. Sin embargo, ¿qué es una copia superficial de una matriz? –

+0

@KonradRudolph: en este caso, una 'memcpy'.La * copia superficial * se aplicaría a los punteros y esa es la razón de ** Rule of Three **. –

+0

No suena tan poco profundo. –

1

Si los miembros tienen constructores de copia, se invocan. Si no, el constructor de copia predeterminado hace el equivalente de memcpy. Ver Memberwise Assignment and Initialization.

En el caso de matrices sin puntero, se copia cada elemento.

Cuestiones relacionadas