默认构造函数

来源:互联网 发布:dat文件导入数据库 编辑:程序博客网 时间:2024/05/16 18:38

关于默认构造函数两个常见的误解:

1.任何一个class,如果没有定义默认构造函数(default constructor) ,编译器都会为其合成一个默认构造函数

2.编译器合成的默认构造函数,会设定会明确设定数据成员的默认值


编译器不是总会为class合成默认构造函数,只是在编译器需要时才合成,注意:是编译器需要,而不是程序需要。

那在什么情况下,编译器会合成默认构造函数呢?

在没有显示声明任何构造函数时,下面4种情况编译器会合成默认构造函数

1.类的对象成员带有默认构造函数

           因为需要在类的构造函数中调用对象成员的默认构造函数,所以这时编译器会合成默认构造函数,

如果有多个对象成员,会按照声明顺序依次调用其默认构造函数,而且他们的调用是在程序显示的初始化基本数据成员(如int)之前。

2.基类带有默认构造函数

           因为需要在子类的构造函数中调用基类的默认构造函数,所以此时编译会合成一个构造函数

3.带有虚函数的类,声明或继承了一个虚函数

           带有虚函数的类对象,编译器都会为其安插一个vptr的指针,指向vtbl,以实现多态机制,

在构造这样的对象时,vptr需要设置初始值(即:虚函数表),

所以此时,如果没有显示定义任何构造函数,编译器会为其合成一个默认构造函数。

4.在继承链中有一个或多个虚基类

           构造对象时,编译器会为对象安插一个指向虚基类的指针,所以需要合成一个默认构造函数,并初始化这个虚基类指针。


          其他情形,编译器不会合成默认构造函数。

0 0