初始化对象时,{0}意味着什么?
当{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);
}
没有它,上面的代码将在运行时崩溃。
这里发生的事情叫做聚合初始化。 以下是来自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
。
你可以在这里找到关于这个主题的完整规范
有一点需要注意的是,这种技术不会将填充字节设置为零。 例如:
struct foo
{
char c;
int i;
};
foo a = {0};
不一样:
foo a;
memset(&a,0,sizeof(a));
在第一种情况下,c和i之间的填充字节未初始化。 你为什么要在意? 那么,如果您将这些数据保存到磁盘或通过网络或其他方式发送,则可能存在安全问题。
请注意,一个空的聚合初始值设定项也适用:
SHELLEXECUTEINFO sexi = {};
char mytext[100] = {};
链接地址: http://www.djcxy.com/p/12523.html