用全零初始化c++结构

C++ structure initialization with all zeros

本文关键字:c++ 结构 初始化      更新时间:2023-10-16

在c++中,如果我以"={}"的形式初始化结构,如下例所示,它是否确保将值赋给结构的所有成员为0 ?我明白这似乎是重复的问题,但我的问题是,如果它对所有成员初始化为0,它是否也适用于复杂结构?就像结构中的结构一样,或者每个成员都必须在代码中显式地赋值为0 ?


typedef struct s{
      int i;
      bool x;
 };
  int main ()
 {
     s initial = {};
     printf("%d %d", initial.i, initial.x);
 }

编辑:参考复杂结构,

typedef struct scomplex{
    s initial;
    s t[5];
 };
  int main (void)
  {
     scomplex sc = {};
     printf ("%d %d %d",sc.initial.i, sc.initial.x, sc.t[0].i);  
  }

但我的问题是,如果它初始化为所有成员0,它是否也适用于复杂结构?

是的,所有成员都将被初始化,包括"复杂"成员,但可能不会初始化为零,最终效果由其类型决定。

根据您的示例代码,struct s是聚合类型,然后执行聚合初始化。

(强调我的)

如果初始化子句数少于and bases (since C++17)的成员数,或者初始化列表完全为空,则按照通常的列表初始化规则(对非类类型和非聚合类使用默认构造函数进行值初始化,对聚合类进行聚合初始化),用空列表初始化by their default initializers, if provided in the class definition, and otherwise (since C++14)剩余的and bases (since C++17)成员。

在这种情况下,s的成员ix将被初始化为0。

4)否则,对象为零初始化。

如果struct s有其他成员,它们将被空列表递归初始化(根据它们的类型进行值初始化或聚合初始化)。

编辑

对于添加的示例(struct scomplex),成员initial将被值初始化,最终效果取决于s的类型。另一个成员是一个数组,它将用空列表进行聚合初始化,并且数组的所有元素都将进行值初始化;与成员initial相同,效果取决于s的类型。

问题

是否将所有成员初始化为0?

typedef struct s{
      int i;
      bool x;
 };
int main ()
{
     s initial = {};
     printf("%d %d", initial.i, initial.x);
}

回答:是的。证明吗?这里你可以看到它变成了0

其它更好的选择吗?

这是一个固执己见的部分。但在我看来,用{0}初始化它会比{}更具可读性,因为它会通知用户0。它实际上被0填满了

s initial = {0};

这叫什么?

这被称为Aggregate Initialization,如Dieter lcking所定义的,或Value Initialization,如songyuanyao所指出的。它基本上是一种初始化形式,你可以用你想要的值初始化一个结构体。例如,让我们用值1而不是0来初始化它!你可以这样做:

// Example program
#include <stdio.h>
#include <iostream>

typedef struct s{
 int i;
 bool x;
};
    
int main ()
{
   s initial = {1,1};
   printf("%d %d", initial.i, initial.x);
}

您可以在这里看到编译后的 。正如您在上面看到的,我正在执行1,1,这是正常的初始化。与0初始化相反,您不能像使用0那样简单地初始化结构体的所有部分。

引用

cpprefrence

什么是聚合初始化

下列短语在c++中是什么意思:零初始化、默认初始化和值初始化?

词汇表

Aggregate Initialization:

聚合初始化是列表初始化的一种形式,用于初始化聚合。

<

值初始化/strong>:

初始化值

这是用空初始化式构造变量时执行的初始化。