这些在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
在这里不使用?
在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
。希望这个回答您的问题。
相关文章:
- 在c代码之间共享数据的最佳方式
- C++:这两种将数字写入矩阵的方式之间是否存在显着的速度差异?
- 将函数作为参数传递的两种方式之间的区别
- 如何在Qt WebChannel中以独立于平台的方式在HTML/Javascript和C++之间进行通信?
- 如何以包装的方式初始化布局,从而减少布局之间的空间
- C++配置之间切换的最佳方式
- 这些在C 中初始化C数组的方式之间有区别吗?
- Qt中数据类(模型)和视图/控制器类之间的数据通信的正确方式是什么
- 消除有符号和无符号整数表达式之间比较的优雅方式
- 实时在语言之间流水线传输或以其他方式传输数据
- 找到组合对之间共享元素的最佳方式
- 使用内存集函数的各种方式之间的区别
- 这将是在将函数分配给变量或一次又一次地调用函数之间使用函数结果的最佳方式
- 成员类之间的通信的正确方式是什么?
- iOS和Android之间共享代码的最佳方式
- 逗号(,)在条件部分中两个表达式之间的for循环中的工作方式
- JScript 和 Windows 服务之间的通信方式
- 在std::string和std::wstring之间转换的多平台方式
- 尝试在Qt中连接隐藏信号的两种方式之间做出决定
- RAII 在两个构造函数之间进行选择的方式