============================================================================
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 的声明blog
图片5-0-1;继承
============================================================================
5-1. “无继承”状况下的对象构造图片
图片5-1-1;ci
(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;
============================================================================