gpt4 book ai didi

c++ - 未初始化为 0 的对象数组

转载 作者:行者123 更新时间:2023-11-30 00:43:07 26 4
gpt4 key购买 nike

我正在尝试像这样用 0 初始化对象数组(更复杂项目的简化代码):

#include <iostream>

struct Vector {
float s[4];
Vector() {}
static Vector zero() {
Vector v;
v.s[0] = 0;
v.s[1] = 0;
v.s[2] = 0;
v.s[3] = 0;
return v;
}
};

struct Test {
Vector v[4] = { Vector::zero() };
};


int main(int argc, char** argv)
{
Test t;
for (int i = 0; i < 4; i++) {
printf("%f %f %f %f\n", t.v[i].s[0], t.v[i].s[1], t.v[i].s[2], t.v[i].s[3]);
}
return 0;
}

此代码应打印全 0,但有时会打印不同的值。看起来只有数组的第一个元素被初始化了。但是如果我写 float x[4] = { 0 },那么数组 x 的所有元素都初始化为 0。有什么区别,我可以在 C++ 标准中的什么地方读到这种行为?

最佳答案

我想你可能想看看这里:https://en.cppreference.com/w/cpp/language/aggregate_initialization

Vector v[4] = { Vector::zero() };

您初始化第一个元素,其他 3 个通过调用不初始化数组的默认构造函数进行初始化(默认构造函数的主体为空)。

替换开头的数组声明
float s[4]{};

这将对数组进行值初始化,将其归零。然后您可以删除所有其他内容。

读取值初始化和零初始化的关系,请引用https://en.cppreference.com/w/cpp/language/value_initialization

此外,正如用户 Kenny Ostrom 在评论中指出的那样,您可能需要考虑使用 std::array,请记住您仍然需要对其进行值初始化,请参阅 Default initialization of std::array? 。最后,如注释中所述,对 x[4] 的访问是未定义的行为。

关于c++ - 未初始化为 0 的对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56726116/

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