初始化零数组

Yve*_*ust 53 c++ arrays initialization language-lawyer

众所周知,标量数组的缺少初始值设定值默认为零.

int A[5]; // Entries remain uninitialized
int B[5]= { 0 }; // All entries set to zero
Run Code Online (Sandbox Code Playgroud)

但是这(下面)保证了吗?

int C[5]= { }; // All entries set to zero
Run Code Online (Sandbox Code Playgroud)

Bat*_*eba 68

空支撑初始化执行数组的聚合初始化:这导致int元素的零初始化.

是的,这是有保证的.

  • @Holt它是否是类类型不会影响是否执行聚合初始化.所有数组初始化都是聚合初始化 此外,定义聚合初始化,使得没有初始化程序的成员进行值初始化(相当于零初始化,对于`int`) (2认同)

son*_*yao 35

是,根据该规则集合初始化,它保证(即数组的所有元素C值初始化,即零初始化0在这种情况下).

(强调我的)

如果初始化条款的数目小于成员的数量and bases (since C++17)初始化列表完全是空的,其余成员and bases (since C++17)都被初始化by their default initializers, if provided in the class definition, and otherwise (since C++14)由空列表,按照通常的列表初始化规则(其执行值初始化用于非类类型和具有默认构造函数的非聚合类,以及聚合的聚合初始化).


PS:

int A[5]; // Entries remain uninitialized
Run Code Online (Sandbox Code Playgroud)

"保持未初始化"可能并不准确.因为int A[5];,所有元素都A默认初始化.如果A是静态或线程局部对象,则元素将被零初始化0,否则不执行任何操作,它们将是不确定的值.


rai*_*in_ 11

事实上,当你说int A[5] = { 0 }; 你是在说:将第一个元素初始化为零。由于聚合初始化,所有其他位置都初始化为零。

这一行真正负责让你的数组充满零: int A[5] = { };

这就是为什么如果您使用,int A[5] = { 1 };您只会将第一个位置初始化为 1。