C++程式設計規範 8-24章
第八章 常量
1.不要讓常量成員函式修改程式的狀態:不要修改成員、靜態成員、、全域性變數、其他物件。
第九章 過載
1.儘量避免過載宰模板型別上:可能存在二義性
第十章 操作符
1.區分作為成員函式和作為友元的操作符:operator+=()、operator=()等都需要左值,應是成員函式;而操作符operator==()、operator+()不需要左值,應是友元
- 操作符作為成員函式可以確保左值一定是類物件
- 操作符為友元,可以使第一個運算元可以使任意型別,不一定非要是自定義類
第十一章 型別轉換
1.儘量避免強制型別轉換,如果不得不強制轉換,儘量用顯示方式
2.用虛擬函式方式取代dynamic_cast
- 虛擬函式不需要再編碼時確定物件的真實型別,而dynamic_cast必須告知要轉成的型別,執行時若型別不當還要丟擲一個異常,所以還需提供失敗檢測機制。
- 虛擬函式的執行效率遠高於dynamic_cast,因為dynamic_cast的轉換機制比虛擬函式複雜
- 當增加或刪除一個派生類時,dynamic_cast用法還得增減相應的程式碼
- 提供完善的dynamic_cast失敗檢測機制非常困難
3.使用關鍵字explicit防止單引數建構函式的型別轉換功能
4.避免多個函式提供相同的型別轉換
第十二章 友元
1.少用友元
- 類間高耦合
- 降低可繼承性
第十三章 模板
濫用模板會造成的後果:
- 程式碼過度膨脹
- 不好修改,容易引發“蝴蝶效應”
- 很難確保能正常工作
1.使用模板如果有限制條件一定要註釋或在文件中描述清楚
2.模板型別應傳引用/指標而不是值
3.模板的特殊性
- 延遲編譯,導致錯誤被隱藏:模板是在例項化的時候才編譯
- 增加編譯時間:例項化模板是指程式碼中用具體的類替換模板
- 模板的錯誤提示比較晦澀
- 中斷編譯可能導致錯誤
第十四章 表示式和控制流程
1.讓表示式直觀
2.避免對浮點型別做 == 或 != 判斷
第十五章 巨集
1.徹底用常量替代(類似功能的)巨集
2.徹底用inline函式替代巨集函式
3.函式巨集的每個引數都要括起來
4.不帶引數的巨集函式也要定義成函式形式
5.用{}將函式巨集的函式體括起來
6.不要在公共標頭檔案中定義巨集
第十六章 異常處理
1.確保程式碼在異常出現時能正確處理
- 系統異常,要麼意味著程式有錯,要麼意味著資源不夠
- 異常處理代價很高,所以對無能為力的系統異常,不予考慮是明智的
- 自定義的異常卻要擴散出去讓別人處理,應先事先約定好,所以必須有文字描述
2.正確註釋程式碼的異常處理能力
- 不擴散
- 擴散
- 不知道
3.特別當心析構時發生異常
- C++的異常處理機制規定,若在異常處理期間又發生異常,程式將被終止
- 如果析構時發生異常,而這個異常又不能被該解構函式處理,則導致該解構函式被打斷
4.捕捉異常時絕不要先基類後派生類
5.捕捉異常時用引用
- 如果是拷貝,可能拷貝不成功
- 拷貝不能得到派生類物件,因為在拷貝時,派生類物件會被切削成基類
- 如果是指標,用完之後是否需要清除?
- 需要判斷指標是空嗎?如何知道該指標所指物件是否還有效
第十七章 程式碼格式
1.若某個case不需要break一定要註釋宣告
第十八章 註釋
1.儘量用英文寫註釋
2.不要用/**/註釋掉大塊程式碼,應該用#if()
第十九章 檔案和目錄
第二十章 標頭檔案
1.標頭檔案多次引用的防範
#ifndef MY_CLASS_HPP
#define MY_CLASS_HPP
#endif
2.不要在標頭檔案中定義常量/變數
3.任何宣告若被多個原始檔引用則應在一個頭檔案中
第二十一章 條件編譯
1.若使用#if或#ifdef,不要遺漏#else
- 確保條件 編譯的完整性
- 使得編譯條件選擇錯誤出現在編譯時而不是執行時
第二十二章 編譯
1.減少檔案的依賴程度
第二十三章 相容性
1.運算時顯示轉換有符號和無符號型別
2.注意雙位元組字元的相容性
3.不要強制引用/指標指向尺寸不同的目標
4.不要假設不同原始檔中靜態或全域性變數的初始化順序
5.注意資料檔案的相容性
- 位元組排列順序
- 資料對齊
- 行尾標誌
6.注意引用公共庫的相容性
7.程式碼中用到的路徑只用“ / ”而不要用“ \ ”
8.確保main()函式總是返回一個型別
9.不要依賴pragmas
第二十四章 效能
1.不要用移位代替乘除運算
2.返回直接構造臨時變數