【发布时间】:2020-08-15 07:40:41
【问题描述】:
在进行了大量的测试和编写this answer on how to initialize a struct to zero in C++ 之后(注意:对它的否决是在我完全重写它之前),我不明白为什么= {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
...虽然我预计输出是这样的:
d3.num1 = 0
d3.num2 = 0
d3.num3 = 0
d3.num4 = 0
...这意味着只有 FIRST 成员设置为零,其余的都设置为默认值。
我一直认为以这三种方式中的任何一种初始化结构都会对其进行零初始化,但显然我错了!
data_t d{}data_t d = {}data_t d = {0}
因此,我从this answer 得到的主要收获是:
这里最大的收获是:
data_t d{}、data_t d = {}和data_t d = {0},实际上将结构的所有成员都设置为零!
data_t d{}将所有值设置为结构中定义的默认值。data_t d = {}还将所有值设置为默认值。- 而
data_t d = {0}仅将 FIRST 值设置为零,而将所有其他值设置为其默认值。
那么,为什么不将 C++ 结构初始化为 = {0} 将其所有成员设置为 0?
请注意,我上面的关键要点实际上与我多年来一直使用的这个看起来相当官方的文档 (https://en.cppreference.com/w/cpp/language/zero_initialization) 相矛盾,它说 T t = {} ; 和 T {} ; 都是零初始化器,而事实上,根据我上面的测试和外卖,它们不是。
参考资料:
【问题讨论】:
-
为什么要这样?您只给出一个值,而不是所有属性的值。
-
这是一个问题还是一个带有答案的问题?你应该把答案分成下面的答案部分。
-
@tadman:问题的后半部分陈述了what显然发生了。它没有回答所提出的问题,为什么。
-
你的 typedef 是多余的,c++ 中的所有类和结构都是类型
-
高级开发人员在 C 和 C++11 之前是正确的。自 C++11 起,规则略有改变以适应默认成员初始化器。
标签: c++ struct initialization zero-initialization