原创 Effective C++ 2e Item28

條款28: 劃分全局名字空間 全局空間最大的問題在於它本身僅有一個。在大的軟件項目中,經常會有不少人把他們定義的名字都放在這個單一的空間中,從而不可避免地導致名字衝突。例如,假設library1.h定義了一些常量,其中包括: const

原创 Effective C++ 2e Item43

條款43: 明智地使用多繼承 要看是誰來說,多繼承(MI)要麼被認爲是神來之筆,要麼被當成是魔鬼的造物。支持者宣揚說,它是對真實世界問題進行自然模型化所必需的;而批評者爭論說,它太慢,難以實現,功能卻不比單繼承強大。更讓人爲難的是,面向對

原创 Effective C++ 2e Item27

條款27: 如果不想使用隱式生成的函數就要顯式地禁止它 假設想寫一個類模板Array,它所生成的類除了可以進行上下限檢查外,其它行爲和C++標準數組一樣。設計中面臨的一個問題是怎麼禁止掉Array對象之間的賦值操作,因爲對標準C++數組來

原创 Effective C++ 2e Item29

類和函數: 實現 C++是一種高度類型化的語言,所以,給出合適的類和模板的定義以及合適的函數聲明是整個設計工作中最大的一部分。按理說,只要這部分做好了,類、模板以及函數的實現就不容易出問題。但是,往往人們還是會犯錯。 犯錯的原因有的是不小

原创 Effective C++ 2e Item36

條款36: 區分接口繼承和實現繼承 (公有)繼承的概念看起來很簡單,進一步分析,會發現它由兩個可分的部分組成:函數接口的繼承和函數實現的繼承。這兩種繼承類型的區別和本書簡介中所討論的函數聲明和函數定義間的區別是完全一致的。 作爲類的設計者

原创 Effective C++ 2e Item39

條款39: 避免 "向下轉換" 繼承層次 在當今喧囂的經濟時代,關注一下我們的金融機構是個不錯的主意。所以,看看下面這個有關銀行帳戶的協議類(Protocol class )(參見條款34): class Person { ... };

原创 Effective C++ 2e Item41

條款41: 區分繼承和模板 考慮下面兩個設計問題: · 作爲一位立志獻身計算機科學的學生,你想設計一個類來表示對象的堆棧。這將需要多個不同的類,因爲每個堆棧中的元素必須是同類的,即,它裏面包含的必須只是同種類型的對象。例如,會有一個類來表

原创 Effective C++ 2e Item24

條款24: 在函數重載和設定參數缺省值間慎重選擇 會對函數重載和設定參數缺省值產生混淆的原因在於,它們都允許一個函數以多種方式被調用: void f();                             // f被重載void f

原创 Effective C++ 2e Item31

條款31: 千萬不要返回局部對象的引用,也不要返回函數內部用new初始化的指針的引用 本條款聽起來很複雜,其實不然。它只是一個很簡單的道理,真的,相信我。 先看第一種情況:返回一個局部對象的引用。它的問題在於,局部對象 ----- 顧名思

原创 Effective C++ 2e Item32

條款32: 儘可能地推遲變量的定義 是的,我們同意C語言中變量要放在模塊頭部定義的規定;但在C++中,還是取消這種做法吧,它沒必要,不自然,而且昂貴。 還記得嗎?如果定義了一個有構造函數和析構函數的類型的變量,當程序運行到變量定義之處時,

原创 Effective C++ 2e Item40

  條款40: 通過分層來體現 "有一個" 或 "用...來實現" 使某個類的對象成爲另一個類的數據成員,從而實現將一個類構築在另一個類之上,這一過程稱爲 "分層"(Layering)。例如: class Address { ... };

原创 Effective C++ 2e Item25

條款25: 避免對指針和數字類型重載 快速搶答:什麼是“零”? 更明確地說,下面的代碼會發生什麼? void f(int x);void f(string *ps); f(0);                        // 調用f

原创 Effective C++ 2e Item33

條款33: 明智地使用內聯 內聯函數------多妙的主意啊!它們看起來象函數,運作起來象函數,比宏(macro)要好得多(參見條款1),使用時還不需要承擔函數調用的開銷。你還能對它們要求更多嗎? 然而,你從它們得到的確實比你想象的要多,

原创 Effective C++ 2e Item37

條款37: 決不要重新定義繼承而來的非虛函數 有兩種方法來看待這個問題:理論的方法和實踐的方法。讓我們先從實踐的方法開始。畢竟,理論家一般都很耐心。 假設類D公有繼承於類B,並且類B中定義了一個公有成員函數mf。mf的參數和返回類型不重要

原创 Effective C++ 2e Item38

    條款38: 決不要重新定義繼承而來的缺省參數值 讓我們從一開始就把問題簡化。缺省參數只能作爲函數的一部分而存在;另外,只有兩種函數可以繼承:虛函數和非虛函數。因此,重定義缺省參數值的唯一方法是重定義一個繼承而來的函數。然而,重定義