C ++隐式默认构造函数有什么意义?

时间:2016-08-27 14:01:24

标签: c++ constructor

隐式默认构造函数有一个空主体和一个空的初始化列表(原始类型未定义,并且为用户定义的类型调用默认构造函数)。

post

MyClass *c = new MyClass();

确实做了一个成员方式的值初始化,但是在做

时调用默认构造函数是什么意思
MyClass c;

是否调用了隐式默认构造函数,以确保调用用户定义类型(可能具有非平凡的默认构造函数)的默认构造函数?

更新

似乎在调用编译器生成的隐式默认构造函数之后,对象可能无法一致地实例化,即原始类型未定义,并且用户定义的类型可能(或可能不是)处于已知状态,具体取决于程序员是否提供默认构造函数。

为什么编译器会生成一个隐式的默认构造函数,当调用它时可能会实例化一个处于未知状态的对象?

3 个答案:

答案 0 :(得分:5)

隐式默认构造函数的点与任何其他构造函数的点相同。

需要构建给定类的每个实例。类实例本身不会凭空出现。某个地方的东西有构建对象的工作。

如果未声明显式构造函数,则会自动定义隐式默认构造函数,默认构造类的超类和任何类成员。

这里,"默认构造"还包括"什么都不做"选项,如果类成员是没有显式构造函数的基本类型。因此,最后,隐式默认构造函数可能最终无效。但是如果没有指定显式构造函数(并且当然没有显式删除隐式默认构造函数),它仍然被定义。

答案 1 :(得分:4)

你是否这样做:

MyClass c;

或者这个:

MyClass *c = new MyClass();

您正在调用默认构造函数。

你是对的,隐式默认构造函数确实保留了intdouble等基本类型未初始化。但它通过调用默认构造函数(隐式或显式)来初始化任何其他成员变量,例如字符串。

答案 2 :(得分:0)

我在维基百科Virtual Method Table

中读到
  

因此,编译器还必须生成" hidden"代码在   每个类的构造函数初始化一个新对象' vpointer到   该班级的地址。

也许这是拥有默认隐式构造函数的一个原因 - 当存在具有虚方法的类层次结构时,每个实例都需要正确设置vpointer。