2010-11-26 58 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
相关问题