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

Jus*_*ust 2 c++ struct initialization

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


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

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

 }
Run Code Online (Sandbox Code Playgroud)

编辑:参考复杂的结构,

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);  
  }
Run Code Online (Sandbox Code Playgroud)

son*_*yao 8

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

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

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

(强调我的)

如果初始化条款的数目小于成员的数量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)由空列表,按照通常的列表初始化规则(其执行值初始化用于非类类型和具有默认构造函数的非聚合类,以及聚合的聚合初始化).

对于这种情况,成员i和x结构s将值初始化为零.

4)否则,对象是零初始化的.

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

编辑

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


ama*_*el2 5

问题

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

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

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

}
Run Code Online (Sandbox Code Playgroud)

答:是的.证明?在这里你可以看到它变为0.

更好的替代品?

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

s initial = {0};
Run Code Online (Sandbox Code Playgroud)

这个叫什么?

这Aggregate Initialization就像DieterLücking所定义的那样,或者Value Initialization像宋元尧所说的那样.它基本上是一种初始化形式,您可以使用您想要的值初始化结构.例如,让我们用值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);
}
Run Code Online (Sandbox Code Playgroud)

你可以在这里看到这个.正如您在上面所看到的,我正在做的1,1是正常的初始化.与0初始化相反,您不能像使用0一样轻松地初始化结构的所有部分.

参考

cpprefrence

什么是聚合初始化

以下短语在C++中的含义是什么:零,默认和值初始化?

词汇表

聚合初始化:

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

价值初始化:

初始化值

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

  • 为什么给一个成员赋予价值更具可读性.通过你的逻辑`{1}`会通知用户它被填充为1. (3认同)
  • 我知道这是两年后的事了,但我认为应该说:编译程序并不能**证明**,即使它是预期行为的一个很好的指示。(只是因为很多 C++ 行为可以是实现定义的,也可以根本不定义) (2认同)