目录
1.1 C++对象模式
例如下述对象
class point
{
public:
Point(float xval);
virtual ~Point();
float x() const;
static int PointCount();
protected:
virtual ostream& print(ostream& os) const;
float _x;
static int _point_count;
};
对于上述对象的塑模,存在以下几种方式
1.1.1简单对象模型
尽量降低C++编译器的设计复杂度,赔上了空间和执行期的效率,一个object是一系列的slots,每一个slots指向一个menmbers。Members按其声明次序,各被指定一个slot。每一个data member和function member都有自己的slot
members本身并不放在object支中,只有指向member的指针才放在object之中,可以避免members有不同的类型,因而需要不同的存储空间的问题。
关于索引或slot数目的观念被应用到C++的指向成员的指针观念支中
1.1.2 表格驱动对象模型
将所有的数据成员抽象出来放到一个数据成员表中,将成员函数又抽象出来放到一个成员函数表中。
menmber function table观念称为支持虚函数的一个有效方案
1.1.3 C++对象模型
非静态成员被至于一个类对象中,静态数据成员被存放在所有的类对象之外,静态和非静态成员函数也被放在类对象之外,虚函数依靠以下两个步骤实现
- 每个类产出一个指向虚函数的指针,放在表格中,该表格被称为虚函数表
- 每个类对象添加一个指针,指向相关的虚函数表,该指针称为vptr
该模型优点在于空间和存取时间的效率,缺点在于如果代码本身没改变,而用到的非静态数据成员改变,则需要重新编译。
1.2 关键词所带来的差异
1.2.1 struct和class的区别
思想上的区别:struct关键词的使用实现的是C的数据萃取观念,而class关键词实现的是C++的ADT观念。C++原本不是必须需要class关键字,但是它的加入,体现了C++的封装和继承的哲学。
内存存放的区别:struct是按声明顺序来存放数据,故可以使用小技巧来实现一个可变大小的数组,但是C++中class内数据存储却不一定是与声明一致,如:base classes和derived classes的data members的布局并没有强制规定谁先谁后。
默认权限的却别:class默认权限为private,而struct的默认权限是public。
1.3 对象的差异
C++程序设计模型直接支持三种programming paradigms(程序设计典范)。
(1)程序模型(procedural model):面向过程,如字符串处理,可以使用字符数组以及str*函数集。
(2)抽象数据类型模型(ADT):该模型所谓的“抽象”是和一组表达式(public接口)一起提供,而其运算定义隐而未明。如:string class。
(3)面向对象模型(object-oriented model):类和继承、多态等。
其中C++有三种方法支持多态:
(1)经由一组隐含的转化操作。例如把一个derived class指针转化为一个指向其public base class指针。
(2)经由visual function机制
(3)经由dynamic_cast和typeid运算符。
1.3.1 指针类型
class ZooAnimal
{
public:
ZooAnimal();
virtual ~ZooAnimal();
virtual void rotate();
protected:
int loc;
string name;
};
指向ZooAnimal的指针式如何与一个指向征数的指针或者指向template Array的指针有所不同:
ZooAnimal *px; int *pi; Array<String> *pta;
三个都需要足够内存存放一个机器地址。“指向不同的类型之各指针”之间的差异。既不在其指针表示法不同,也不在其内容不同,二十在其所寻址处理的对象类型不同。指针类型会教导编译器如何解释某个特定地址中的内存内容及其大小。
(1)一个int指向地址1000的整数指针,在32位机上(占4字节),将涵盖地址空间1000-10003
(2)string为8字节,则一个ZooAnimal指针将横跨地址空间1000-1015(4+8+4)
- 加上多态
class Bear :public ZooAnimal
{
public:
Bear();
~Bear();
void rotate();
virtual void dance();
protected:
enum Dances {.......};
Dances dances_known;
int cell_block;
};
Bear b("yogi");
Bear *pb=&b;
Bear &rb=*pb;
其内存需求: