2011-11-11 145 views
1

當我聲明一個數組時,將聲明所有變量/對象。但是,如果對象具有構造函數,那麼對象會發生什麼?我使用的類有2個構造函數 - 一個沒有參數,一個有幾個參數。聲明後第一個構造函數會激活嗎?或者沒有構造函數會激活?C++將具有構造函數的對象添加到數組

如果第一種情況發生,我將不得不做一個替換構造函數的函數。

那麼,新聲明的數組中的對象會發生什麼?

回答

8

這取決於你如何聲明數組。成員是要麼默認值,或複製初始化:

Foo x[] = { Foo(1), Foo(true, 'a'), Foo() }; // copy-initialize 
Foo x[3] = { };        // value-initialize 
Foo x[3];          // default-initialize 

對於類類型,默認 - 和值初始化調用默認構造函數。複製初始化可以直接調用適當的構造函數。

如果您不想使用默認構造函數,則不會使用括號初始值設定項並拼出每個成員。

+0

你的意思是Foo x [] = {** new ** Foo(1),...}? –

+0

@ThanhNguyen:這將需要一個'Foo(Foo *)'構造函數,並且如果該構造函數不刪除它的參數(這將是非常糟糕的樣式),會導致內存泄漏。 –

+0

@ThanhNguyen:不,我的意思是'Foo x [] = {Foo(1)};'。我也可以說'Foo x [] = {1};',但這有點不同 - 它需要一個參數的構造函數,並且還需要一個隱式拷貝構造函數。 C++ 11通過允許'Foo x [] = {{true,'a'}};'使得這個更靈活一點,儘管我們需要一個可訪問的隱式拷貝構造函數。 –

2

如果基礎類型有一個不平凡的默認構造函數,數組將調用所有對象的默認構造函數。

我完全不記得規則,但ints,char * s,結構的成員都有微不足道的構造函數等等,都有簡單的默認構造函數。除非明確這樣做,否則這些東西(以及這些東西的數組陣列等)數組將不會被初始化。

顯式聲明的默認構造函數絕不是微不足道的,因此數組中的Foo對象將被默認構造。

+0

我認爲你指的是最後一段基本類型的默認初始化,這確實會使變量未初始化。 –

+0

@KerrekSB:不,不只是基本類型。結構,聯合,結構數組的結構等都可以使用簡單的默認構造函數。 –

+0

是的,的確,這適用於這些事情的結構和數組遞歸遞歸! –

相關問題