C和C ++中的初始化列表

时间:2012-08-28 16:59:50

标签: c++ c initializer-list

出于某种原因,我认为C和C ++的工作方式如下:

int foo[10] = {57};
for (int i=0; i<10; ++i)
    assert (foo[i] == 57);

原来剩下的整数被初始化为0而不是57.我从哪里得到这个想法?这一点是真的吗?结构初始化列表是否真的如此?当分配给= {}和= {0}时,数组和结构是否整齐且正确地开始将自己初始化为0值?除非另有说明,否则我一直认为他们会初始化为垃圾。

2 个答案:

答案 0 :(得分:10)

只要初始化程序存在,就一直都是这样。 C89说:

  

如果列表中的初始值设定项少于a的成员   总计,集合的其余部分应初始化   隐式地与具有静态存储持续时间的对象相同。

答案 1 :(得分:2)

  

我从哪里得到这个想法?

这显然是一种相对常见的误解,因为我最近听到了很多其他人的同样的话。也许你是从别人那里拿出来的,但这个想法可能只是“直观”。

{}初始化至少可以追溯到C89。我不知道它的工作方式不同,或者任何编译器都做过不同的工作。

初始化聚合类型(如数组)时的初始化列表:

  

如果列表中的initializer-clause少于聚合中的成员,则未显式初始化的每个成员都应从空的初始化列表(8.5.4)初始化。 - 聚合[dcl.init.aggr] 8.5.1p7

在C ++术语中,当您使用空初始化程序时,该对象是值初始化的。

  

值初始化 T类型的对象意味着:

     

- 如果T是(可能是cv限定的)类类型(第9条),带有   用户提供的构造函数(12.1),然后是T的默认构造函数   被调用(如果T无法访问,则初始化是错误的   默认构造函数);

     

- 如果T是一个(可能是cv限定的)非联合类类型而没有   用户提供的构造函数,然后该对象被零初始化,如果   T的隐式声明的默认构造函数是非平凡的   构造函数被调用。

     

- 如果T是数组类型,则每个元素都是值初始化的;

     

- 否则,该对象为零初始化。

     

- 初始化程序[dcl.init] 8.5p7