2010-11-26 59 views
3

如果我宣佈使用默認構造函數的類,並初始化列表定義如下這個類的一個實例,將默認的構造函數被調用了這個定義?爲什麼被叫或未被叫?初始化程序列表是否抑制對構造函數的調用?

class Sample 
{ 
// this should be any aggregate type in c++ 
}; 

int main() 
{ 
    Sample s = {0}; 
    return 0; 
} 

回答

1

標準說($ 7.0/14)

初始化的語義如下。目標類型是被初始化的對象或引用的類型,源類型是初始化表達式的類型。當初始值設定項是大括號括起來的或者它是括號表達式的列表時,源類型沒有定義。

如果目標類型是(可能是cv-qualified)類的類型: - 如果類是聚合(8.5.1),並且初始化程序是括號括起來的列表,請參閱8.5.1。 。

8.5.1/13

[注:一個聚集陣列或聚合類可能包含一個類類型的成員具有用戶聲明的構造(12.1)。這些聚集對象的初始化在12.6.1中描述。 ]

另外12.6.1/2表示

當集合(類或數組是否)含有類類型的成員,並且通過大括號內的初始列表初始化(8.5.1) ,每個這樣的成員都被相應的賦值表達式複製初始化(見8.5)。如果在初始化列表比集合體的成員更少初始化器, 各構件不明確初始化應值初始化(8.5)。

1

在C++中可能只初始化POD(普通舊數據)= {0}(至少前的C++ 0x)。所以默認的構造函數將不會被調用,因爲它不會被編譯。

+0

事實並非如此。 POD比聚合更具限制性。例如,一個具有用戶聲明的析構函數的類可以使用大括號初始化器進行初始化。 – 2010-11-26 07:44:00

+1

只需備份@Charles,例如可以使用大括號來初始化`std :: string`的原始數組。 OP非常精確地說* aggregate *。這是神聖標準定義的術語:聚合體可以用花括號表示進行初始化。 – 2010-11-26 07:48:17

3

當你提供一種支架封閉初始化類的所有成員都是複製初始化從支架封閉初始化的相應表達。

這樣的初始化只適用於不能有用戶聲明的構造函數,因此編譯器生成的構造函數的抑制幾乎是學術聚集。

5
  • 在C++ 03,僅aggregate classes可以用大括號來初始化,並且聚集體類可以不具有用戶定義的構造
  • 在C++ 0X,該語法是通過支持對非聚合類型initializer lists,並調用適當的構造函數(取std::initializer_list
相關問題