假设我对以下两种用于创建调用默认构造函数(由编译器提供)的对象的方法的知识是正确的。
class A
{
int a,b;
//No programmer defined constructor
}
...
A o1; //Implicit Call I believe
A o2 = A(); //Explicit Call
为什么会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限定的)非联合类类型,则将每个非静态数据成员和每个基类子对象初始化为零,并将填充初始化为零位;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句