深度探索C 物件模型 4

2021-05-25 18:19:15 字數 1953 閱讀 3683

第二章主要講的的建構函式語意(semantics),這是乙個什麼意思?我的英文和中文學的都不好,但我想是書上弄錯了(也許只是乙個筆誤),也許應該翻譯成語義比較恰當。the study or science of meaning in anguage forms. 語義學以語言形式表示意思的研究或科學。我們要研究建構函式的,並且以語言的形式將它描述清楚。

看完題目我的第乙個感覺,建構函式我知道。建構函式是乙個類的成員函式,建構函式和析構函式是進行物件資料的建立,初始化,清除工作的成員函式,可以過載建構函式,使乙個類不止具備乙個建構函式,因有時需要以這些方法中的某一種分別建立不同的物件。不能過載析構函式。建構函式作為成員函式和類有相同的名字。例:乙個類名為:aclass,建構函式就是aclass()。建構函式沒有返回值,而且不能定義其返回型別,void也不行。析構函式同樣使用這一點。當編寫過載函式時,只有參數列不同,通過比較其引數個數或引數型別可以區分兩個過載函式。但是我讀完第一小段後就知道這一章要告訴我們什麼了。

這一章並不是要告訴我們什麼是建構函式,它的作用是什麼。而是要告訴我們的是建構函式是如何工作的。我的。在得知這點後我很興奮,因為我確實不知道建構函式是如何構造乙個類的物件的,並且一直想知道。我一直對物件導向神奇的功能很感興趣。為什麼乙個類在被例項化時,可以自動的完成很多任務作,使我們的主函式清晰,簡單,穩健,高效。以前只看到了表面,沒有深入,這會我們有機會去皮剔肉深入骨髓了。 書上主要討論了幾種情況:

帶有預設建構函式的成員物件。如果乙個類沒有任何的建構函式,但他有乙個成員物件,這個物件的類有乙個預設的建構函式,那麼編譯器會在需要的時候為這個類合成乙個建構函式。

舉個例子:

我們有以下幾個類。它們都有乙個建構函式。

貓; 狗;

鳥; 魚;

我們又有乙個類。寵物,我們將貓作為它的成員之一。並且沒有給它宣告建構函式。

寵物 則當需要的時候編譯器會為它合成乙個建構函式,並且採用內聯方式。大概象下面的樣子。

inline

寵物::寵物()

為什麼會這樣,我們來看看編譯器的行動。編譯器開始執行使用者的**,準備生成寵物物件之前,會首先呼叫必要的建構函式,來初始化類的成員,以便為物件分配合適的記憶體空間。結果編譯器會合成上面的建構函式,如果程式設計師為寵物類寫了乙個建構函式。 寵物::寵物()那編譯器也會將這個建構函式擴張成上面的那樣。編譯器是怎樣實現的呢?原來當乙個類沒有任何使用者定義的建構函式,而是由編譯器自動生成的話,則這個被暗中生成的建構函式將會是乙個沒有什麼用處的建構函式。但是通過編譯器的工作能夠為我們合成乙個nontrivial default constructor.

好象香港電影中演的,如果你惹上官司(你要設計乙個類),你又沒有錢去請高階的律師(沒有給出建構函式),那會給你分配乙個律師(預設的建構函式),當然這個律師的能力也許和那些大律師比起來有差距(trivial)。不過我們要知道他們也不是一點用都沒有。但是由於有律師行的督導,可以使這些律師能夠努力做到最好(nontrivial)。

同樣的道理,我們可以理解另外的幾種nontrivial default constructor的情況。

如果你的類沒有任何的建構函式,並且它派生於乙個有著預設建構函式的基類,那這個派生類的預設建構函式會被視為nontrivial,因此需要被合成出來,他的合成步驟是呼叫上一層基類的預設建構函式,並根據它們的宣告次序為派生類合成乙個建構函式。

如果類宣告或繼承了乙個虛函式,或者類派生於乙個繼承串鏈,其中有乙個或更多的虛擬基類。由於缺少使用者宣告的建構函式,則編譯器會合成乙個預設的建構函式,以便正確的初始化每乙個類物件的vptr。

最後說一點,在合成的預設建構函式中,只有基類的子物件和類的成員物件會被初始化,所有其他的非靜態資料成員都不會被初始化,因為這些操作是需要程式設計師來做的。編譯器沒有必要連這些工作都做了。 好了,這篇就寫到這裡吧。這本書真的是雷神所看過的書中,看的最慢的一本了。但這些深層的知識有必要了解的很清楚嗎,我們不知道編譯器如何合成預設的建構函式不也能寫程式嗎?雷神用侯大師的話來回答這個問題:練從難處練,用從易處用。知其然而不知其所以然,不是乙個嚴謹的學習態度。

深度探索C 物件模型

傳世經典書叢 深度探索c 物件模型 美 stanley b.lippman 斯坦利 b.李普曼 著 侯捷 譯 isbn978 7 121 14952 8 2012年1月出版 定價 69.00元 16開 356頁 宣傳語 如果你是一位c 程式設計師,渴望對於底層知識獲得乙個完整的了解,那麼本書正適合你...

深度探索C 物件模型

傳世經典書叢 深度探索c 物件模型 美 stanley b.lippman 斯坦利 b.李普曼 著 侯捷譯 isbn978 7 121 14952 8 2012年1月出版 定價 69.00元 16開 356頁 宣傳語 如果你是一位c 程式設計師,渴望對於底層知識獲得乙個完整的了解,那麼本書正適合你 ...

深度探索C 物件模型

深度探索c 物件模型 本書目錄結構如下 第1章 關於物件 object lessons 加上封裝後的布局成本 layout costs for adding encapsulation 1.1 c 模式模式 the c object model 簡單物件模型 a object model 驅動物件模...