隐式与显式默认构造函数调用

时间:2015-09-03 14:00:09

标签: c++ default-constructor

假设我对以下创建调用默认构造函数的对象(由编译器提供)的方法的了解是真的。

class A
{
    int a,b;
    //No programmer defined constructor
}
...
A o1; //Implicit Call I believe
A o2 = A(); //Explicit Call

为什么A o2 = A();导致对象o2的成员(a,b)使用默认值(0)而不是A o;初始化自身(用垃圾值初始化)?是不确定的行为?

2 个答案:

答案 0 :(得分:2)

报价来自标准p8.5 / 1

这里没有用户定义的构造函数,因此编译器将使用默认构造函数。默认构造函数不会用零初始化成员。

  

如果没有为对象指定初始化程序,则该对象为   缺省初始化。

     

默认初始化T类型的对象意味着:

     

如果T是(可能是cv限定的)类类型(第9节),那么构造函数   被考虑。列举了适用的构造函数(13.3.1.3),   并且初始化器()的最佳选择是通过重载来选择的   决议(13.3)。这样选择的构造函数被调用,带有   空参数列表,用于初始化对象。

在第二种情况下将是值初始化。

  

一个对象,其初始化程序是一组空的括号,即(),   应进行价值初始化。

     

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

     

如果T是没有用户提供的(可能是cv限定的)类类型   或者删除默认构造函数,然后对象进行零初始化   并检查默认初始化的语义约束,   如果T有一个非平凡的默认构造函数,那么对象就是   缺省初始化;

     

零初始化T类型的对象或引用意味着:

     

如果T是(可能是cv限定的)非联合类类型,则每个   非静态数据成员和每个基类子对象是   零初始化和填充初始化为零位;

答案 1 :(得分:0)

在这两种情况下,都会调用编译器提供的默认构造函数。很可能c ++编译器将值初始化为某些垃圾值。在调用默认构造函数的情况下,c ++编译器不会将值初始化为0,除非已经使用零转储内存。我尝试了这个场景,我没有看到在两个对象中为a和b分配的值有任何不同。