假设我对以下创建调用默认构造函数的对象(由编译器提供)的方法的了解是真的。
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;
初始化自身(用垃圾值初始化)?是不确定的行为?
答案 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分配的值有任何不同。