我正在尝试用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() };
您初始化第一个元素,其余三个初始化为未初始化数组的默认ctor的调用(默认ctor的主体为空)。
在数组声明的开头替换为
float s[4]{};
这将对数组进行值初始化,将其清零。然后,您可以删除其他所有内容。
要读取值初始化和零初始化之间的关系,请参阅https://en.cppreference.com/w/cpp/language/value_initialization
此外,正如用户Kenny Ostrom在评论中指出的那样,您可能要考虑使用std::array
,同时要记住还需要对其进行值初始化,请参阅std :: array的默认初始化?。最后,如注释中所述,对x [4]的访问为未定义行为。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句