日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Effective C++ 50条款

發(fā)布時間:2023/11/27 生活经验 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Effective C++ 50条款 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Effective C++ 50條款


條款 1:盡量用 const 和 inline 而不用#define——盡量用編譯器而不用預(yù)處理

  1. #define max(a,b) ((a) > (b) ? (a) : (b))

條款 2:盡量用 < iostream >而不用<stdio.h>

條款 3:盡量用 new 和 delete 而不用 malloc 和 free

  1. malloc 和 free(及其變體)會產(chǎn)生問題的原因在于它們太簡單:他們不知道構(gòu)造函數(shù)和析構(gòu)函數(shù)。
  2. 把 new 和 delete 與 malloc 和 free 混在一起用也是個壞想法

條款 4:盡量使用 C++風格的注釋

  1. C++中涉及到的內(nèi)存的管理問題可以歸結(jié)為兩方面:正確地得到它和有效地使用它

條款 5:對應(yīng)的 new 和 delete 要采用相同的形式

  1. 用 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)存不夠的情況

  1. 當內(nèi)存分配請求不能滿足時,調(diào)用你預(yù)先指定的一個出錯處理函數(shù)。這個方法基于一個常規(guī),即當 operator new 不能滿足請求時,會在拋出異常之前調(diào)用客戶指定的一個出錯處理函數(shù)——一般稱為 new-handler 函數(shù)

條款 8. 寫 operator new 和 operator delete 時要遵循常規(guī)

條款 9. 避免隱藏標準形式的 new

  1. 在類里定義了一個稱為“ 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ù)和一個賦值操作符

  1. 會存在內(nèi)存泄漏和重復(fù)刪除的問題
  2. 只要類里有指針時,就要寫自己版本的拷貝構(gòu)造函數(shù)和賦值操作符函數(shù)。

條款 12: 盡量使用初始化而不要在構(gòu)造函數(shù)里賦值

  1. 特別是 const 和引用數(shù)據(jù)成員只能用初始化,不能被賦值
  2. 用成員初始化列表比在構(gòu)造函數(shù)里賦值要好的一個原因在于效率。
  3. 對象的創(chuàng)建分兩步:a. 數(shù)據(jù)成員初始化。b. 執(zhí)行被調(diào)用構(gòu)造函數(shù)體內(nèi)的動作。
  4. 通過成員初始化列表來進行初始化總是合法的,效率也決不低于在構(gòu)造函數(shù)體內(nèi)賦值,它只會更高效。另外,它簡化了對類的維護,因為如果一個數(shù)據(jù)成員以后被修改成了必須使用成員初始化列表的某種數(shù)據(jù)類型,那么,什么也不用變。
  5. static 類成員永遠也不會在類的構(gòu)造函數(shù)初始化。

條款 13: 初始化列表中成員列出的順序和它們在類中聲明的順序相同

  1. 類成員是按照它們在類里被聲明的順序進行初始化的,和它們在成員初
    始化列表中列出的順序沒一點關(guān)系。
  2. 基類數(shù)據(jù)成員總是在派生類數(shù)據(jù)成員之前被初始化

條款 14: 確定基類有虛析構(gòu)函數(shù)

  1. 當通過基類的指針去刪除派生類的對象,而基類又沒有虛析構(gòu)函數(shù)時,結(jié)果將是不可確定的。
  2. 如果某個類不包含虛函數(shù),那一般是表示它將不作為一個基類來使用
  3. 實現(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ù)指針來確定的。
  4. 無故的聲明虛析構(gòu)函數(shù)和永遠不去聲明一樣是錯誤的。
  5. 虛析構(gòu)函數(shù)工作的方式是:最底層的派生類的析構(gòu)函數(shù)最先被調(diào)用,然后各個基類的析構(gòu)函數(shù)被調(diào)用。
  6. 無故的聲明虛析構(gòu)函數(shù)和永遠不去聲明一樣是錯誤的

條款 15: 讓 operator=返回*this 的引用

  1. 總要遵循 operator=輸入和返回的都是類對象的引用的原則

條款 16: 在 operator=中對所有數(shù)據(jù)成員賦值

條款 17: 在 operator=中檢查給自己賦值的情況

  1. 在賦值運算符中要特別注意可能出現(xiàn)別名的情況,其理由基于兩點。其中之一是效率。
  2. 另一個更重要的原因是保證正確性。

條款 18: 爭取使類的接口完整并且最小

條款 19: 分清成員函數(shù),非成員函數(shù)和友元函數(shù)。

  1. operator>>和 operator<<決不能是成員函數(shù)。

條款 20: 避免 public 接口出現(xiàn)數(shù)據(jù)成員

  1. 結(jié)論是,在 public 接口里放上數(shù)據(jù)成員無異于自找麻煩,所以要把數(shù)據(jù)成員安全地隱藏在與功能分離的高墻后

條款 21: 盡可能使用 const

  1. 使用 const 的好處在于它允許指定一種語意上的約束——某種對象不能被修改——編譯器具體來實施這種約束。
  2. 在一個函數(shù)聲明中,const 可以指的是函數(shù)的返回值,或某個參數(shù);對于成員函數(shù),還可以指的是整個函數(shù)
  3. const 成員函數(shù)的目的當然是為了指明哪個成員函數(shù)可以在 const 對象上被調(diào)用。但很多人忽視了這樣一個事實:僅在 const 方面有不同的成員函數(shù)可以重載。

