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