为什么将 C++ 结构初始化为 `= {0}` 不会将其所有成员设置为 0?

2024-03-24

经过大量测试和编写之后这个答案是关于如何在 C++ 中将结构初始化为零 https://stackoverflow.com/questions/61240589/how-to-initialize-a-struct-to-0-in-c/61240590#61240590(注:反对票是before我完全重写了它),我不明白为什么= {0}不会将结构体的所有成员设置为零!

如果你这样做:

struct data_t
{
    int num1 = 100;
    int num2 = -100;
    int num3;
    int num4 = 150;
};

data_t d3 = {0};
printf("d3.num1 = %i\nd3.num2 = %i\nd3.num3 = %i\nd3.num4 = %i\n\n",
       d3.num1, d3.num2, d3.num3, d3.num4);

...输出是:

d3.num1 = 0
d3.num2 = -100
d3.num3 = 0
d3.num4 = 150

...虽然我expected输出如下:

d3.num1 = 0
d3.num2 = 0
d3.num3 = 0
d3.num4 = 0

...这意味着只有第一个成员设置为零,其余所有成员都设置为默认值。

我一直认为用这 3 种方式中的任何一种初始化结构都会对其进行零初始化,但显然我错了!

  1. data_t d{}
  2. data_t d = {}
  3. data_t d = {0}

我的主要收获这个答案 https://stackoverflow.com/questions/61240589/how-to-initialize-a-struct-to-0-in-c/61240590#61240590因此是这样的:

这里最大的收获是,这些都不是:data_t d{}, data_t d = {}, and data_t d = {0},实际上将结构体的所有成员设置为零!

  1. data_t d{}将所有值设置为结构中定义的默认值。
  2. data_t d = {}还将所有值设置为其默认值。
  3. And data_t d = {0}仅将 FIRST 值设置为零,并将所有其他值设置为其默认值。

那么,为什么不将 C++ 结构体初始化为= {0}将其所有成员设置为 0?

请注意,我上面的要点实际上与我多年来使用的看起来相当正式的文档相矛盾(https://en.cppreference.com/w/cpp/language/zero_initialization https://en.cppreference.com/w/cpp/language/zero_initialization),这表示T t = {} ; and T {} ;都是零初始化器,而事实上,根据我的测试和上面的结论,它们不是。

参考:

  1. C++中如何将结构体初始化为0 https://stackoverflow.com/questions/61240589/how-to-initialize-a-struct-to-0-in-c/61240590#61240590
  2. 更新:我也被指出了这个参考文献:初始化对象时,{0} 是什么意思? https://stackoverflow.com/questions/88957/what-does-0-mean-when-initializing-an-object

那么,为什么将 C++ 结构体初始化为 = {0} 时不将其所有成员设置为 0?

因为你只提供一个值,而班级有多个成员。

当你有T t{}; or T t = {}你正在做的事情叫做值初始化 https://en.cppreference.com/w/cpp/language/value_initialization。在值初始化中,如果对象/成员没有默认构造函数或默认成员初始值设定项,则编译器将回退到零以初始化对象/成员。所以与

data_t d{}

成员的值依次为 100, -100, 0 ,150 并且0 for num3发生这种情况是因为它没有默认值并且您没有在{}所以编译器回退到零初始化num3。这与data_t d = {}. With data_t d = {0}你提供了第一个元素,所以num1 is 0,但与前两个一样,所有其他成员如果有 1,则使用其默认值进行初始化;如果没有,则使用默认值初始化 0,从而为成员值提供 0、-100、0、150。

这是 C++11 发布并允许默认成员初始值设定项时发生的更改。


If your data_t被定义为

typedef struct
{
    int num1;
    int num2;
    int num3;
    int num4;
} data_t;

then data_t d{}, data_t d = {}, data_t d = {0}都会给你留下一个零初始化的类,因为没有默认的成员初始化器和你提供的唯一值大括号初始化列表(技术名称为{...}) 为零,因此所有成员都为零。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么将 C++ 结构初始化为 `= {0}` 不会将其所有成员设置为 0? 的相关文章

随机推荐