2.1 default constructor

一、带有默认构造函数的 成员类对象(has a)

在C++不同的编译模块中,为避免合成多个默认构造函数:
1、inline(默认构造、拷贝构造、析构、赋值运算符 都要用inline)
2、exlicit non-inline static

类中有多少个成员类对象,就要按照声明顺序依次调用各自的默认构造函数。编译器会扩张已存在的构造函数。

image
构造函数被扩张成:
image

其中dd成员属于对象,所以每一次新建对象dd都会被初始化赋值。

二、带有默认构造函数的父类(is a)

没有任何构造函数的子类派生自带有default constructor 的父类Base,那么派生类的默认构造函数有用,会被合成出来。对于子类的子类,这个合成的构造函数和“被希纳是提供的构造函数”没有差别。
调用时候:将调用父类默认构造函数。

如果有多个构造函数,但是没有默认构造函数,编译器会扩张现有的每一个构造函数,将调用default constructor所需要的程序代码加进去。不会合成新的default constructor,因为已经有其他的构造函数存在。
如果同时存在带有“default constructor” 的成员类对象,那么类对象的默认构造函数在所有的基类构造函数被调用之后调用。

三、class with virtual functions

编译器为每一个class object的vptr设定初值,也就是放置virtual table 地址.
①、如果class没有定义constructor,编译器会合成一个default constructor,通过在其中插入一些代码,以便初始化每一个class object的vptr。
②、对于提供了constructor的class object,编译器在每一个constructor中插入一些代码,用来初始化class object的vptr。

四、class with virtual base class

虚继承(多用在菱形继承)

posted @ 2021-04-13 10:27  点|滴  阅读(7)  评论(0)    收藏  举报