2012-07-22 123 views
31

考慮下面的程序:爲什麼構造函數只被調用一次?

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

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

我得到的輸出:http://ideone.com/81XO6

Called 

爲什麼構造函數被調用一次,即使我們正在建設5個對象?
vector如何在編譯器內部處理?

+7

其他的由複製構造函數初始化。 – jxh 2012-07-22 06:31:25

+7

http://ideone.com/lHX5W – 2012-07-22 06:32:04

+1

@Benjamin Lindley:你應該在回答中寫下 – nico 2012-07-22 06:33:07

回答

39

你的課有兩個構造函數,你只能看其中的一個。 std::vector通過創建其元素它們來自原始您提供的元素。爲此,在您的示例中,類A的複製構造函數被調用5次。

您示例中的A的複製構造函數由編譯器隱式聲明和定義。如果你願意,你可以自己聲明和定義它。如果你從中打印出某些東西,你會看到它被稱爲至少5次。

+0

假設不調整大小,是5倍還是4倍?是否使用了原件? – Mysticial 2012-07-22 06:39:02

+3

@Mysticial:我不希望任何編譯器能夠直接使用原文。怎麼樣?這些元素存儲在一個動態內存塊中,該塊在創建原始元素後分配。所以,所有5個元素必須從原始複製。 – AnT 2012-07-22 06:41:30

+0

現在我想到了,你是對的,因爲它在錯誤的範圍內。 – Mysticial 2012-07-22 06:42:33

12

由於線

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

它被調用一次將調用構造和線變得 矢量v(5,X);

其中X是調用構造函數後構造的對象。

之後,使用複製構造函數。

嘗試增加

A(const &A); 

到類聲明驗證這一點。

相關問題