这些在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数组的方法有区别吗?的主要内容,如果未能解决你的问题,请参考以下文章