【问题标题】:Is there a difference between these ways of initialising a C array in C++?这些在 C++ 中初始化 C 数组的方式有区别吗?
【发布时间】:2017-12-20 01:05:06
【问题描述】:

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

【问题讨论】:

  • 都是aggregate initialization的不同形式,最终效果相同。
  • 我喜欢this site 它几乎解释了initializers 的一切。
  • @lakeweb 谢谢。天啊,C++03 和 C++11 是不一样的,这些都是很微妙的东西。
  • @Zebrafish 与您的问题相关的唯一区别是 T list[4]{args, ...}; 即您在列表 4、5、6 中使用的括号初始化列表语法是在 C++11 中引入的。跨度>
  • @user2079303 有趣的大括号初始化列表语法,但不是初始化列表。这里有一些非常细微的差异。在等号之后,它们是聚合初始化或赋值,没有等号,它们的花括号初始化列表语法从 C++11 开始,但对于非 POD 类型,同样的事情会将括号中的内容转换为 std ::initializer_list,我想。

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


【解决方案1】:

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

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

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

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

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

std::initializer_list 不参与。

【讨论】:

    【解决方案2】:

    在 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。希望这能回答您的问题。

    【讨论】:

    • 我很确定 OP 非常了解容器。他的问题是关于特定语言结构之间的差异。
    • 哦,这是我的错。我只是通过阅读 I want to initialise all members of the array to zero 就得出了结论。
    猜你喜欢
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    相关资源
    最近更新 更多