2015-01-02 5 views
7

Im folgenden Code wird der destructor zweimal aufgerufen, während der Konstruktor nur einmal aufgerufen wird:Warum heißt der Destruktor mehr als der Konstruktor?

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); 
} 

Die Code-Ausgänge:

hi c'tor2 
bye 
bye 

Ich fand eine ähnliches question, die erwähnte Kopierkonstruktoren, also habe ich sie hinzugefügt, aber mit dem gleichen Ergebnis. Das Uncommentment der Zeile //v.assign(1, VAL1); ändert ebenfalls nichts.

+4

fehlt der Kopierkonstruktor 'CFoo (const CFoo &)' – Jarod42

Antwort

9

Es wird zunächst mit dem impliziten Umwandlungsoperator zwischen TFoo und CFoo Konstruieren CFoo(TFoo f), und dann unter Verwendung dieses temporäres Objekt, um es push_back zu passieren das Objekt in dem Behälter unter Verwendung des Standard Copykonstruktor oder verschieben Konstruktor zu konstruieren, je nachdem, ob Sie verwenden C++ 11 (das nichts anzeigt). Dann wird das Provisorium zerstört und schließlich das Objekt im Container (mit dem Container selbst).

Sie können es here oder here (C++ 11) noch besser sehen.

Verwandte Themen