这些在 C++ 中初始化 C 数组的方法有区别吗?
Is there a difference between these ways of initialising a C array in 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
?
Is there a difference between these ways of initialising a C array in C++?
没有。它们在语义上是等价的。
zero initialisation, as opposed to default initialisation, but so too is int list[4]{0}, isn't it?
第一个元素用零进行了复制初始化。其余元素是值初始化的,这对于 int
确实是零初始化。特别是在 int
的情况下,值、零和零复制初始化没有实际差异。在这种情况下,区别在于句法。
Does this involve an std::initializer_list behind the scenes or not?
std::initializer_list
不涉及
不要在 C++ 中使用指针存储数组,它太 C 风格了:)
改用容器。我总是坚持 vector
来制作用于一般用途的对象数组。向量的初始化将遵循 class 构造函数。让我稍微修改一下你的Window
class
struct Window {
// Class constructor
Window(const int _a_) {
a = _a_;
}
// Class member
int a;
};
std::vector<Window> windows (4, Window(0));
您的 windows 将包含 4 Window
,零初始化值为 a
。希望这能回答您的问题。
我想将数组的所有成员初始化为零,或者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
?
Is there a difference between these ways of initialising a C array in C++?
没有。它们在语义上是等价的。
zero initialisation, as opposed to default initialisation, but so too is int list[4]{0}, isn't it?
第一个元素用零进行了复制初始化。其余元素是值初始化的,这对于 int
确实是零初始化。特别是在 int
的情况下,值、零和零复制初始化没有实际差异。在这种情况下,区别在于句法。
Does this involve an std::initializer_list behind the scenes or not?
std::initializer_list
不涉及
不要在 C++ 中使用指针存储数组,它太 C 风格了:)
改用容器。我总是坚持 vector
来制作用于一般用途的对象数组。向量的初始化将遵循 class 构造函数。让我稍微修改一下你的Window
class
struct Window {
// Class constructor
Window(const int _a_) {
a = _a_;
}
// Class member
int a;
};
std::vector<Window> windows (4, Window(0));
您的 windows 将包含 4 Window
,零初始化值为 a
。希望这能回答您的问题。