未初始化为0的对象数组

弗兰克·巴斯

我正在尝试用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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章