2015-01-02 86 views
7

在下面的代碼,析構函數被調用兩次,而構造函數被調用一次:爲什麼析構函數調用的不止是構造函數?

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

代碼輸出:

hi c'tor2 
bye 
bye 

我發現類似question,其提到的複製構造函數,所以我添加了它們,但結果相同。取消註釋行//v.assign(1, VAL1);也不會改變任何內容。

+4

你想念複製構造函數'CFoo(const CFoo&)' – Jarod42

回答

9

]它被初始構造使用TFooCFoo之間的隱式轉換運算符,CFoo(TFoo f),然後使用該臨時對象將它傳遞給push_back使用默認複製構造來構造在容器中的物體或移動的構造,這取決於是否您正在使用C++ 11(不顯示任何內容)。然後臨時銷燬,最後是容器中的對象(容器本身)。

甚至可以看到它herehere(C++ 11)。

相關問題