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 而須要的額外負荷。

相關文章
相關標籤/搜索