2012-07-22 16 views
31

Considere el siguiente programa:¿Por qué se llama al constructor una sola vez?

class A 
{ 
    public: 
    A(int i) 
    { 
      cout<<"Called"<<endl; 
    } 
}; 

int main() 
{ 
    vector<A> v(5,A(1)); 
    return 0; 
}  

estoy recibiendo la salida: http://ideone.com/81XO6

Called 

Por qué el constructor se llama una sola vez, incluso si estamos construyendo 5 objetos?
¿Cómo se administra internamente el compilador vector?

+7

Los demás son inicializados por el constructor de copia. – jxh

+7

http://ideone.com/lHX5W –

+1

@Benjamin Lindley: debe escribir eso en una respuesta – nico

Respuesta

39

Su clase tiene dos constructores y está viendo solo uno de ellos. std::vector crea sus elementos por copia-constructing del elemento original que ha proporcionado. Para ese propósito, el constructor de copia de la clase A se llama 5 veces en su ejemplo.

El compilador-constructor para A en su ejemplo está implícitamente declarado y definido por el compilador. Si lo desea, puede declararlo y definirlo usted mismo. Si imprime algo de él, verá que se llama al menos 5 veces.

+0

Suponiendo que no hay que redimensionar, ¿sería 5 veces o solo 4 veces? ¿Se usa la copia original? – Mysticial

+3

@Mysticial: no espero que ningún compilador pueda usar el original directamente. ¿Cómo? Los elementos se almacenan en un bloque de memoria dinámica, que se asigna * después * de que se construye el elemento original. Entonces, los 5 elementos tienen que ser copiados del original. – AnT

+0

Ahora que lo pienso, tienes razón, ya que está en el ámbito equivocado. – Mysticial

12

Se pone llama una vez desde la línea

vector<A> v(5,A(1)); 

llamará al constructor y la línea se convierte vector v (5, X);

donde X es el objeto construido después de llamar al constructor.

Después de eso se usa el constructor de copia.

Trate de añadir

A(const &A); 

Para la declaración de clase para verificar esto.

Cuestiones relacionadas