1. C++ 程序设计模型直接支持三种程序设计典范(programming paradigms)
(1)程序模型(procedural model)
如字符串的处理,可用使用字符数组,及 str* 函数集。
(2)抽象数据类型模型(abstract data type model)
该模型所谓的“抽象”适合一组表达式(pubic 接口)一起提供,而运算定义仍隐而未明。
(3)面向对象模型(object-oriented model)
此模型中有一些彼此相关的类型,通过一个抽象的 base class 被封装起来。
2. 注意
(1)以一种paradigm 写程序,有助于整体行为的良好稳固,而混用的话,可能带来让人惊吓的结果,特别在没有谨慎处理的情况下。
(2)案例分析
// base class object Library thing1; // derived class object Book book; // book 被裁剪了,定义的运用是 ADT paradigm thing1 = book; // 调用的是 Library::check_in() thing1.check_in(); // 正确的做法,是 OO paradigm Library &thing2 = book; // 调用的是 Book::check_in() thing2.check_in();
(3)可以直接或间接处理继承体系中的一个 base class object,但只有通过 pointer 或 reference 的间接处理,才支持 OO 程序设计所需的多态性质。
(4)原则上,被指定的 object 的真实类型在每一个特定执行点之前,是无法解析的,通过 pointer 或 reference 的操作才能完成。
(5)在 ADT paradigm 中程序员处理的是一个拥有固定而单一类型的实体,在编译时已经完全定义好了。
(6)案例分析
// px 或 rx 是 Library object 或 subtype Library *px = retrieve_some_material(); Library &rx = *px; // dx 只能是 Library object Library dx = *px;
3. C++以下列方法支持多态
(1)经由一组隐含的转化操作。
例如把一个 derived class 指针转化为一个指向 public bass type 的指针。
shape *ps = new circle();
(2)经由 virtual function 机制。
ps->rotate();
(3)经由 dynamic_cast 和 typeid 运算符。
circle *pc = dynamic_cast< circle* >(ps);
4. 需要多少内存才能够表现一个 class object
(1)nonstatic data members 的总大小。
(2)任何由于 alignment 的需求而填补 padding 的空间。
(3)为了支持 virtual 而由内部产生的任何额外负担。
5. 指针的类型(the type of a pointer)
(1)“指向不同类型的指针”间的差异,不在其指针表示法不同,也不在其内容不同,而是在其所寻址出来的 object 类型不同。
(2)“指针类型”会教导编译器如何解释某个特定地址中的内存内容及其大小。
(3)一个类型为 void* 的指针只能够含有一个地址,而不能够通过它操作所指 object,因为不知道所涵盖的地址空间。
(4)cast 其实是一种编译器指令,大部分情况下并不改变一个指针所含的真正地址,只影响“被指出的内存的大小和内容”的解释方式。
6. 加上多态之后(adding polymorphism)
(1)pointer 或 reference 都只需要一个 word 的空间(32位机上是 4 bytes)。
(2)案例分析
// class Bear : public ZooAnimal Bear b; ZooAnimal *pz = &b; Bear *pb = &b; // virtual void rotate(); ZooAnimal::rotate pz->rotate();
pz 的类型在编译时决定:
a. 固定的可用接口。pz 只能调用 ZooAnimal 的 public 接口。
b. 接口的 access level。
在每个执行点,pz 所指的 object 类型决定 rotate() 所调用的实体。
(3)一个 pointer 或 reference 之所以支持多态,是因为它们不会引发内存中任何“与类型有关的内存委托操作”,会受到改变的只是所指内存的“大小和内容的解释方式”。
(4)C++ 也支持具体的 ADT 程序风格,被称为 object_based(OB)。
a. 例如 String class,一种非多态的数据类型,可用展示封装的非多态形式,不支持类型的扩充。
b. 一个 OB 设计可能比一个对等的 OO 设计速度更快而且空间更紧凑,但比较没有弹性。速度快是因为所有函数引发操作都在编译时完成,对象构建起来时不需要设置 virtual 机制。空间紧凑是因为不需要为了支持 virtual 而需要的额外负荷。