2012-09-08 17 views
8

Quando si inizializza un vettore nel modo seguente:C++ Perché vettore di inizializzazione chiama il costruttore di copia

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

Si chiama il costruttore di default una volta e poi chiama il costruttore di copia un ulteriore 10 volte. Quindi, se ho capito bene, gli oggetti nel vettore sono tutti realizzati dal costruttore di copie.

Qualcuno può spiegare il motivo della chiamata del costruttore di copie e non di quello predefinito? O anche solo l'assegnazione della memoria senza gli oggetti?

+0

RE allocare memoria senza costruire oggetti: quindi non è possibile utilizzarlo. Anche l'operatore di assegnazione può richiedere qualcosa che i costruttori stabiliscono. Certo, solo prenotare potrebbe avere senso, ma avrebbe una semantica molto diversa. – delnan

+1

[My test] (http://liveworkspace.org/code/b831cffa5df38a6b12c8a637de815573) mostra il costruttore predefinito chiamato dieci volte. – chris

+1

Questo comportamento è cambiato in C++ 11, dove è possibile l'inizializzazione del valore di ogni membro. –

risposta

15

Assegna memoria senza oggetti, tranne che è stata specificata una dimensione iniziale di 10, quindi ha per creare 10 oggetti. Se si desidera che la memoria per 10 oggetti senza in realtà la creazione di loro, si può fare qualcosa di simile:

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

Se si guarda la firma del costruttore che si sta utilizzando è qualcosa di simile:

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

che ti permette di si passa un valore da utilizzare per riempire gli spot che gli si dice di creare. Se non si specifica un valore, ne crea uno (con il predefinito ctor) per passare al ctor e quindi ne fa una copia nel vettore stesso.

Non c'è vera domanda che potrebbe fare altre cose, ma che fornisce un ragionevole equilibrio tra la semplicità (non specificare un valore), la versatilità (specificare un valore, se si desidera), e la dimensione del codice (evitare la duplicazione l'intero ctor solo per default costruisce il contenuto).

+0

In realtà la firma è 'vector esplicito (size_type count)', quindi il valore predefinito "seed" viene creato all'interno. – Rost

+0

@Rost, dall'aspetto sembra che sia stato modificato in C++ 11. La domanda è tecnicamente un caso C++ 03, come ho scoperto un minuto fa. – chris

+1

Si tratta di C++ 03 vs C++ 11. In C++ 03, hai 'vector (size_t count, T const & value = T())' e in C++ 11, hai 'vector (size_t count)' e 'vector (conteggio size_t, T const & valore) '. Nota la differenza – Nawaz

Problemi correlati