天天看點

C++學習筆記(五)

41. 複制對象

勿忘其每一個成分,自己編寫copying函數,要確定:複制所有local成員變量;調用所有base classes内的适當copying函數。不要嘗試以某個copying函數實作另一個copying函數。應該将共同機能放進第三個函數中,并由兩個copying函數共同調用。

42.傳回reference

必須傳回對象時,别妄想傳回其reference。任何時候看到一個reference聲明式,都應該立刻問自己,它的另一個名稱是什麼,因為它一定是某物的另一個名稱。

絕不要傳回point或reference指向一個local stack對象,或傳回reference指向一個heap-allocated對象,或傳回pointer或reference指向一個local static對象而有可能同時需要多個這樣的對象。

43. private繼承

private繼承主要用于“當一個意欲成為derived class者想通路一個意欲成為base class者的protected成分,或為了重新定義一或多個virtual函數EBO empty base optimization 空白基類最優化,隻适用于單一繼承。和複合不同,private繼承可以造成empty base最優化。這對緻力于“對象尺寸最小化”的程式庫開發者而言,可能很重要。

44. 明智而審慎的使用多重繼承

C++編譯器解析重載函數調用的規則:在看到是否有個函數可取用之前,C++首先确認這個函數對此調用的最佳比對。找出最佳比對函數後才檢驗其可取用性。

virtual base的初始化責任是由繼承體系中的最低層class 負責。這暗示:classes若派生自virtual bases而需要初始化,必須認知其virtual bases——不論那些bases距離多遠;當一個新的derived class加入繼承體系中,它必須承擔起virtual bases(不論直接還是間接)的初始化責任

45. virtual base classes: 

非必須;如果必須使用,盡可能避免在其中放置資料。virtual繼承會增加大小,速度,初始化(及指派)複雜度等等成本。如果virtual base classes不帶任何資料,将是最具實用價值的情況。多重繼承的确有正當用途。其中一個情節涉及"public繼承某個Interface class"和"private 繼承某個協助實作的class"的兩相組合。

46. IO類

IO類(istream,ostream)屬于不能被拷貝的類,是以隻能通過引用來傳遞他們。

47. 構造函數

構造函數不能聲明稱const的,當建立類的一個const對象時,知道構造函數完成初始化過程,對象才能真正獲得其常量屬性。是以,構造函數在const對象的構造過程中可以向其寫值。

隻有當類沒有聲明任何構造函數時,編譯器才會自動地生成預設的構造函數。是以,對于一個普通的類來說,必須定義它自己的預設構造函數,而不應該交給編譯器。

C++11 提出在狗仔函數的參數清單後寫上 =default 以表明要求編譯器生成預設構造函數。這條語句既可以和聲明出現在一起出現在類的内部,也可以出現在類的外部。

繼續閱讀