我有以下代码:

struct B
{
 //B() {}
 int x;
 int y;
};

void print(const B &b)
{
 std::cout<<"x:"<<b.x<<std::endl;
 std::cout<<"y:"<<b.y<<std::endl;
 std::cout<<"--------"<<std::endl;
}

int main()
{
 B b1 = B(); //init1
 B b2; //init2

 print(b1);
 print(b2);

 return 0;
}

当我启动程序(vs2008,调试)时,我有以下输出:
x:0
y:0
--------
x:-858993460
y:-858993460
--------

如您所见,b1.x和b1.y的值为0。为什么? init1和init2有什么区别?

当我取消注释B构造函数时,我将得到以下输出:
x:-858993460
y:-858993460
--------
x:-858993460
y:-858993460
--------

有人可以解释这种行为的原因吗?
提前Tnx。

最佳答案

POD类型的默认构造函数将其填充为零。当您显式定义自己的构造函数时,您无需初始化xy,您将获得随机值(在VS debug中,它们填充有确切值,但在发布时,它们将是随机值)。

根据C++ 03标准8.5/5:


B()是临时值的初始化,将在b1的拷贝初始化中使用。

B b2中,没有为对象指定初始化程序,因此根据C++ 03 Standard 8.5/9:



要获得b2的零,您可以编写B b2 = {};

10-08 00:41