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