Inside The C++ Object Model(五)
============================================================================
5-0. 一般而言,class 的data member 应该被初始化,并且只在constructor中是在class 的其他member functions 中指定初值。其他任何操作都将破坏封装性质,是class 的维护和修改更加困难。

图片5-0;
(1)纯虚拟函数的存在
注:编译器不会在扩展derived class 的destructor时停止对pure Virtual destructor的调用操作(因为class设计者可能真的定义了一个pure Virtual destructor);编译器也不会自己取合成一个pure Virtual destructor的函数定义(编译器没有足够的知识,因为编译器对一个可执行文件采取“分离编译模型”)。
一个比较好的替代方案就是,不要把Virtual destructor 声明为pure。
(2)虚拟规格的存在
一般而言,把所有的成员函数都声明为Virtual function,然后再靠编译器的优化操作把非必要的Virtual invocation 去除,并不是好的设计观念。
(3)虚拟规格中const的存在
不把函数声明为const,意味着该函数不能够获得一个const reference 或 const pointer。比较令人头大的是,声明一个函数为const,然后才发现其derived instance 必须修改某一个data member。简单想法:不再用const就是了。
(4)重新考虑class 的声明

图片5-0-1;
============================================================================
5-1. “无继承”情况下的对象构造

图片5-1-1;
(1)抽象数据类型
如果要对class 中的所有成员都设定常量初值,那么给予一个explicit initialization list 会比较高效(比起意义相同的constructor 的 inline expansion(内联扩展)而言)。甚至在local scope中也是如此。

图片5-1-2;
观念上,我们的Point class 有一个相关的default copy constructor、copy operator和destructor,然而它们都是无关痛痒的,而且编译器实际上根本没有产生它们。
(2)为继承做准备
继承下的多态决议,Virtual functions的引入,每一个class object 多负担一个vptr,并且也引发编译器对于我们的class 产生膨胀作用:

图片5-1-3;
注:C++ Standard 要求编译器尽量延迟 nontrivial members 的实际合成操作,直到真正遇到其使用场合为止。
============================================================================
5-2. 继承体系下的对象构造

图片5-2-1;

图片5-2-2;
(1)虚拟继承
问题:对于Virtual base class 的构造,由更往后(往下)的继承来负责“被共享之virtual base class(派生类的subobject)”的构造。
添加条件测试:只有一个完整的class object 被定义出来时,它才会被调用;如果object只是某个完整object 的subobject,它就不会被调用。
(2)vptr初始化语意学
如下的继承体系:

图片5-2-3;

图片5-2-4;

图片5-2-5;

图片5-2-6;
然而,这个看似完美的解决有关限制虚拟机制的问题,却仍不完美:

图片5-2-7;

图片5-2-8;
============================================================================
5-3. 对象复制语意学

图片5-3-1;

图片5-3-2;

图片5-3-3;
注:书中作者建议,尽可能不要允许一个virtual base class 的拷贝操作。甚至:不要在任何virtual base class 中声明数据。
============================================================================
5-5. 解构语意学

图片5-5-1;

图片5-5-2;

图片5-5-3;
============================================================================
Inside The C++ Object Model(五)的更多相关文章
- C++学习书籍推荐《Inside the C++ Object Model》下载
百度云及其他网盘下载地址:点我 作者简介 Stanley B. Lippman is Architect with the Visual C++ development team at Microso ...
- inside the C++ Object model总结
一. 关于对象 1.内联函数:能够除去函数调用的开支,每一处内联函数的调用都是代码的复制.这是一种空间换取时间的做法,若函数代码量大或者有循环的情况下,不宜内联(这件事有些编译器会自动帮你做).在类中 ...
- 《深度探索C++对象模型(Inside The C++ Object Model )》学习笔记
转载:http://dsqiu.iteye.com/blog/1669614 第一章 关于对象 使用class封装之后的布局成本: class并没有增加成本,data members直接内含在每一个c ...
- Inside The C++ Object Model - 03
object Lessons 1.C++中布局以及存取时间上的的额外负担是由virtual引起的:virtual function.virtual base class.或是由于多继承引起的. 2.C ...
- Inside The C++ Object Model(四)
============================================================================4-1. Member 的各种调用方式静态成员函 ...
- Inside The C++ Object Model(三)
============================================================================3-0. 类所占的内存大小受到三个因素的影响:( ...
- Inside The C++ Object Model(二)
============================================================================2-0. 关键字explicit被引入C++,提 ...
- Inside The C++ Object Model(一)
============================================================================1-1. 关键字struct和class的一点区 ...
- Inside The C++ Object Model - 04 C++对象模型的一个简单示例
首先定义一个类X class X { public: X(); X(const X& x); virtual ~X(); virtual foo(); } 再来一段代码: X foobar() ...
随机推荐
- 转:2016年崛起的js项目
近几年 JS 社区创新和演化的速度是有目共睹的,几个月前比较时髦的技术很可能现在已经过时了. 2016 已经过去,你有没有担心错过了什么重要的内容?在这篇调查报告中我们会为你解读社区的主流趋势. 我们 ...
- HTML5 学习06——Geolocation(地理定位)
HTML5 Geolocation(地理定位) HTML5 Geolocation API 用于获得用户的地理位置. 鉴于该特性可能侵犯用户的隐私,除非用户同意,否则用户位置信息是不可用的. HTML ...
- pygame 笔记-4 代码封装&发射子弹
继续之前的内容,随着游戏的内容越来越复杂,有必要把代码优化一下,可以参考OOP的做法,把人物类抽象出来,弄成一个单独的类,这们便于代码维护,同时我们给小人儿,加个发射子弹的功能,代码如下:(看上去略长 ...
- Linux进程管理学习资料
下面是一些Linux进程管理相关的资料. 博客 Process Creation(一) Process Creation(二) 进程切换分析(1):基本框架 进程切换分析(2):TLB处理 When ...
- Mac 删除/卸载 自己安装的python
官网pkg安装的python版本 第一步:删除框架 sudo rm -rf /Library/Frameworks/Python.framework/Versions/2.7 1 第二步:删除应用目录 ...
- gtest环境安装
gtest全称Google Test,是Google的C++测试框架,有很多优秀的软件都会依赖这个环境编译或者在开发中也会用到,gtest的编译非常简单,下面简单说明一下安装过程. gtest git ...
- git中提示 please tell me who you are
提示也就是需要你登录一下,确认你的身份,但是不要按照其提示输入,先输入命令git config user.name “username”,换行输入git config user.email “emai ...
- 使用elasticsearch分页时报max_result_window is too large的错误解决方案
使用elasticsearch进行深度分页查询时的size-from大于10000的时候,会提示一个max_result_window is too large的错误. 官方推荐是scroll查询返回 ...
- sort is deprecated, use sort_values(inplace=True) for INPLACE sorting
排序是过时的,用sort_values(到位=真)为就地排序
- Django表单介绍
HTML 表单 在HTML中,表单是<form>...</form> 之间元素的集合,它们允许访问者输入文本.选择选项.操作对象和控制等等,然后将信息发送回服务器. 某些表单的 ...