C++结构体初始化 struct= {0}、struct={} 和 struct{}的区别

发布时间 2024-01-08 15:52:08作者: zhaotianff

C语言学了好多年,很多基础理论都不记得了。因为一直都是C#用得多。

后面我在学C++的时候,在初始化结构体时,都习惯了使用C++ 11里的 一致性初始化(Uniform Initialization) 

像下面这样

1 struct data
2   {
3      int num1 = 100;
4      int num2 = 200;
5   }

 

1 data d{};

 

最近在书上看到的写法是

1 data d = {0};

 

所以也想搞清楚这些初始化方法的区别是什么。

这里在stackoverflow上搜到一个高赞回答,做个笔记记录一下。

 

1、data d{} sets all values to their defaults defined in the struct.(将所有值设置为结构中定义的默认值)

 

2、data d = {} also sets all values to their defaults(将所有值设置为结构中定义的默认值)

 

3、 data d = {0} sets only the FIRST value to zero, and all other values to their defaults(将第一个值设置为0,其它值为结构中定义的默认值)

 

可以看到上面 3种常用的写法在初始化时并不能很好地进行清零操作。

所以在进行结构体初始化并清零时,推荐使用以下方法:

1、主动清零

 1  // C-style typedef'ed struct
 2  typedef struct
 3  {
 4      int num1 = 100;
 5      int num2 = -100;
 6      int num3;
 7      int num4 = 150;
 8  } data_t;
 9 
10  // EXPLICITLY set every value to what you want!
11  data_t d1 = {0, 0, 0, 0};
12  // OR (using gcc or C++20 only)
13  data_t d2 = {.num1 = 0, .num2 = 0, .num3 = 0, .num4 = 0};

 

2、使用 memset() 函数强制设置所有字节数据为0

1  data_t d3;
2  memset(&d3, 0, sizeof(d3));

 

3、声明结构体时,直接设置默认值为0

 1  // C-style typedef'ed struct
 2  typedef struct
 3  {
 4      int num1 = 0;
 5      int num2 = 0;
 6      int num3 = 0;
 7      int num4 = 0;
 8  } data_t;
 9 
10  // Set all values to their defaults, which are zero in
11  // this case
12  data_t d4 = {};
13  // OR
14  data_t d5{}; // same thing as above in C++
15 
16  // Set the FIRST value only to zero, and all the rest
17  // to their defaults, which are also zero in this case
18  data_t d6 = {0};

 

4、为结构体增加一个构造函数

 1  // 1. Using an initializer list
 2  struct data
 3  {
 4      int num1;
 5      int num2;
 6      int num3;
 7      int num4;
 8 
 9      data() : 
10          num1(0),
11          num2(0),
12          num3(0),
13          num4(0) {}
14  };
15 
16  data d7; // all values are zero
17 
18  // OR: 2. manually setting the values inside the constructor
19  struct data
20  {
21      int num1;
22      int num2;
23      int num3;
24      int num4;
25 
26      data()
27      {
28          num1 = 0;
29          num2 = 0;
30          num3 = 0;
31          num4 = 0;
32      }
33  };
34 
35  data d8; // all values are zero

 

5、当结构体没有定义默认值时,声明为static

 1  typedef struct
 2  {
 3      int num1;
 4      int num2;
 5      int num3;
 6      int num4;
 7  } data_t;
 8 
 9  // `static` forces a default initialization of zero for each
10  // value when no other default values are set
11  static data_t d9;

 

参考资料:

https://stackoverflow.com/questions/61240589/how-to-initialize-a-struct-to-0-in-c

https://en.cppreference.com/w/cpp/language/zero_initialization