现在的位置: 首页 > 综合 > 正文

C++何时会帮忙合成default constructor

2018年04月03日 ⁄ 综合 ⁄ 共 1135字 ⁄ 字号 评论关闭

最近在看《深度探索C++对象模型》,学到了很多东西。。。

C++新手一般有两个常见的误解:

1.任何class如果没有定义default constructor,就会被合成出一个来。

2.编译器合成出来的default constructor会显示设定“class 内每一个data member的默认值”

注意:以上两个说法都是错误的!

编译器只会在以下4种情况,并且class自身没有定义default constructor的情况下,帮忙合成default constructor.

1."带有default constructor"的member class object

也就是说,虽然class A没有显示定义default constructor,但是A class内的成员变量B,B本身是提供显示的default constructor的,这种情况下会为A构造一个default constructor.在该构造函数里会调用B的构造函数,当然只有在被调用的时候才会被合成出来。

2.“带有default constructor"的base class.

也就是说,虽然class A没有显示定义default constructor,但是A class 继承自B class,B本身是提供显示的default constructor的,这种情况下会为A构造一个default constructor.

3.“带有一个virtual function"的class.

也就是说,虽然class A没有显示定义default constructor,但是A class 内有虚函数,既然有虚函数,那么在初始化对象的时候,需要初始化其中的指针vptr指向vtable,所以这种情况下会为A构造一个default constructor.

4.“带有一个virtual base class" 的class

即下面这种情况:

class X
{
	public:int i;
};
class A:public virtual X
{
	public:int j;
};
class B:public virtual X
{
	public:int d;
};
class C:public A,public B
{
public:
	int k;
}

这种情况下,编译器会为A,B,C合成default constructor,理由是derived class中都有指针指向virtual base class,需要初始化该指针。

同时需要注意,只有再必要的时候编译器才会合成出来,如程序中逗没建该class的对象,故编译器肯定也不用合成出来。

另外,编译器合成出来的,只是为了满足编译要求,只对那些必要的值进行初始化,不会初始化所有值,初始化所有值这是满足程序员要求了。。。编译器没那么勤奋,而且也不知道其他值该初始化成什么值。。。

抱歉!评论已关闭.