小编典典

初始化对象时 {0} 是什么意思?

all

什么时候{0}用来初始化一个对象,是什么意思?我在任何地方都找不到任何引用{0},并且由于花括号,Google 搜索没有帮助。

示例代码:

SHELLEXECUTEINFO sexi = {0}; // what does this do?
sexi.cbSize = sizeof(SHELLEXECUTEINFO);
sexi.hwnd = NULL;
sexi.fMask = SEE_MASK_NOCLOSEPROCESS;
sexi.lpFile = lpFile.c_str();
sexi.lpParameters = args;
sexi.nShow = nShow;

if(ShellExecuteEx(&sexi))
{
    DWORD wait = WaitForSingleObject(sexi.hProcess, INFINITE);
    if(wait == WAIT_OBJECT_0)
        GetExitCodeProcess(sexi.hProcess, &returnCode);
}

没有它,上面的代码将在运行时崩溃。


阅读 283

收藏
2022-05-18

共1个答案

小编典典

这里发生的事情称为 聚合 初始化。这是 ISO 规范第 8.5.1 节中聚合的(缩写)定义:

聚合是没有用户声明的构造函数、没有私有或受保护的非静态数据成员、没有基类和虚函数的数组或类。

现在,{0}像这样初始化一个聚合基本上是0整个事情的一个技巧。这是因为在使用聚合初始化时, 您不必指定所有成员
,并且规范要求默认初始化所有未指定的成员,这意味着设置0为简单类型。

以下是规范中的相关报价:

如果列表中的初始化器少于聚合中的成员,则每个未显式初始化的成员都应默认初始化。例子:

struct S { int a; char* b; int c; };
S ss = { 1, "asdf" };

ss.a使用、 和形式 的表达式的值进行初始化1,即 .ss.b``"asdf"``ss.c``int()``0

您可以在此处找到有关此主题的完整规范

2022-05-18