Zai*_*han 4 c++ default-constructor
假设我对以下两种调用默认构造函数(由编译器提供)创建对象的方法的了解是正确的。
class A
{
int a,b;
//No programmer defined constructor
}
...
A o1; //Implicit Call I believe
A o2 = A(); //Explicit Call
Run Code Online (Sandbox Code Playgroud)
为什么会A o2 = A();导致对象的成员(a,b)o2使用默认值(0)初始化自身,而不是A o;(它们使用垃圾值初始化)?这是未定义的行为吗?
报价来自标准 p8.5/1
这里没有用户定义的构造函数,因此编译器将使用默认的构造函数。默认构造函数不会用零初始化成员。
如果没有为对象指定初始化程序,则该对象将被默认初始化。
默认初始化 T 类型的对象意味着:
如果 T 是(可能是 cv 限定的)类类型(第 9 条),则考虑构造函数。枚举了适用的构造函数(13.3.1.3),并通过重载决议(13.3)选择最适合初始化器()的构造函数。使用空参数列表调用如此选择的构造函数来初始化对象。
第二种情况是值初始化。
初始化器是一组空括号(即 ())的对象应进行值初始化。
对 T 类型的对象进行值初始化意味着:
如果 T 是一个(可能是 cv 限定的)类类型,没有用户提供或删除的默认构造函数,则该对象被零初始化并检查默认初始化的语义约束,并且如果 T 具有非平凡的默认构造函数,该对象是默认初始化的;
对 T 类型的对象或引用进行零初始化意味着:
如果 T 是(可能是 cv 限定的)非联合类类型,则每个非静态数据成员和每个基类子对象均初始化为零,并且填充初始化为零位;