6

我想将数组的所有成员初始化为零,或者nullptr

struct Window{ int a;};


int main()
{
    Window* list[4] = { 0, 0, 0, 0 };
    Window* list2[4] = {0};
    Window* list3[4] = {};
    Window* list4[4]{ 0, 0, 0, 0 };
    Window* list5[4]{0};
    Window* list6[4]{};
}

我知道当将至少一个成员初始化为任何值时,所有其他成员都初始化为零,所以如果我这样做:

int list[4] = { 6 };

第一个成员变为6,其余所有成员均为零初始化。但是我很困惑:

int list[4]{0};

int list[4]{};

我假设没有等号的声明之后的空波浪括号是所谓的零初始化,而不是默认初始化,但也是如此int list[4]{0},不是吗?这是否涉及std::initializer_list幕后?我以为这些只用于非 POD 类型,所以std::initializer_list这里没有使用吗?

4

2 回答 2

3

这些在 C++ 中初始化 C 数组的方式有区别吗?

不,它们在语义上是等价的。

零初始化,与默认初始化相反,但 int list[4]{0} 也是如此,不是吗?

第一个元素被复制初始化为零。其余元素是值初始化的,这int实际上是零初始化。在具体的情况下,值、零和复制初始化与零没有实际差异int。在这种情况下,区别是语法上的。

这是否涉及幕后的 std::initializer_list ?

std::initializer_list不涉及。

于 2017-12-20T01:43:27.430 回答
0

不要使用指针在 C++ 中存储数组,它太 C 风格了 :)

改用容器。我总是坚持vector为一般目的制作对象数组。向量的初始化将遵循类构造函数。让我Window稍微修改一下你的课程。

struct Window {
    // Class constructor
    Window(const int _a_) {
       a = _a_;
    }

    // Class member 
    int a;
};

std::vector<Window> windows (4, Window(0));

您的窗口将包含 4 Window,其零初始化值为a. 希望这能回答你的问题。

于 2017-12-20T01:55:20.743 回答