[程式設計規範]二、宣告、定義、初始化
阿新 • • 發佈:2019-02-10
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指標只有在建構函式結束後才可使用
- 需要用到虛擬函式。注意構造和解構函式中使用虛擬函式會引起未定義行為,禁止使用。
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_; };