C++:由隐式构造函数初始化int变量

usu*_* me 4 c++ int constructor

我正在学习C++,我对int变量的初始化感到有点困惑.

这段代码(包括注释)是Nawaz在本主题中的答案的复制/粘贴为什么C++需要用户提供的默认构造函数来默认构造一个const对象?

struct POD
{
  int i;
};

POD p1; //uninitialized - but don't worry we can assign some value later on!
p1.i = 10; //assign some value later on!

POD p2 = POD(); //initialized
Run Code Online (Sandbox Code Playgroud)

对于p2,我了解到以下情况:

  • 调用默认构造函数POD()以创建临时POD对象.构造函数不是用户定义的,因此它是隐式的.对于像int这样的内置类型,隐式默认构造函数不执行任何操作(不进行初始化).因此包含一些随机的东西.
  • 调用复制构造函数以使用临时POD对象(其i仍未初始化)创建p2 .因此,不应该初始化p2的i成员.

但是,评论说p2已初始化!欢迎任何解释.谢谢.

Pix*_*ist 7

对于像int这样的内置类型,隐式默认构造函数不执行任何操作(不进行初始化).

这是事实,但也不是.默认初始化会导致单元化对象,而值初始化则不会.

为什么这些案件有所不同?

1. C++ 11,8.5/11

如果没有为对象指定初始化程序,则默认初始化该对象; 如果未执行初始化,则具有自动或动态存储持续时间的对象具有不确定的值.

如果您int i;在未初始化的整数中使用此结果!

2. C++ 11,8.5/10

初始值为空集括号的对象,即(),应进行值初始化.

如果你使用,int i = int();你有一个值初始化i.现在,什么是价值初始化?

3. C++ 11,8.5/7

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

  • [...](T可能是类或数组类型的一些选项)
  • 否则,该对象被零初始化.

好的,现在我们知道这int i = int();意味着拥有i=0.

由于您的结构是POD,因此初始化值意味着对其所有成员进行初始化.

您可以在常规行为上拥有快捷方式

int i1, i2 = int();
std::cout << i1 << std::endl;
std::cout << i2 << std::endl;
Run Code Online (Sandbox Code Playgroud)

如果i1所在的内存不是任何运气,那么输出可能就是

somevalue
0

[ 正如@jogojapan正确提到的那样:首先读取i1是未定义的,所以不要这样做.你很可能会观察我在这里所描述的内容,但由于标准没有强制编译器以这种方式表现,因此i1可能为零,或以任何其他奇怪的方式制止预期结果.]

请注意以下事项:

注意:由于初始化程序的语法不允许(),

X a();

不是类X的值初始化对象的声明,而是函数的声明,不带参数并返回X.

强调标准报价是我的.