第一章 对象
C++支持封装,这一点并未给它带来任何空间或执行期的不良后果。C++在布局以及存取时间上的主要额外负担是由virtual引起的,包括:
1)virtual function机制
用以支持一个有效的“执行期绑定”(runtime binding)
2)Virtual base class
用以实现“多次出现在继承体系中的base class”有一个单一而被共享的实例
1.1 封装
类包括成员变量(class data members)和成员函数(class member functions)
1)两种class data members:static和nonstatic
2)三种class member functions:static、nonstatic和virtual
Nonstatic data members被配置于每一个class object之内,static data member则被存放在个别的class object之外。Static和nonstatic function members也被放在个别的class object之外。Virtual functions则通过以下步骤实现:
1)每一个class object产生出一堆指向virtual functions的指针,放在表格(virtual table(vtbl))之中。
2)每一个class object被安插一个指针(vptr),指向相关的virtual table。Vptr的设定和重置都由构造函数、析构函数、拷贝赋值函数自动完成。每一个关联的type_info object(用以支持runtime type identification,RTTI)也由virtual table指出,通常放在表格的第一个slot。
1.2 继承
单一继承、多重继承、虚继承
1.3 多态
C++以下列方法支持多态:
1)经由一组隐式转化操作(将派生类指针转换为指向其基类的指针 shape *ps = new Circle())
2)经由virtual function机制
3)经由dynamic_cast和typeid运算符
1.4 其他
1.4.1 C++程序设计范式
C++程序设计模型支持三种程序设计范式(programming paradigms):
1)程序模型(procedural model)
2)抽象数据类型模型(abstract data type model)
3)面向对象模型(object-oriented model)
1.4.2 类对象内存大小
需要多少内存才能表现一个class object?一般而言需要:
1)其nonstatic data members的总和大小
2)加上任何由于alignment的需求而填补(padding)上去的空间
3)加上为了支持virtual而由内部产生的任何额外负担
1.4.3 OO与OB
OO(object-oriented)具有多态特性从而更具弹性,OB(object-oriented),封装的非多态性,空间更紧凑,效率更高。