隐式默认构造函数有一个空主体和一个空的初始化列表(原始类型未定义,并且为用户定义的类型调用默认构造函数)。
这post说
MyClass *c = new MyClass();
确实做了一个成员方式的值初始化,但是在做
时调用默认构造函数是什么意思MyClass c;
是否调用了隐式默认构造函数,以确保调用用户定义类型(可能具有非平凡的默认构造函数)的默认构造函数?
更新
似乎在调用编译器生成的隐式默认构造函数之后,对象可能无法一致地实例化,即原始类型未定义,并且用户定义的类型可能(或可能不是)处于已知状态,具体取决于程序员是否提供默认构造函数。
为什么编译器会生成一个隐式的默认构造函数,当调用它时可能会实例化一个处于未知状态的对象?
答案 0 :(得分:5)
隐式默认构造函数的点与任何其他构造函数的点相同。
需要构建给定类的每个实例。类实例本身不会凭空出现。某个地方的东西有构建对象的工作。
如果未声明显式构造函数,则会自动定义隐式默认构造函数,默认构造类的超类和任何类成员。
这里,"默认构造"还包括"什么都不做"选项,如果类成员是没有显式构造函数的基本类型。因此,最后,隐式默认构造函数可能最终无效。但是如果没有指定显式构造函数(并且当然没有显式删除隐式默认构造函数),它仍然被定义。
答案 1 :(得分:4)
你是否这样做:
MyClass c;
或者这个:
MyClass *c = new MyClass();
您正在调用默认构造函数。
你是对的,隐式默认构造函数确实保留了int
和double
等基本类型未初始化。但它通过调用默认构造函数(隐式或显式)来初始化任何其他成员变量,例如字符串。
答案 2 :(得分:0)
我在维基百科Virtual Method Table
中读到因此,编译器还必须生成" hidden"代码在 每个类的构造函数初始化一个新对象' vpointer到 该班级的地址。
也许这是拥有默认隐式构造函数的一个原因 - 当存在具有虚方法的类层次结构时,每个实例都需要正确设置vpointer。