c ++ c样式零初始化{0}

时间:2020-01-25 20:53:37

标签: c++ c arrays

https://en.cppreference.com/w/cpp/language/zero_initialization显示在以下情况下发生零初始化:

int array[32] = {};

;但是从不说任何事情:

int array[32] = { 0 };

后者会在c ++中还是仅对第一个元素进行零初始化?如果是这样,那么结构也适用吗?

4 个答案:

答案 0 :(得分:6)

ISO / IEC N489 §9.4.1状态

  • (5)对于非联盟聚合,不是显式初始化的元素的每个元素都按如下方式初始化:

    • (5.1)如果元素具有默认成员初始化程序(11.4),则从该初始化程序初始化该元素。

    • (5.2)否则,如果该元素不是引用,则从一个空的初始值设定项列表(9.4.4)中复制该元素。

    • (5.3)否则,程序格式错误。

§9.4.4状态

  • (3.11)否则,如果初始化列表中没有元素,则该对象将被值初始化。
标量的

值初始化导致其零初始化。因此,第二个元素仅用array[0]显式初始化为0,其余元素将被初始化为零。


因此,以下代码

int array[4] = {13};

用值初始化array

{13, 0, 0, 0}

答案 1 :(得分:3)

后者会在c ++中还是仅对第一个元素进行零初始化?

是的

第一种样式是C ++样式。

第二个是旧的C风格。

两个都初始化整个数组元素(而不仅仅是第一个元素)。

如果是这样,结构也适用吗?

是的

答案 2 :(得分:1)

...但是从不说任何事情

是的。这实际上是aggregate initialization

根据cppreference:

如果初始化程序子句的数量少于成员和基数的数量,或者初始化器列表完全为空,则剩余的成员和基数将由其默认成员初始化器初始化(如果在类中提供)定义,,否则为空列表,这取决于通常的列表初始化规则(该规则使用默认构造函数对非类类型和非聚合类执行值初始化,并对聚合进行聚合初始化) 。如果引用类型的成员是这些其余成员之一,则该程序格式不正确。

这可确保使用空列表初始化数组的其余元素。对于int(标量),将其初始化为零。对于结构体,如果该结构体不是集合,则将执行值初始化;否则,将执行集合初始化。

答案 3 :(得分:1)

使用CppInsights查看实际发生的情况:

此:

int main()
{
    int array0[5];
    int array1[5] = {};
    int array2[5] = { 0 };
    int array3[5] = { -1 };
    int array4[5] = { 1, 2 };
}

等效于:

int main()
{
  int array0[5];
  int array1[5] = {0, 0, 0, 0, 0};
  int array2[5] = {0, 0, 0, 0, 0};
  int array3[5] = {-1, 0, 0, 0, 0};
  int array4[5] = {1, 2, 0, 0, 0};
}

因此,int array2[5] = { v }v显式初始化第一个元素,默认情况下初始化所有其他元素。

相关问题