1.3 对象的差别

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 而须要的额外负荷。

相关文章
相关标签/搜索