1: 初始化效率要高效。
所有的成員變量初始化通過 初始化列表實現。
如果放在類的構造函數裡面初始化,效率會低!
因為:在進入類的構造函數之前,類必須是一個已經構造好的類了!也就是,其內部成員變量也已經被構造好了。也就是進入構造函數之前所有的內部成員變量都已經執行了參數為空的構造(假設沒有用初始化列表)。
如果你實現了構造函數,那麼編譯器會生成調用構造函數的代碼,這裡的代碼已經不是構造了,變成了修改!
m_classB = _B; // 這裡執行的是 賦值運算,而不是copy構造函數。m_classB已經被構造起來了。
效率低顯而易見;
代碼驗證:
class SA
{
public:
SA( int i ):_i(i){};
int _i;
};
class F_SA
{
public:
F_SA( const SA& sa ){ m_sa = sa; }// 錯誤
//F_SA( int i=0 ):m_sa(i){ } // 正確
SA m_sa;
};
int _tmain( int argc, TCHAR* argv[] )
{
F_SA fsa; // 編譯失敗!!! m_sa通過初始化列表初始化失敗!沒有和合適構造函數調用!
system( "pause" );
return 0;
}
2:防止在構造函數中資源洩漏。
見Effective C++ 條款十 可以通過auto_ptr<>封裝的指針,就可以能自動資源回收
3:如果構造失敗,應該向上跑出異常。
假設有一個成員變量指針,通過初始化列表申請內存,那麼如果其失敗,其會自動拋出異常向上傳遞。不用擔心《此刻注意條款2中的資源洩漏》
本地拋出的異常必須本地處理,直接扔給外部的做法是不負責任的。本地處理後,視異常的情況和系統要求,再過濾給外部調用者,即客戶,後一動作稱為“上拋”。