1.為了讓介面能被正確使用,a.使用函式頂替物件,通過函式來返回某些引數;b.使用新的class來封裝用作引數的資料;c.限制類內可以做的事情,譬如使用const對資料進行限制。
2.當設計乙個新的class時,要考慮很多問題:怎樣?建立和銷毀=構造與析構、初始化|賦值|copying的實現、類內成員的合法值、是否需要繼承、是否需要轉換、public|private|protected的設定、是否需要泛型化程式設計等。
3.當函式pass-by-value時,這個形參是由物件的copy建構函式產出,當函式完成時,引數傳遞的成本是一次物件的copy構造函式呼叫,一次析構。當形參的內部還包含其他類或者繼承自其他類時,構造和析構的次數就更多了。解決辦法就是pass-by-reference-to-const。reference-to-const也防止了物件切割的問題,譬如某函式的宣告type function(class a),若有乙個類class b:public a,此時如果呼叫function(b)就會導致b的所有特質化的部分全部被切割,構造時會copy成乙個a物件。「小型物件」或者內建型別並不代表他們的copying行為代價低,許多stl容器內含的東西之比乙個指標多一些,但是複製這種物件卻要承擔複製指標的每一項東西,那將是非常昂貴的。
4.當必須返回乙個物件時,不要返回乙個引用,因為這個引用可能是區域性物件的引用,該物件無論是在stack上還是在heap上都將是糟糕的,不應該引用的。總結起來就是,當必須在返回乙個reference或者乙個object之間抉擇時,應該選出正確的那乙個。乙個必須返回新物件的函式,那就直接返回乙個新物件。
5.如果類中包含成員變數是public而不是private,使用者還要花時間考慮呼叫時需不需要加小括號,同時使用函式可以實現對成員變數更精確的控制,比如對該變數的讀寫方式。此外,成員變數如果不封裝,那將意味著日後變更將變得十分麻煩。對於乙個protected成員變數而言同樣如此。因為一旦破壞這個protected變數,它的所有繼承者都要遭殃。上述的兩種情況都將意味著太多**需要重寫,重新測試,重新編寫文件,重新編譯。因此,從封裝的角度看,只有private和其他不封裝。
6.在類中,乙個呼叫許多其他成員函式的member函式帶來的封裝性,比在類外部寫乙個呼叫類中其他成員函式的non-member函式的封裝性更低。乙個類封裝性的程度可以使用可訪問私有成員的和函式數量來衡量 ,因此前文中多出來的member函式會更多地訪問私有成員,從而導致封裝性減弱。稍微說一句的是,上述的non-member函式可以是其他類中的member函式、non-member函式要與該類同屬乙個namespace。
7.通常乙個功能強大的類可能擁有大量的便利函式,某些功能之間並沒有任何的編譯相依的關係。分離他們的直接做法就是將不同的non-member函式分別宣告在不同的標頭檔案。這也正是c++標準程式庫的組成方式:每個標頭檔案分別實現std的某些機能。
8.【全特化與偏特化】如果std::swap在程式中效率不高時,可以自定義乙個swap成員函式,這個函式不要丟擲異常。【條款26】
《effective C 》讀書筆記
1,c 關鍵字explicit c 中,乙個引數的 建構函式 或者除了第乙個引數外其餘引數都有預設值的多參建構函式 承擔了兩個角色。1 是個 構造器,2 是個預設且隱含的型別轉換操作符 所以,有時候在我們寫下如 aaa 這樣的 且恰好 的型別正好是aaa單引數構造器的引數型別,這時候 編譯器就自動呼...
Effective C 讀書筆記
一 讓自己習慣c 1 條款01 視c 為聯邦語言 c 的組成可分為四部分 1.c c 仍然以c語言為基礎。區塊 語句 預處理 內建資料型別 陣列 指標等都來自c。2.object oriented c c with classes所訴說的 classes 包括構造和析構 封裝 繼承 多型 virtu...
讀書筆記 Effective C
部分條款過於深奧,部分條款已了然於心,僅記錄當下所識所學 對於常量巨集定義,最好用const代替 define 對於函式巨集定義,最好用inline代替 define include ifdef ifndef仍被需要 內建物件記得手動初始化 使用成員初始列替換賦值操作 以local static替換...