WCHAR wszFoo[CONSTANT_BAR] = {0}; <-- "{0}" 的意思是什么?

4
WCHAR wszFoo[CONSTANT_BAR] = {0}; 

我从未在C++语言中看到过像{0}这样的东西。我不知道如何在网上搜索类似问题。它是什么?


这就是为什么我绝对讨厌人们这样做的原因。如果你想要零初始化,使用调用memset(或ZeroMemorySecureZeroMemory),或一个括号集合。添加额外的零只会导致混淆。+1 - Billy ONeal
4个回答

6
请参见数组初始化

缺少初始化值则使用零

如果明确指定了数组的大小,但是指定了一个较短的初始化列表,则未指定的元素将被设置为零。

float pressure[10] = {2.101, 2.32, 1.44};

这不仅初始化了前三个值,而且所有剩余的元素都设为0.0。要将数组初始化为全零,请仅初始化第一个值。


啊哈!我从没想到那是在初始化一个数组。如果涉及逗号,我会立刻知道,但{0}通常在其他上下文中表示完全不同的含义(例如C# String.Format())。 - Marcus

3

这是在初始化一个数组。

float p1[1000];         // No intitialization.
float p2[1000] = {0.0}; // All 1000 values initialized to zero.

更多内容请参见:C++笔记:数组初始化


3

$8.5.1/7 -

“如果在初始化列表中的初始值少于聚合体中的成员数,则每个未明确初始化的成员都应该是值初始化(8.5)。”

这意味着有一个显式请求将第一个元素初始化为0。由于剩余元素没有指定初始化程序,因此它们被值初始化。在WCHAR的情况下,这意味着它们被初始化为0。

什么是值初始化?标准在$8.5中说了什么(斜体为我的添加)

对于类型T的值初始化对象意味着:

- 如果T是具有用户声明构造函数(12.1)的类类型(clause 9),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是非法的);

- 如果T是没有用户声明构造函数的非联合类类型,则T的每个非静态数据成员和基类组件都会被值初始化;

- 如果T是数组类型,则每个元素都被值初始化;

- 否则,对象被零初始化 <------ WCHAR适用于此处

对于类型T的零初始化对象意味着:

- 如果T是标量类型(3.9),则将对象设置为转换为T的值0(零);<------ WCHAR适用于此处

- 如果T是非联合类类型,则每个非静态数据成员和每个基类子对象都被置零;

- 如果T是联合类型,则对象的第一个命名数据成员89)被置零;

- 如果T是数组类型,则每个元素都被置零;

- 如果T是引用类型,则不进行初始化。


谢谢!当我阅读其他答案时,我想知道,“那么如果它是一个类的数组会发生什么呢?”所以你赢了,因为你也回答了这个问题 :) - Marcus

2
这意味着将wszFoo的所有元素初始化为零。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接