C ++结构初始化全部为零

时间:2016-10-09 01:45:55

标签: c++ struct initialization

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

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);  
  }

2 个答案:

答案 0 :(得分:8)

  

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

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

根据您的示例代码,struct s是一种聚合类型,然后执行aggregate initialization

(强调我的)

  

如果初始化程序子句的数量少于成员数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)按空列表,按照通常的list-initialization规则(对非类类型执行值初始化,使用默认构造函数执行非聚合类,以及聚合的聚合初始化)。 / p>

对于这种情况,结构i的成员xsvalue initialized为零。

  

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

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

修改

对于您添加的示例(结构scomplex),成员initial将为value initialized,最终效果取决于类型s。另一个成员是一个数组,它将是aggregate initialized的空列表,并且数组的所有元素都将被初始化值;与成员initial相同,效果取决于类型s

答案 1 :(得分:5)

问题

这会将所有成员初始化为0吗?

typedef struct s{
      int i;
      bool x;
 };

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

}

答案:是的。证明? Here 您可以看到它变为0。

更好的替代方案?

这是一个自以为是的部分。但是在我的意见(IMO)中,用{0}初始化它比{}更具可读性,因为它通知用户0.它实际上正在填充0。

s initial = {0};

这叫什么?

这被称为Aggregate Initialization,正如DieterLücking定义的那样,或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

what is aggregate initialization

What do the following phrases mean in C++: zero-, default- and value-initialization?

词汇表

汇总初始化

  

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

价值初始化

  

初始化值

     

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