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

时间:2017-12-20 01:05:06

标签: c++ c++11 initialization array-initialization

我想将数组的所有成员初始化为零,或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

2 个答案:

答案 0 :(得分:3)

  

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

没有。它们在语义上是等价的。

  

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

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

  

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

std::initializer_list没有参与。

答案 1 :(得分: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。希望这能回答你的问题。