gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:02:57 26 4
gpt4 key购买 nike

经过大量的测试和写作this answer (注意:在我完全重写之前对它的反对票),我不明白为什么 = {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 成员被设置为零,其余的都被设置为默认值。

我一直认为以这 3 种方式中的任何一种初始化结构都会将其初始化为零,但显然我错了!
  • data_t d{}
  • data_t d = {}
  • data_t d = {0}

  • 我的主要收获 this answer因此是这样的:

    The big take-away here is that NONE of these: data_t d{}, data_t d = {}, and data_t d = {0}, actually set all members of a struct to zero!

    1. data_t d{} sets all values to their defaults defined in the struct.
    2. data_t d = {} also sets all values to their defaults.
    3. And data_t d = {0} sets only the FIRST value to zero, and all other values to their defaults.


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

    请注意,我上面的关键要点实际上与我多年来一直使用的看起来相当官方的文档( https://en.cppreference.com/w/cpp/language/zero_initialization )相矛盾,它说 T t = {} ;T {} ;都是零初始值设定项,实际上,根据我的测试和上面的总结,它们不是。

    引用:
  • How to initialize a struct to 0 in C++
  • 更新:我也刚刚被指向这个引用:What does {0} mean when initializing an object?
  • 最佳答案

    So, why doesn't initializing a C++ struct to = {0} set all of its members to 0?



    因为您只提供一个值,而该类有多个成员。

    当您有 T t{};T t = {}你在做什么叫做 value initialization .在值初始化中,如果对象/成员没有默认构造函数或默认成员初始值设定项,则编译器将回退到零初始化对象/成员。所以与
    data_t d{}

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

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

    如果您的 data_t被定义为
    typedef struct
    {
    int num1;
    int num2;
    int num3;
    int num4;
    } data_t;

    然后 data_t d{} , data_t d = {} , data_t d = {0}由于没有默认成员初始值设定项,并且您在支撑初始化列表( {...} 的技术名称)中提供的唯一值为零,因此所有成员都为零,因此所有初始化类都将留给您。

    关于c++ - 为什么不将 C++ 结构初始化为 `= {0}` 将其所有成员设置为 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61531928/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com