2012-07-22 17 views
31

Si consideri il seguente programma:Perché il costruttore viene chiamato una sola volta?

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

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

sto ottenendo l'output: http://ideone.com/81XO6

Called 

Perché il costruttore viene chiamato una sola volta, anche se stiamo costruendo 5 oggetti?
In che modo vector viene gestito internamente dal compilatore?

+7

Gli altri sono inizializzati dal costruttore di copie. – jxh

+7

http://ideone.com/lHX5W –

+1

@Benjamin Lindley: dovresti scrivere quello in una risposta – nico

risposta

39

La tua classe ha due costruttori e ne stai guardando solo uno. std::vector crea i suoi elementi tramite copia-costruzione dall'elemento originale fornito. A tale scopo, il copy-constructor della classe A viene chiamato 5 volte nel tuo esempio.

Il copy-constructor per A nell'esempio è dichiarato e definito implicitamente dal compilatore. Se lo desideri, puoi dichiararlo e definirlo da solo. Se si stampa qualcosa da esso, vedrete che è chiamato almeno 5 volte.

+0

Supponendo di non ridimensionare, sarebbe 5 volte o solo 4 volte? La copia originale è usata? – Mysticial

+3

@Mysticial: Non mi aspetto che nessun compilatore possa utilizzare direttamente l'originale. Come? Gli elementi sono memorizzati in un blocco di memoria dinamico, che viene assegnato * dopo * l'elemento originale è costruito. Quindi, tutti i 5 elementi devono essere copiati dall'originale. – AnT

+0

Ora che ci penso, hai ragione visto che è nella portata sbagliata. – Mysticial

12

Essa viene chiamata una volta poiché la linea

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

chiamerà il costruttore e la linea diventa vettore v (5, X);

dove X è l'oggetto costruito dopo aver chiamato il costruttore.

Successivamente viene utilizzato il costruttore di copie.

Prova ad aggiungere

A(const &A); 

Per la dichiarazione della classe per verificare questo.

Problemi correlati