2012-09-16 29 views
2

我有以下代碼[這是一個面試問題]:C++默認情況下,複製和推廣的構造

#include <iostream> 
#include <vector> 

using namespace std; 

class A{ 
public: 
    A(){ 
     cout << endl << "base default"; 
    } 
    A(const A& a){ 
     cout << endl << "base copy ctor"; 
    } 
    A(int) { 
     cout << endl << "base promotion ctor"; 
    } 
}; 

class B : public A{ 
public: 
    B(){ 
     cout << endl << "derived default"; 
    } 
    B(const B& b){ 
     cout << endl << "derived copy ctor"; 
    } 
    B(int) { 
     cout << endl << "derived promotion ctor"; 
    } 
}; 

int main(){ 

    vector<A> cont; 
    cont.push_back(A(1)); 
    cont.push_back(B(1)); 
    cont.push_back(A(2)); 

     return 0; 
    } 

輸出是:

base promotion ctor 
base copy ctor 
base default 
derived promotion ctor 
base copy ctor 
base copy ctor 
base promotion ctor 
base copy ctor 
base copy ctor 
base copy ctor 

我無法理解這種輸出,特別是爲什麼基本默認被調用一次,最後3個拷貝ctor。有人可以解釋這個輸出嗎?

謝謝。

+0

請回複評論或提出新問題。這是一個新問題,不是嗎? –

+0

是的,編輯是一個單獨的問題;我曾嘗試保留()。 – Jake

+0

他們的確切順序 - http://ideone.com/TUEGo –

回答

4

基礎默認構造函數從線

cont.push_back(B(1)); 

你所有的B構造函數調用默認的構造函數A調用一次。最後兩個拷貝構造函數是由於向量重新分配。例如,如果你的push_back年代以前添加

cont.reserve(3); 

,他們會自行消失。

之前的那個是您最後的push_back中臨時A(2)的副本。

+0

除了具有足夠大的矢量以便不調整大小外,還要注意:如果您在優化開啓的情況下進行編譯,那麼隨着編譯器優化它們,幾個拷貝構造函數會消失。 –

+0

爲何A(2)的push_back具有序列:基本副本構造函數 基地振興構造函數,基地拷貝構造函數,而A(1)的push_back只是有:基地振興構造函數,基地拷貝構造函數 – Jake

+0

@Jake你訂? –