2012-09-08 14 views
8

Al inicializar un vector de la siguiente manera:C++ ¿Por qué vector de inicialización llama al constructor de copia

std::vector<MyClass> MyVec(10); 

Se llama al constructor por defecto una vez y luego llama al constructor de copia otros 10 veces más. Entonces, si lo entiendo correctamente, los objetos en el vector son todos hechos por el constructor de copia.

¿Alguien puede explicar el motivo de llamar al constructor de copia y no al predeterminado? ¿O simplemente asignando la memoria sin los objetos?

+0

RE asignando memoria sin construir el objeto: Entonces no puedes usarlo. Incluso el operador de asignación puede requerir algo que los constructores establezcan. Por supuesto, solo reservar podría tener sentido, pero tendría una semántica muy diferente. – delnan

+1

[Mi prueba] (http://liveworkspace.org/code/b831cffa5df38a6b12c8a637de815573) muestra el constructor predeterminado que se llama diez veces. – chris

+1

Este comportamiento ha cambiado en C++ 11, donde es posible la inicialización de valores de cada miembro. –

Respuesta

15

Asignará memoria sin objetos, excepto que ha especificado un tamaño inicial de 10, por lo que tiene para crear 10 objetos. Si desea memoria para 10 objetos sin tener que crearlas, se puede hacer algo como:

std::vector<MyClass> MyVec; 
MyVec.reserve(10); 

Si se mira la firma del constructor que está utilizando es algo así como:

vector(size_t num, T initial_value = T()); 

que nos deja pasa un valor para usar para llenar los espacios que le dice que cree. Si no especifica un valor, crea uno (con el ctor predeterminado) para pasar al ctor, y luego hace copias de eso en el vector mismo.

No hay verdadera pregunta que podría hacer otras cosas, pero que proporciona un equilibrio razonable entre la sencillez (no se especifica un valor), la versatilidad (especificar un valor si lo desea), y el tamaño del código (evitar la duplicación todo el código solo para construir los contenidos por defecto).

+0

En realidad, la firma es 'vector explícito (tamaño_tamaño)', por lo que se crea el valor predeterminado "inicial" dentro. – Rost

+0

@Rost, por apariencia, parece que se cambió a eso en C++ 11. La pregunta es técnicamente un caso C++ 03, como descubrí hace un minuto. – chris

+1

Es una cuestión de C++ 03 vs C++ 11. En C++ 03, tiene 'vector (tamaño_t cuenta, T const & valor = T())' y en C++ 11, tiene 'vector (tamaño_t cuenta)' y 'vector (tamaño_t cuenta, T const & valor) '. Observe la diferencia. – Nawaz

Cuestiones relacionadas