未初始化为0的对象数组

Fra*_*uss 1 c++ language-lawyer

我正在尝试使用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;
}
Run Code Online (Sandbox Code Playgroud)

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

Cur*_*hts 6

我认为您可能想在这里查看:https : //en.cppreference.com/w/cpp/language/aggregate_initialization

Vector v[4] = { Vector::zero() };
Run Code Online (Sandbox Code Playgroud)

您初始化第一个元素,其他三个元素通过调用未初始化数组的默认ctor初始化(默认ctor的主体为空)。

在数组声明的开头替换为

float s[4]{};
Run Code Online (Sandbox Code Playgroud)

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

要读取值初始化和零初始化之间的关系,请参阅https://en.cppreference.com/w/cpp/language/value_initialization

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