Chapter 1 关于对象
C++的对象:
C++的class ADT相比C struct在布局上成本的额外负担是由virtual引起的:virtual function(用于支持动态绑定),virtual base class(用于实现“多次出现在集成体系中的base class,有一个单一而被共享的实例”)。
C++中,有两种class data member:static和nonstatic,三种class function member:static, nonstatic, virtual。
classPoint {
public:
Point(float xval);
virtual ~Point();
float x() const;
staticint PointCount();
protected:
virtual ostream&
print(ostream &os) const;
float_x;
staticint_point_count;
};
比较容易想到的模型(没有实际的编译器产品)A Simple Object Model:
该model引入slot的概念。
第二种可能的model(没有实际的编译器产品) A Table-driven Object Model:
C++对象模型(目前常用的模型) The C++ Object Model:
在此模型中:
nonstatic data member被放在each object中。
static data member被放在单个的object之外。
static 和 nonstatic function member被放在单个的object之外。
virtual function由两个步骤支持:
1. 每个class 产生一些指向virtual function的指针,放在virtual table(vtbl)中。
2. each object都有一个指针指向相关的virtual table(vptr)。vptr的setting和resetting都由每一个类的constructor、destructor、copy assignment运算符自动完成。每个class所关联的type_info object(用于支持Runtime type identification RTTI)放在vtbl的第一个slot。
struct与class:
C++中凡是放在同一个access section的数据,必定保证以其声明的顺序出现在内存布局中。然而被放置在不同access section中的各笔数据,排列顺序则一定了。所以C语言struct末尾放一个不定长数组在C++ class中不见得可行。组合而非继承,才是把C和C++结合在一起的唯一可行的办法。
编程范式:
例如:函数化程序设计、逻辑程序设计、语义数据模型、几何计算、数值计算、面向对象设计、原型设计、自然语言。
C++支持程序模型(procedural model)、抽象数据类型模型(ADT Model)、面向对象模型。
指针的类型
指针的大小都是4字节,表示一个地址。指针的类型并不影响指针的大小,只是用来告诉编译器如何解释这个地址开始的一块内存内容及其大小。
C++中语法上的多台要用指针或者引用。一个指针(pointer)或者引用(reference)之所以支持多态,是因为他们并不引发内存中任何“与类型有关的内存委托操作(type-dependent commitment)”。会受到改变的只是它们所指向的内存的“大小和内容解释方式”而已。