1. 程式人生 > >[程式設計規範]二、宣告、定義、初始化

[程式設計規範]二、宣告、定義、初始化

1.禁止使用memcpy memset 初始化非POD物件

POD(Plain Old Data)主要包括 int,char,float,double,enum,void,指標等原始型別和其集合。

非POD型別,可能含有虛擬函式,導致記憶體佈局不確定,使用memset可能會帶來問題。比如示例

memset(this, 0, sizeof(this));

在這個程式碼中,將虛擬函式表指標vptr置為空,呼叫空指標,程式會異常退出。

2.變數使用時才宣告並初始化

避免了使用變數時未賦初值的錯誤。

節省資源和方便程式碼閱讀。因為一開始就宣告並且初始化一堆預設值,是對資源的浪費,程式及有可能提前退出,而且不方便閱讀,看個程式碼總是要拉到函式開始處去看變數初始值。

3.避免建構函式中過於複雜的初始化

一般建議僅僅在建構函式中做值的初始化,複雜的構造放在init函式中進行,以下幾種情況尤其推薦使用init函式

  • 需要提供初始化資訊
  • 初始化可能丟擲異常
  • 初始化可能會失敗,引起不確定狀態
  • 依賴this指標,this指標只有在建構函式結束後才可使用
  • 需要用到虛擬函式。注意構造和解構函式中使用虛擬函式會引起未定義行為,禁止使用。
4.初始化列表要嚴格按照成員宣告的順序進行編寫 因為編譯器會按照資料成員在類中的宣告順序進行初始化,而不是初始化列表的順序,主要是為了避免理解混淆和順序依賴的BUG。
class Employee { 
public: 
Employee(const char* firstName, const char* lastName) 
<span style="white-space:pre">	</span>:firstName_(firstName), lastName_(lastName), email_(firstName_ + "." + lastName_ + "@huawei.com") {}; 
private: 
string email_, firstName_, lastName_;
 };