1. C++ 程序设计模型直接支持三种程序设计典范(programming paradigms)程序员
(1)程序模型(procedural model)数组
如字符串的处理,可用使用字符数组,及 str* 函数集。函数
(2)抽象数据类型模型(abstract data type model)spa
该模型所谓的“抽象”适合一组表达式(pubic 接口)一块儿提供,而运算定义仍隐而未明。设计
(3)面向对象模型(object-oriented model)指针
此模型中有一些彼此相关的类型,经过一个抽象的 base class 被封装起来。code
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 而须要的额外负荷。