2015-01-02 14 views
7

Nel seguente codice, il distruttore è chiamato due volte, mentre il costruttore viene chiamato solo una volta:Perché il distruttore ha chiamato più del costruttore?

enum TFoo 
{ 
    VAL1, 
    VAL2 
}; 

class CFoo 
{ 

public: 
    TFoo mf; 

    CFoo() 
    { 
     cout<<"hi c'tor1\n"; 
     //mf = f; 
    } 
    CFoo(TFoo f) 
    { 
     cout<<"hi c'tor2\n"; 
     mf = f; 
    } 
    CFoo(TFoo &f) 
    { 
     cout<<"hi c'tor3\n"; 
     mf = f; 
    } 
    ~CFoo() 
    { 
     cout<<"bye\n"; 
    } 
}; 

int main() 
{ 
    vector<CFoo> v; 
    //v.assign(1, VAL1); 
    v.push_back(VAL1); 
} 

Le uscite di codice:

hi c'tor2 
bye 
bye 

ho trovato un simile question, che menzionato costruttori di copie, quindi li ho aggiunti, ma con lo stesso risultato. Anche il non commento della linea //v.assign(1, VAL1); non cambia nulla.

+4

manca il costruttore di copia 'CFoo (const CFoo &)' – Jarod42

risposta

9

Viene inizialmente costruendo usando l'operatore di conversione implicita tra TFoo e CFoo, CFoo(TFoo f), e quindi utilizzando quella oggetto temporaneo di passare a push_back per costruire l'oggetto nel contenitore utilizzando il costruttore di copia di default o spostare costruttore, a seconda che stai usando C++ 11 (che non sta visualizzando nulla). Quindi il temporaneo viene distrutto e infine l'oggetto nel contenitore (con il contenitore stesso).

È possibile vederlo here o here (C++ 11) ancora meglio.

Problemi correlati