Effective C++ 50条款
生活随笔
收集整理的這篇文章主要介紹了
Effective C++ 50条款
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Effective C++ 50條款
條款 1:盡量用 const 和 inline 而不用#define——盡量用編譯器而不用預(yù)處理
- #define max(a,b) ((a) > (b) ? (a) : (b))
條款 2:盡量用 < iostream >而不用<stdio.h>
條款 3:盡量用 new 和 delete 而不用 malloc 和 free
- malloc 和 free(及其變體)會產(chǎn)生問題的原因在于它們太簡單:他們不知道構(gòu)造函數(shù)和析構(gòu)函數(shù)。
- 把 new 和 delete 與 malloc 和 free 混在一起用也是個壞想法
條款 4:盡量使用 C++風格的注釋
- C++中涉及到的內(nèi)存的管理問題可以歸結(jié)為兩方面:正確地得到它和有效地使用它
條款 5:對應(yīng)的 new 和 delete 要采用相同的形式
- 用 new 的時候會發(fā)生兩件事。首先,內(nèi)存被分配,然后,為被分配的內(nèi)存調(diào)用一個或多個構(gòu)造函數(shù)。用 delete 的時候,也有兩件事發(fā)生:首先,為將被釋放的內(nèi)存調(diào)用一個或多個析構(gòu)函數(shù),然后,釋放內(nèi)存。
條款 6:析構(gòu)函數(shù)里對指針成員調(diào)用 delete
條款 7:預(yù)先準備好內(nèi)存不夠的情況
- 當內(nèi)存分配請求不能滿足時,調(diào)用你預(yù)先指定的一個出錯處理函數(shù)。這個方法基于一個常規(guī),即當 operator new 不能滿足請求時,會在拋出異常之前調(diào)用客戶指定的一個出錯處理函數(shù)——一般稱為 new-handler 函數(shù)
條款 8. 寫 operator new 和 operator delete 時要遵循常規(guī)
條款 9. 避免隱藏標準形式的 new
- 在類里定義了一個稱為“ operator new”的函數(shù)后,會不經(jīng)意地阻止了對標準 new 的訪問。一個辦法是在類里寫一個支持標準 new 調(diào)用方式的 operator new,它和標準 new 做同樣的事。另一種方法是為每一個增加到 operator new 的參數(shù)提供缺省值。
條款 10. 如果寫了 operator new 就要同時寫 operator delete
條款 11: 為需要動態(tài)分配內(nèi)存的類聲明一個拷貝構(gòu)造函數(shù)和一個賦值操作符
- 會存在內(nèi)存泄漏和重復(fù)刪除的問題
- 只要類里有指針時,就要寫自己版本的拷貝構(gòu)造函數(shù)和賦值操作符函數(shù)。
條款 12: 盡量使用初始化而不要在構(gòu)造函數(shù)里賦值
- 特別是 const 和引用數(shù)據(jù)成員只能用初始化,不能被賦值
- 用成員初始化列表比在構(gòu)造函數(shù)里賦值要好的一個原因在于效率。
- 對象的創(chuàng)建分兩步:a. 數(shù)據(jù)成員初始化。b. 執(zhí)行被調(diào)用構(gòu)造函數(shù)體內(nèi)的動作。
- 通過成員初始化列表來進行初始化總是合法的,效率也決不低于在構(gòu)造函數(shù)體內(nèi)賦值,它只會更高效。另外,它簡化了對類的維護,因為如果一個數(shù)據(jù)成員以后被修改成了必須使用成員初始化列表的某種數(shù)據(jù)類型,那么,什么也不用變。
- static 類成員永遠也不會在類的構(gòu)造函數(shù)初始化。
條款 13: 初始化列表中成員列出的順序和它們在類中聲明的順序相同
- 類成員是按照它們在類里被聲明的順序進行初始化的,和它們在成員初
始化列表中列出的順序沒一點關(guān)系。 - 基類數(shù)據(jù)成員總是在派生類數(shù)據(jù)成員之前被初始化
條款 14: 確定基類有虛析構(gòu)函數(shù)
- 當通過基類的指針去刪除派生類的對象,而基類又沒有虛析構(gòu)函數(shù)時,結(jié)果將是不可確定的。
- 如果某個類不包含虛函數(shù),那一般是表示它將不作為一個基類來使用
- 實現(xiàn)虛函數(shù)需要對象附帶一些額外信息,以使對象在運行時可以確定該調(diào)用哪個虛函數(shù)。對大多數(shù)編譯器來說,這個額外信息的具體形式是一個稱為 vptr(虛函數(shù)表指針)的指針。 vptr 指向的是一個稱為 vtbl(虛函數(shù)表)的函數(shù)指針數(shù)組。每個有虛函數(shù)的類都附帶有一個 vtbl。當對一個對象的某個虛函數(shù)進行請求調(diào)用時,實際被調(diào)用的函數(shù)是根據(jù)指向 vtbl 的 vptr 在 vtbl 里找到相應(yīng)的函數(shù)指針來確定的。
- 無故的聲明虛析構(gòu)函數(shù)和永遠不去聲明一樣是錯誤的。
- 虛析構(gòu)函數(shù)工作的方式是:最底層的派生類的析構(gòu)函數(shù)最先被調(diào)用,然后各個基類的析構(gòu)函數(shù)被調(diào)用。
- 無故的聲明虛析構(gòu)函數(shù)和永遠不去聲明一樣是錯誤的
條款 15: 讓 operator=返回*this 的引用
- 總要遵循 operator=輸入和返回的都是類對象的引用的原則
條款 16: 在 operator=中對所有數(shù)據(jù)成員賦值
條款 17: 在 operator=中檢查給自己賦值的情況
- 在賦值運算符中要特別注意可能出現(xiàn)別名的情況,其理由基于兩點。其中之一是效率。
- 另一個更重要的原因是保證正確性。
條款 18: 爭取使類的接口完整并且最小
條款 19: 分清成員函數(shù),非成員函數(shù)和友元函數(shù)。
- operator>>和 operator<<決不能是成員函數(shù)。
條款 20: 避免 public 接口出現(xiàn)數(shù)據(jù)成員
- 結(jié)論是,在 public 接口里放上數(shù)據(jù)成員無異于自找麻煩,所以要把數(shù)據(jù)成員安全地隱藏在與功能分離的高墻后
條款 21: 盡可能使用 const
- 使用 const 的好處在于它允許指定一種語意上的約束——某種對象不能被修改——編譯器具體來實施這種約束。
- 在一個函數(shù)聲明中,const 可以指的是函數(shù)的返回值,或某個參數(shù);對于成員函數(shù),還可以指的是整個函數(shù)
- const 成員函數(shù)的目的當然是為了指明哪個成員函數(shù)可以在 const 對象上被調(diào)用。但很多人忽視了這樣一個事實:僅在 const 方面有不同的成員函數(shù)可以重載。
條款 22: 盡量用“傳引用”而不用“傳值”
- 提高效率
- 避免“切割問題”
條款 23: 必須返回一個對象時不要試圖返回一個引用
條款 24: 在函數(shù)重載和設(shè)定參數(shù)缺省值間慎重選擇
- 如果可以選擇一個合適的缺省值并且只是用到一種算法,就使用缺省參數(shù)。否則,就使用函數(shù)重載。
條款 25: 避免對指針和數(shù)字類型重載
條款 26: 當心潛在的二義性
條款 27: 如果不想使用隱式生成的函數(shù)就要顯式地禁止它
- 顯式地聲明一個成員函數(shù),就防止了編譯器去自動生成它的版本;使函數(shù)為 private,就防止了別人去調(diào)用它。
條款 28: 劃分全局名字空間
條款 29: 避免返回內(nèi)部數(shù)據(jù)的句柄
- 這類問題的通用解決方案和前面關(guān)于指針的討論一樣:或者使函數(shù)為非const,或者重寫函數(shù),使之不返回句柄。
條款 30: 避免這樣的成員函數(shù):其返回值是指向成員的非 const 指針或引用,但成員的訪問級比這個函數(shù)要低
條款 31: 千萬不要返回局部對象的引用,也不要返回函數(shù)內(nèi)部用 new 初始化的指針的引用
- 寫一個返回廢棄指針的函數(shù)無異于坐等內(nèi)存泄漏的來臨。
條款 32: 盡可能地推遲變量的定義
- 內(nèi)聯(lián)函數(shù)的基本思想在于將每個函數(shù)調(diào)用以它的代碼體來替換。用不著統(tǒng)計專家出面就可以看出,這種做法很可能會增加整個目標代碼的體積。
- 要牢記在心的一條是, inline 指令就象 register,它只是對編譯器的一種提示,而不是命令。
- 一個給定的內(nèi)聯(lián)函數(shù)是否真的被內(nèi)聯(lián)取決于所用的編譯器的具體實現(xiàn)。
條款 33: 明智地使用內(nèi)聯(lián)
條款 34: 將文件間的編譯依賴性降至最低
- 句炳類:它只是把所有的函數(shù)調(diào)用都轉(zhuǎn)移到了對應(yīng)的主體類中,主體類真正完成工作。
- 協(xié)議類:協(xié)議類沒有實現(xiàn);它存在的目的是為派生類確定一個接口。所以,它一般沒有數(shù)據(jù)成員,沒有構(gòu)造函數(shù);有一個虛析構(gòu)函數(shù),還有一套純虛函數(shù),用于制定接口。
- 句柄類和協(xié)議類都不大會使用內(nèi)聯(lián)函數(shù)。使用任何內(nèi)聯(lián)函數(shù)時都要訪問實現(xiàn)細節(jié),而設(shè)計句柄類和協(xié)議類的初衷正是為了避免這種情況。
條款 35: 使公有繼承體現(xiàn) “是一個” 的含義
- 公有繼承聲稱:對基類對象適用的任何東西 ---- 任何! ---- 也適用于派生類對象。
條款 36: 區(qū)分接口繼承和實現(xiàn)繼承
條款 37: 決不要重新定義繼承而來的非虛函數(shù)
條款 38: 決不要重新定義繼承而來的缺省參數(shù)值
- 對象的靜態(tài)類型是指你聲明的存在于程序代碼文本中的類型
- 對象的動態(tài)類型是由它當前所指的對象的類型決定的。
- 虛函數(shù)是動態(tài)綁定的,意思是說,虛函數(shù)通過哪個對象被調(diào)用,具體被調(diào)用的函數(shù)就由那個對象的動態(tài)類型決定
條款 39: 避免 “向下轉(zhuǎn)換” 繼承層次
- 從一個基類指針到一個派生類指針 ---- 被稱為 “向下轉(zhuǎn)換”
條款 40: 通過分層(組合)來體現(xiàn) “有一個” 或 “用…來實現(xiàn)”
條款 41: 區(qū)分繼承和模板
條款 42: 明智地使用私有繼承
- 私有繼承意味著只是繼承實現(xiàn),接口會被忽略。
- 盡可能地使用分層,必須時才使用私有繼承
- 模板導(dǎo)致的 “代碼膨脹”
- 基于私有繼承的實現(xiàn)避免了代碼重復(fù)
- C++的各種特性是以非凡的方式相互作用的
條款 43: 明智地使用多繼承
- 二義性問題——定義新類來解決
- 基類虛擬繼承問題
條款 44: 說你想說的;理解你所說的
- 公有繼承意味著 “是一個”
- 私有繼承意味著 “用…來實現(xiàn)”
- 分層意味著 “有一個” 或 “用…來實現(xiàn)”
- 純虛函數(shù)意味著僅僅繼承函數(shù)的接口
- 簡單虛函數(shù)意味著繼承函數(shù)的接口加上一個缺省實現(xiàn)
- 非虛函數(shù)意味著繼承函數(shù)的接口加上一個強制實現(xiàn)
條款 45: 弄清 C++在幕后為你所寫、所調(diào)用的函數(shù)
條款 46: 寧可編譯和鏈接時出錯,也不要運行時出錯
條款 47: 確保非局部靜態(tài)對象在使用前被初始化
條款 48: 重視編譯器警告
條款 49: 熟悉標準庫
條款 50: 提高對 C++的認識
More Effective C++ 50條款
條款 1: 指針與引用的區(qū)別
總結(jié)
以上是生活随笔為你收集整理的Effective C++ 50条款的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 长江一帆远的下一句是什么呢?
- 下一篇: PCL1.9的PCLConfig.cma