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() ...
随机推荐
- EasyAR 开发实例---AR礼物(简单demo)
一个节日礼物效果 --显示模型 在本次的案例中,我使用的是unity5.6.3版本,EasyAR 为2.0.(用1.0的版本,在渲染那块有问题) [导入SDK]到EasyAR官网(http://www ...
- SQL 关联外键报错类型不匹配
如题,关联外键的时候,报错类型匹配.但是两个 类型都是int sql 如下: CREATE TABLE IF NOT EXISTS `alert_receiver_map` ( `id` INT UN ...
- [原创]RedisDesktopManager工具使用介绍
[原创]RedisDesktopManager工具使用介绍 1 RedisDesktopManager简介 一款能够跨平台使用的开源性redis可视化工具.redis desktop manager主 ...
- python测试开发django-52.xadmin添加自定义的javascript(get_media)
前言 我想使用xadmin在列表页每一行元素添加一个按钮,当点击这个按钮的时候,能发个请求出去,后台执行相关功能.于是想到添加自定义的javascript脚本能实现. 在/stackoverflow上 ...
- Springboot中Aspect实现切面(以记录日志为例)
前言今天我们来说说spring中的切面Aspect,这是Spring的一大优势.面向切面编程往往让我们的开发更加低耦合,也大大减少了代码量,同时呢让我们更专注于业务模块的开发,把那些与业务无关的东西提 ...
- 对Unity的Resources目录进行改名
项目用的是Unity5.5版本,开发的时候将相关的图集.预制对象资源都放在 Resources 目录下,而真机使用的是 StreamingAssets 目录下的资源. Resources(不分层级)在 ...
- fastjson转换json字符串key的首字母小写变大写的解决办法
https://blog.csdn.net/erbao_2014/article/details/53688934 问题描述在开发过程中,由于接口文档的描述,要求json字符串的key首字母为大写,而 ...
- CentOS7配置防火墙
使用命令的方式配置 ##Add firewall-cmd --permanent --zone=public --add-port=/tcp ##Remove firewall-cmd --perma ...
- Python-MacOSX下SIP引起的pip权限问题解决方案(非取消SIP机制)
网上很多资料都是取消SIP机制,安装完再恢复.可是基于用户的权限来安装模块包显得更加合理. 第一种:(推荐)pip install module --user -U http://www.jiansh ...
- Jquery DataTables 获取表格数据及行数据
注意table变量是 1.jQuery DataTables 行号获取 $("#example tbody tr").on("click", function( ...