首页 > 代码库 > 深度探索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中直接调用虚拟函数,则将每一个调用都以静态方式绑定,因为还无法确定具体是哪个虚拟函数。