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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了这些在C ++中初始化C数组的方法有区别吗?相关的知识,希望对你有一定的参考价值。

我想初始化数组的所有成员为零,或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 :: initializer_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。希望这能回答你的问题。

以上是关于这些在C ++中初始化C数组的方法有区别吗?的主要内容,如果未能解决你的问题,请参考以下文章

C语言数组的初始化表示方法

c语言中字符串能否转为代码执行?或者有啥替代办法?

[C++11]统一的数据初始化方式 - 初始化列表

C如何在字符串数组中打印字符串的大小

Python元组与c语言的数组有啥区别吗

Python元组与c语言的数组有啥区别吗