2012-08-28 164 views
3

出于某种原因,我有这个想法,C和C++的工作是这样的:初始化列表和C++

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

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

+0

他们初始化为垃圾(未初始化)如果你不sp确定任何初始化。也就是'int foo [10];' – enobayram

+0

Aside:如果你希望它们都是57,你可以(用C++):'int foo [10]; std :: fill(begin(foo),end(foo),57);' – chris

+0

[C如何初始化一个数组](http://stackoverflow.com/questions/201101/how-to-initialize -an-array-in-c) –

回答

10

只要初始化符存在,就一直这样。 C89说:

如果有比有一个 聚集的成员名单少初始化中,总的剩余部分将被初始化 隐含一样具有静态存储持续时间的对象。

+0

我从来不知道静态持续时间基元也初始化为0。很有意思!谢谢! – cppguy

2

我从哪里得到这个想法?

这显然是一个比较常见的误解,因为我最近听到了许多其他人的同样的事情。也许你从其他人那里拿出了这个错误的想法,或者这个想法只是'直觉'。

{}初始化的工作原理至少可以追溯到C89。我没有意识到它的工作方式不同,或者说有任何不同的编译器。

对于初始化列表初始化一个聚合类型(如阵列)时:如果有较少的初始化子句在列表以外还有在聚集构件,然后不明确初始化每个部件应是

从空初始化列表(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

+0

是的,我最近了解到这个关于模板的事实。不知道还有其他的情况。谢谢! – cppguy

+0

很酷的解释 – cnicutar