《深度探索c++对象模型》 学习笔记 - 5 构造、析构、拷贝 语义学
1. 纯虚函数一般都没有实现,但它可以被实现,也可以被静态的调用B::api(),但是不能借助虚拟机制进行调用。2. 纯虚析构函数必须被实现,因为每个子类的析构函数都会被编译器扩展以调用基类及再上层基类的的析构函数。否则会导致链接错误:lnk2001 unresolved external symbol。因为:c++保证继承体系中任一类的析构必须会被调用。
1. 纯虚函数一般都没有实现,但它可以被实现,也可以被静态的调用B::api(),但是不能借助虚拟机制进行调用。
2. 纯虚析构函数必须被实现,因为每个子类的析构函数都会被编译器扩展以调用基类及再上层基类的的析构函数。否则会导致链接错误:lnk2001 unresolved external symbol。因为:c++保证继承体系中任一类的析构必须会被调用。
3. 无继承情况下的对象构造。Plain Old Data(POD)约等于前面说过的bitwise copy semantic的符合条件,他们的构造函数是trivial,基本不会被构造。实际上,VC就没有构造,根据汇编代码就会发现。
4. 继承体系下带有数据成员的类的构造过程,按照如下顺序依次构造(书上说的不太完整,还有一些小错误):
Ø 虚基类的构造函数,从左到右,从最顶层到最底层。它和非虚基类不同:是由最底层子类调用的。
Ø 非虚基类的构造函数,按照基类被声明顺序从左到右调用。它与虚基类的不同:是由直接子类调用的。
Ø 如果类中有虚表指针,则设置vptr初值;若增加有新的虚函数或者覆盖基类虚函数,则修改vtbl内的信息。
Ø 成员变量以其声明顺序进行初始化构造。假设x定义在y前面:即使y放到了成员初始化列表中,x没有在其中;甚至y可以放到x前面;或者y在成员初始化列表,而x放到构造函数的user code里面。x总是永远比y先行构造。
Ø 构造函数中,用户自定义的代码(user code)最后被执行。
5. 在copy构造函数中,如果没有与资源分配、释放相关的特殊数据,那么可以不用特别强调自我赋值的检查。
6. 在一个类的构造函数中,经由“构造中”的对象调用一个虚函数,其函数实体应该被决议为此类中的版本。因为根据构造函数的调用顺序:从root到leaf,从left到right,故当基类构造时,子类实体还没有构建出来,所以无法virtual。
7. 关于析构函数的合成以及析构的过程,其原理与构造函数完全一样,其各种顺序都和构造函数完全相反。
实例代码:
更多推荐
所有评论(0)