條款 22: 盡量用“傳引用”而不用“傳值”

  1. 提高效率
  2. 避免“切割問題”

條款 23: 必須返回一個對象時不要試圖返回一個引用

條款 24: 在函數(shù)重載和設(shè)定參數(shù)缺省值間慎重選擇

  1. 如果可以選擇一個合適的缺省值并且只是用到一種算法,就使用缺省參數(shù)。否則,就使用函數(shù)重載。

條款 25: 避免對指針和數(shù)字類型重載

條款 26: 當心潛在的二義性

條款 27: 如果不想使用隱式生成的函數(shù)就要顯式地禁止它

  1. 顯式地聲明一個成員函數(shù),就防止了編譯器去自動生成它的版本;使函數(shù)為 private,就防止了別人去調(diào)用它。

條款 28: 劃分全局名字空間

條款 29: 避免返回內(nèi)部數(shù)據(jù)的句柄

  1. 這類問題的通用解決方案和前面關(guān)于指針的討論一樣:或者使函數(shù)為非const,或者重寫函數(shù),使之不返回句柄。

條款 30: 避免這樣的成員函數(shù):其返回值是指向成員的非 const 指針或引用,但成員的訪問級比這個函數(shù)要低

條款 31: 千萬不要返回局部對象的引用,也不要返回函數(shù)內(nèi)部用 new 初始化的指針的引用

  1. 寫一個返回廢棄指針的函數(shù)無異于坐等內(nèi)存泄漏的來臨。

條款 32: 盡可能地推遲變量的定義

  1. 內(nèi)聯(lián)函數(shù)的基本思想在于將每個函數(shù)調(diào)用以它的代碼體來替換。用不著統(tǒng)計專家出面就可以看出,這種做法很可能會增加整個目標代碼的體積。
  2. 要牢記在心的一條是, inline 指令就象 register,它只是對編譯器的一種提示,而不是命令。
  3. 一個給定的內(nèi)聯(lián)函數(shù)是否真的被內(nèi)聯(lián)取決于所用的編譯器的具體實現(xiàn)。

條款 33: 明智地使用內(nèi)聯(lián)

條款 34: 將文件間的編譯依賴性降至最低

  1. 句炳類:它只是把所有的函數(shù)調(diào)用都轉(zhuǎn)移到了對應(yīng)的主體類中,主體類真正完成工作。
  2. 協(xié)議類:協(xié)議類沒有實現(xiàn);它存在的目的是為派生類確定一個接口。所以,它一般沒有數(shù)據(jù)成員,沒有構(gòu)造函數(shù);有一個虛析構(gòu)函數(shù),還有一套純虛函數(shù),用于制定接口。
  3. 句柄類和協(xié)議類都不大會使用內(nèi)聯(lián)函數(shù)。使用任何內(nèi)聯(lián)函數(shù)時都要訪問實現(xiàn)細節(jié),而設(shè)計句柄類和協(xié)議類的初衷正是為了避免這種情況。

條款 35: 使公有繼承體現(xiàn) “是一個” 的含義

  1. 公有繼承聲稱:對基類對象適用的任何東西 ---- 任何! ---- 也適用于派生類對象。

條款 36: 區(qū)分接口繼承和實現(xiàn)繼承

條款 37: 決不要重新定義繼承而來的非虛函數(shù)

條款 38: 決不要重新定義繼承而來的缺省參數(shù)值

  1. 對象的靜態(tài)類型是指你聲明的存在于程序代碼文本中的類型
  2. 對象的動態(tài)類型是由它當前所指的對象的類型決定的。
  3. 虛函數(shù)是動態(tài)綁定的,意思是說,虛函數(shù)通過哪個對象被調(diào)用,具體被調(diào)用的函數(shù)就由那個對象的動態(tài)類型決定

條款 39: 避免 “向下轉(zhuǎn)換” 繼承層次

  1. 從一個基類指針到一個派生類指針 ---- 被稱為 “向下轉(zhuǎn)換”

條款 40: 通過分層(組合)來體現(xiàn) “有一個” 或 “用…來實現(xiàn)”

條款 41: 區(qū)分繼承和模板

條款 42: 明智地使用私有繼承

  1. 私有繼承意味著只是繼承實現(xiàn),接口會被忽略。
  2. 盡可能地使用分層,必須時才使用私有繼承
  3. 模板導(dǎo)致的 “代碼膨脹”
  4. 基于私有繼承的實現(xiàn)避免了代碼重復(fù)
  5. C++的各種特性是以非凡的方式相互作用的

條款 43: 明智地使用多繼承

  1. 二義性問題——定義新類來解決
  2. 基類虛擬繼承問題

條款 44: 說你想說的;理解你所說的

  1. 公有繼承意味著 “是一個”
  2. 私有繼承意味著 “用…來實現(xiàn)”
  3. 分層意味著 “有一個” 或 “用…來實現(xiàn)”
  4. 純虛函數(shù)意味著僅僅繼承函數(shù)的接口
  5. 簡單虛函數(shù)意味著繼承函數(shù)的接口加上一個缺省實現(xiàn)
  6. 非虛函數(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。