C++ Primer Plus 第十四章筆記

1.      建立has-a關係:

1)組合(包含),即創建一個包含其他類對象的類。

注意:使用公有繼承時,類可以繼承接口和實現;使用組合,類可以獲得實現但不能獲得接口,接口雖然不是共有的,但可以在類方法中使用它。

2)私有繼承。使用私有繼承,基類的公有成員和保護成員都將成爲派生類的私有成員,這意味着基類方法將不會成爲派生對象公有接口的一部分,但可以在派生類的成員函數中使用它們。使用私有繼承時,只能在派生類的方法中使用基類的方法。私有繼承通過強制類型轉換使用基類對象本身。

3)保護繼承,此時基類的公有成員和保護成員都將成爲派生類的保護成員。

總結:應使用包含來建立has-a關係,如果新類需要訪問原有類的保護成員,或需要重新定義虛函數,則應使用私有繼承。

2.      包含將對象作爲一個命名的成員對象添加到類中,而私有繼承講對象作爲一個未被命名的繼承對象添加到類中;包含使用成員名標識構造函數;私有繼承使用類名標識構造函數;使用包含時使用對象名調用方法;使用私有繼承時將使用類名和作用域解析運算符調用方法。

3.      在私有繼承中,未進行顯示類型轉換的派生類引用或指針,無法賦值給基類的引用或指針。

4.      虛基類使得從多個類(它們的基類相同)派生出的對象只繼承一個基類對象。

5.      C++在基類是虛的時候,禁止信息通過中間類自動傳遞給基類,需要顯式地調用所需的基類構造函數。對於虛基類必須這樣做,但對於非虛基類則是非法的。

6.      不能將模板成員函數放在獨立的實現文件中。

7.      類模板可以爲類型參數提供默認值。

8.      模板的具體化:

(1)      隱式實例化:它們聲明一個或多個對象,指出所需類型,而編譯器使用通用模板提供的處方生成具體的類定義,編譯器在需要對象之前,不會生成類的隱式實例化。

(2)      顯示實例化:使用關鍵字template並指出所需類型來聲明類,編譯器將生成類的顯示實例化。

(3)      顯式具體化:格式:template<> class Classname<specialized-type-name> {…}

(4)      部分具體化

9.      模板的友元:

(1)      非模板友元:將成爲模板所有實例化的友元,它使用一個模板做參數,意味着必須要爲使用的友元定義顯示實例化。

(2)      約束模板友元:需要在類定義的前面聲明每個模板函數,然後在函數中再次將模板聲明爲友元,第三需要爲友元提供模板定義。

(3)      非約束模板友元函數:通過在類內聲明模板來創建。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章