1. 程式人生 > >C++程式設計規範 8-24章

C++程式設計規範 8-24章

第八章 常量

1.不要讓常量成員函式修改程式的狀態:不要修改成員、靜態成員、、全域性變數、其他物件。

第九章 過載

1.儘量避免過載宰模板型別上:可能存在二義性

第十章 操作符

在這裡插入圖片描述

1.區分作為成員函式和作為友元的操作符:operator+=()、operator=()等都需要左值,應是成員函式;而操作符operator==()、operator+()不需要左值,應是友元

  1. 操作符作為成員函式可以確保左值一定是類物件
  2. 操作符為友元,可以使第一個運算元可以使任意型別,不一定非要是自定義類

第十一章 型別轉換

1.儘量避免強制型別轉換,如果不得不強制轉換,儘量用顯示方式

2.用虛擬函式方式取代dynamic_cast

  1. 虛擬函式不需要再編碼時確定物件的真實型別,而dynamic_cast必須告知要轉成的型別,執行時若型別不當還要丟擲一個異常,所以還需提供失敗檢測機制。
  2. 虛擬函式的執行效率遠高於dynamic_cast,因為dynamic_cast的轉換機制比虛擬函式複雜
  3. 當增加或刪除一個派生類時,dynamic_cast用法還得增減相應的程式碼
  4. 提供完善的dynamic_cast失敗檢測機制非常困難

3.使用關鍵字explicit防止單引數建構函式的型別轉換功能

4.避免多個函式提供相同的型別轉換

第十二章 友元

1.少用友元

  1. 類間高耦合
  2. 降低可繼承性

第十三章 模板

濫用模板會造成的後果:

  • 程式碼過度膨脹
  • 不好修改,容易引發“蝴蝶效應”
  • 很難確保能正常工作

1.使用模板如果有限制條件一定要註釋或在文件中描述清楚

2.模板型別應傳引用/指標而不是值

3.模板的特殊性

  1. 延遲編譯,導致錯誤被隱藏:模板是在例項化的時候才編譯
  2. 增加編譯時間:例項化模板是指程式碼中用具體的類替換模板
  3. 模板的錯誤提示比較晦澀
  4. 中斷編譯可能導致錯誤

第十四章 表示式和控制流程

1.讓表示式直觀

2.避免對浮點型別做 == 或 != 判斷

第十五章 巨集

1.徹底用常量替代(類似功能的)巨集

2.徹底用inline函式替代巨集函式

3.函式巨集的每個引數都要括起來

4.不帶引數的巨集函式也要定義成函式形式

5.用{}將函式巨集的函式體括起來

6.不要在公共標頭檔案中定義巨集

第十六章 異常處理

1.確保程式碼在異常出現時能正確處理

  1. 系統異常,要麼意味著程式有錯,要麼意味著資源不夠
  2. 異常處理代價很高,所以對無能為力的系統異常,不予考慮是明智的
  3. 自定義的異常卻要擴散出去讓別人處理,應先事先約定好,所以必須有文字描述

2.正確註釋程式碼的異常處理能力

  1. 不擴散
  2. 擴散
  3. 不知道

3.特別當心析構時發生異常

  1. C++的異常處理機制規定,若在異常處理期間又發生異常,程式將被終止
  2. 如果析構時發生異常,而這個異常又不能被該解構函式處理,則導致該解構函式被打斷

4.捕捉異常時絕不要先基類後派生類

5.捕捉異常時用引用

  1. 如果是拷貝,可能拷貝不成功
  2. 拷貝不能得到派生類物件,因為在拷貝時,派生類物件會被切削成基類
  3. 如果是指標,用完之後是否需要清除?
  4. 需要判斷指標是空嗎?如何知道該指標所指物件是否還有效

第十七章 程式碼格式

1.若某個case不需要break一定要註釋宣告

第十八章 註釋

1.儘量用英文寫註釋

2.不要用/**/註釋掉大塊程式碼,應該用#if()

第十九章 檔案和目錄

第二十章 標頭檔案

1.標頭檔案多次引用的防範

#ifndef MY_CLASS_HPP
#define MY_CLASS_HPP

#endif

2.不要在標頭檔案中定義常量/變數

3.任何宣告若被多個原始檔引用則應在一個頭檔案中

第二十一章 條件編譯

1.若使用#if或#ifdef,不要遺漏#else

  1. 確保條件 編譯的完整性
  2. 使得編譯條件選擇錯誤出現在編譯時而不是執行時

第二十二章 編譯

1.減少檔案的依賴程度

第二十三章 相容性

1.運算時顯示轉換有符號和無符號型別

2.注意雙位元組字元的相容性

3.不要強制引用/指標指向尺寸不同的目標

4.不要假設不同原始檔中靜態或全域性變數的初始化順序

5.注意資料檔案的相容性

  1. 位元組排列順序
  2. 資料對齊
  3. 行尾標誌

6.注意引用公共庫的相容性

7.程式碼中用到的路徑只用“ / ”而不要用“ \ ”

8.確保main()函式總是返回一個型別

9.不要依賴pragmas

第二十四章 效能

1.不要用移位代替乘除運算

2.返回直接構造臨時變數