2017-06-13 59 views
1

我的問題很簡單,一個類的構造函數不能與std::vector一起使用。用戶定義的類的構造函數不能與矢量工作

class my_class 
{ 
public: 
    my_class() { std::cout << "my_class constructed\n"; } 
}; 

int main() 
{ 
    std::vector <my_class> v; 
} 

程序沒有輸出任何東西,即使它應該輸出my_class constructed。那麼我認爲構造工程,爲vector的每一個元素,所以我這樣做:

class my_class 
{ 
public: 
    my_class() { std::cout << "my_class constructed"; } 
}; 

int main() 
{ 
    my_class object; 
    std::vector <my_class> v; 
    v.push_back(object); 
} 

此代碼輸出:

my_class constructed 

這種結構發生因my_class對象,使用push_back()不是因爲。

如何使構造函數適用於std::vector? 如果您需要更多的細節,我會很樂意提供。

+2

提示:同時也是複製構造函數的工具。 – Quentin

+1

神聖的三位一體,或者如果那不是你的事 - 三條規則。 – DeiDei

+1

@DeiDei或5的規則。 – erip

回答

1

您需要設置矢量的初始大小,例如通過std::vector <my_class> v(10)。 然後它實際上應該調用構造函數10次,因爲向量的元素被默認初始化。

在你的第二個例子中,當你有一個對象時,該對象可能被複制而不是「構造」。如果你實現了一個拷貝構造函數,你可以觀察此行爲:

class my_class 
{ 
public: 

    my_class(); 
    my_class(const my_class &m) { cout << "copy constructor called" << endl; }; 
}; 
my_class::my_class() 
{ 
    std::cout << "my_class constructed\n"; 
} 

int main() 
{ 
    my_class mc; 

    std::vector <my_class> v; 

    v.push_back(mc); 
    return 0; 
} 

輸出:

my_class constructed 
copy constructor called 
+0

因此,使用push_back()時不調用構造函數? –

+0

不一定;可以複製或移動對象,然後調用複製或移動構造函數;這就是@DeiDei提到三條規則的原因。 –

+0

@stance changer:參見改編的代碼來說明上述事情。 –

0

你構建一個空載體。爲什麼你會期望你的構造函數在這種情況下被調用?只有在實際將某些對象放入向量中之後纔會調用它。

此外,儀器複製構造函數和移動構造函數。

2

在你的第二種情況下,你正在構建一個對象並在向量中拷貝構造它。如果你想直接在矢量內部構建,我推薦使用emplace_back而不帶參數:

v.emplace_back(); 
+1

如果您想直接構建它而不是從臨時移動,請使用不帶參數的'emplace_back()'調用。 – Quentin

+0

@Quentin謝謝 – Amadeus

相關問題