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

Is there a difference between these ways of initialising a C array in C++?

本文关键字:之间 方式 有区别 数组 初始化      更新时间:2023-10-16

我想将数组的所有成员初始化为零,或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在这里不使用?

在C 中初始初始化C数组的方式之间有区别吗?

否。它们在语义上等效。

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

第一个元素是用零的副本化。其余元素是值初始化的,对于int来说,这确实是零初始化。在int的情况下,值得零的值,零和复制初始化没有有效的差异。在这种情况下,区别是句法。

这是否涉及std :: pinitializer_list在幕后?

std::initializer_list不涉及。

不要使用指针将数组存储在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。希望这个回答您的问题。