您的位置:首页 > 编程语言 > C语言/C++

《深度探索C++对象模型》读书笔记之构造、析构、拷贝语意学

2012-11-17 18:33 288 查看
1、 
继承体系下的对象构造过程是怎样的?

1>    调用所有的虚基类构造函数,从左到右,由最深到最浅(别忘记虚基类在对象模型中是以独特的方式支持的,不涉及到在对象模型中的偏移量的问题)

2>    调用所有的上一层的基类构造函数,以基类的声明顺序为顺序(这是因为一般基类的subobject都会被放在object的开始,并且按基类声明的次序放置)

3>    如果class
object有虚函数表指针,设定其初值,指向适当的虚函数表(开始进入派生类由编译器安插的数据成员的构造咯)

4>    如果又一个member并没有出现在成员初始化列表中,且它有一个默认构造函数,那么该默认构造函数必须被调用

5>    记录在成员初始化列表中的数据成员初始化操作会被放在constructor的函数本身,并以members声明的顺序为顺序

6>    程序员自己的代码(在此步以上的操作均为编译器安插的)
 

2、 
继承体系下的对象构造过程中如何压制虚基类的构造函数的重复调用?

“virtual base class constructors的调用”有着明确的定义:只有一个完整的classobject被定义出来时,它才会被调用;如果object只是某个完整的object的subject,它就不会被调用。


由继承体系下的对象模型可知,当有Vertex3d的对象声明时,首先调用Point部分的构造函数,由于是完整的class
object被定义出来,所以调用成功。当调用Point3d或者Vertex的构造函数时,其内部对Point的构造函数的调用将会被抑制,因为Point3d或Vertex只是完整object的subobject。

 

备注:复制构造、析构函数所需解决的问题大体相似,所以省略咯。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