1. 引用參數數組
(1)將值或常引用做爲輸入參數,指針做爲輸出參數是谷歌的一個慣例。安全
2. 函數重載函數
(1)利:可使代碼更直觀。對模板化的代碼,重載多是必須的。對訪問控制器的實現,重載也是很方便的。性能
(2)弊:函數僅以參數類型不一樣來重載,則須要深刻理解參數匹配規則。子類重寫基類函數也會引發迷惑。單元測試
(3)重載時,考慮根據其參數名來命名函數。如 AppendString() 比 Append() 好。測試
3. 默認參數ui
(1)默認參數會引發代碼更難維護的問題。spa
4. 可變長度數組和內存申請指針
(1)可變長度數組和 alloc() 不是 C++ 標準的一部分,根據程序棧容量來申請空間,可能引發內存覆蓋缺陷。日誌
(2)使用更安全的內存申請函數,如 scoped_ptr/scoped_array。
5. 友元
(1)適度使用友元類和友元函數是容許的。
(2)友元應該和其友元類定義在同一文件中。
(3)友元僅是擴展而不是打破類的封裝性。一個類須要訪問另外一個類的私有成員時,友元比這個成員被公有化更好。
(4)另外,類和類的協做只能經過公有成員。
6. 異常處理
(1)一般不使用 C++ 的異常處理。
7. 運行時類型信息
(1)不建議使用 RTTI。
(2)除單元測試,不要使用 RTTI。確實須要基於對象類型來完成不一樣的功能時,考慮替代方案。虛方法是使子類執行不一樣代碼的首選方案。
8. 類型轉換
(1)使用 static_cast 進行 C 風格的值轉換,或將子類指針提高爲基本指針。
(2)使用 const_cast 去掉 const 修飾。
(3)使用 reinterpret_cast 進行不安全的指針類型轉換。
(4)dynamic_cast 僅用在測試中。
9. 流
(1)流(stream)的構造和析構函數會自動打開、關閉相關文件。
(2)除非須要日誌接口,不然不要使用流。
10. 前置自增和前置自減
(1)不考慮返回值時,前置性能老是優於後置。如 i 是一個迭代器或非標量類型,後置須要複製 i,而複製的開銷是很大的。
11. const 修飾符的使用
(1)建議使用 const 修飾的狀況
a. 函數不修改經過引用或指針傳遞的參數值;
b. 類方法儘可能定義成 const。如訪問器、不修改類數據成員、不調用非 const 方法、不返回非 const 引用或指針的函數;
c. 初始化後,不須要修改的數據成員;
12. 整型類型
(1)在 stdint.h 中定義了 int16_t、uint32_t,int64_t 等整型,用到整型時,首選這些精確的類型。
(2)不要使用無符號 uint32_t,除非確切知道要存儲的是一個位組而不是一個數字,或定義二進制補碼溢出。
(3)不要使用無符號類型來講明一個數時非負的,應該用斷言來講明。
13. 64位兼容性
(1)
// size_t的輸出宏,基於inttypes.h的風格 #ifdef _LP64 #define __PRIS_PREFIX 「z」 #else #define __PRIS_PREFIX #endif //在printf格式字符串中的%後使用這些宏來確保正確的32/64位行爲 //用法以下: // size_t size = records.size(); // printf(「%」PRIus」\n」,size); #define PRIdS __PRIS_PREFIX 「d」 #define PRIoS __PRIS_PREFIX 「o」 #define PRIuS __PRIS_PREFIX 「u」 #define PRIxS __PRIS_PREFIX 「x」 #define PRIXS __PRIS_PREFIX 「X」
(2)sizeof(void*) != sizeof(int),須要指針大小的整數,使用 intptr_t。
(3)聲明64位常量時,使用 LL 或 ULL 後綴。
14. 預處理宏
(1)使用宏時,應該倍加當心。儘可能使用內聯函數、枚舉、常量來替代宏。
(2)能夠避免大量使用宏引發的問題的作法
a. 不在頭文件中定義宏;
b. 使用宏前定義(#define),使用後當即解定義(#undef);
c. 不要解定義一個宏後,使用它去定義另外一個宏;
d. 不要使用致使不平衡 C++ 構造的宏;
e. 不要使用 # 做爲函數、類、變量名稱的開始;
15. 0 和 NULL
(1)整型用0、實數用0.0、指針用 NULL、字符用'\0'。
(2)GCC4.1.0 下,sizeof(NULL) 和 sizeof(0) 不相等。
16. sizeof運算符
(1)儘可能使用 sizeof(varname),而不是 sizeof(type) 來肯定一個變量或類型的大小。