4. 其餘C++特性

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) 來肯定一個變量或類型的大小。

相關文章
相關標籤/搜索