出于某种原因,我有这个想法,C和C++的工作是这样的:初始化列表和C++
int foo[10] = {57};
for (int i=0; i<10; ++i)
assert (foo[i] == 57);
原来剩下的整数被初始化为0,而不是57.在哪里我得到这个想法?这是真的吗?结构初始化列表是否真的如此?数组和结构在分配给= {}和= {0}时整齐,正确地开始将自己初始化为0值的时候?除非明确告知,否则我一直认为他们会初始化为垃圾。
出于某种原因,我有这个想法,C和C++的工作是这样的:初始化列表和C++
int foo[10] = {57};
for (int i=0; i<10; ++i)
assert (foo[i] == 57);
原来剩下的整数被初始化为0,而不是57.在哪里我得到这个想法?这是真的吗?结构初始化列表是否真的如此?数组和结构在分配给= {}和= {0}时整齐,正确地开始将自己初始化为0值的时候?除非明确告知,否则我一直认为他们会初始化为垃圾。
只要初始化符存在,就一直这样。 C89说:
如果有比有一个 聚集的成员名单少初始化中,总的剩余部分将被初始化 隐含一样具有静态存储持续时间的对象。
我从来不知道静态持续时间基元也初始化为0。很有意思!谢谢! – cppguy
我从哪里得到这个想法?
这显然是一个比较常见的误解,因为我最近听到了许多其他人的同样的事情。也许你从其他人那里拿出了这个错误的想法,或者这个想法只是'直觉'。
{}
初始化的工作原理至少可以追溯到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
他们初始化为垃圾(未初始化)如果你不sp确定任何初始化。也就是'int foo [10];' – enobayram
Aside:如果你希望它们都是57,你可以(用C++):'int foo [10]; std :: fill(begin(foo),end(foo),57);' – chris
[C如何初始化一个数组](http://stackoverflow.com/questions/201101/how-to-initialize -an-array-in-c) –