对于像 int 这样的内置类型,隐式默认构造函数不执行任何操作(不进行初始化)。
这是事实,但也并非如此。默认初始化会导致对象未初始化,而值初始化则不会。
为什么这些案例有所不同?
1.C++11、8.5/11
If 没有初始化程序为一个对象指定,该对象是默认初始化的;如果不执行初始化,则具有自动或动态存储期限的对象具有不确定值.
如果你使用int i;
这会导致一个未初始化的整数!
2.C++11,8.5/10
初始化器是一组空括号(即 ())的对象应进行值初始化.
如果你使用int i = int();
你有一个已初始化的值i
。现在,什么是值初始化?
3.C++11,8.5/7
To 值初始化T 类型的对象means:
- [...](一些选项,其中 T 可以是类或数组类型)
- 否则,该对象是零初始化。
好吧,现在我们知道了int i = int();
意味着拥有i=0
.
由于您的结构是 POD,因此对其进行值初始化意味着对其所有成员进行值初始化。
您可以对一般行为有捷径
int i1, i2 = int();
std::cout << i1 << std::endl;
std::cout << i2 << std::endl;
如果 i1 所在的内存不为零,那么你可以得到的输出可能是
somevalue
0
[正如 @jogojapan 正确提到的:阅读自i1
首先是未定义的,所以不要这样做。您很可能会观察到我在这里所描述的内容,但由于标准并不强制编译器以这种方式运行i1
可能为零,或者以任何其他奇怪的方式阻止预期结果。]
请注意以下事项:
注意:由于初始化语法不允许 (),
X a();
不是类 X 的值初始化对象的声明,而是不带参数并返回 X 的函数的声明。
Emphasis on standard quotes are mine.