首页 > 代码库 > 深度探索C++对象模型 第五章 构造、析构、拷贝语意学

深度探索C++对象模型 第五章 构造、析构、拷贝语意学

1、 const 成员函数需要吗? 尽量不要,如果存在继承,则无法预支子类是否有可能改变data member

2、 pure virtual constructor 可以实现类的隐藏吗(包含data member)?   这样子类无法调用base 的构造函数对数据初始化,所以可以用protected来实现构造函数,可以实现子类调用;

3、 如果class中存在virtual function,则编译器会再构造函数中对vptr进行初始化(在base构造函数调用之后,而代码实现之前)

4、拷贝构造函数或者assignment 构造函数中不会对vptr进行修改,vptr仍会指向自己的vtable(所以带有vfunction的拷贝和赋值构造函数,不会应用bitwise,而是和class 中有object member一样,使用memberwise )

5、member initiaization list 实现data member的初始化操作,以及data member中object 成员的初始化操作,效率较高;如果在constructor中实现,则是赋值操作,会伴随内存移动; 当然编译器可以进行相应优化,将本体实现的赋值优化为初始化操作(NRV no result value)

一个class

class Point {

public:

    Point();

    Point(const Point&);

    Point& operator=(const Point&);

    virtual ~Point();

 }

6、继承体系下的对象构造

1) 记录在member initialization list中的data members初始化操作会背放进constructor的函数本体,并以member声明顺序初始化

2) 如果一个member没有在初始化列表中,但它有一个default constructor,则必须被调用

3)  在那之前,如果class object有virtual table pointers,则必须被设定初值

4) 在那之前,所有的base class constructors必须被调用,以base class的声明顺序为顺序;

5) 在那之前,所有的virtual base class constructors必须被调用,从左到右(不是很理解)

7、 constructor和destructor中直接调用虚拟函数,则将每一个调用都以静态方式绑定,因为还无法确定具体是哪个虚拟函数。