閱讀364 返回首頁    go 阿裏雲 go 技術社區[雲棲]


C++編程規範之48:在構造函數中使用初始化代替賦值

摘要:

    設置一次,到處是用:在構造函數中,使用初始化代替複製來設置成員變量,能夠防止發生不必要的運行時操作,而輸入代碼的工作量則保持不變。

    構造函數會在係統內部生成初始化代碼。考慮如下代碼:

class Employee
{
         string firstName, lastName;
public:
         Employee(){ firstName ="Leo"; lastName = "Chu" }
};


    實際上,生成的構造函數代碼將類似於:

Employee():firstName_(), lastName_(){ firstName_ = "Leo"; lastName_ ="Chu" }

    也就是說,並未顯式初始化的對象將使用其默認構造函數自動初始化,然後使用複製操作符進行賦值。非簡單(nontrivial)對象的賦值操作符所做的比構造函數還稍多一點,因為它要處理已經構造了的對象。

有話直說最好:在初始化列表中初始化成員變量,代碼表達意圖更加明確,而且錦山添花的是,代碼通常還會更小、更快。

Employee():firstName_("Leo"), lastName_("Chu"){  }

    這可不是不成熟的優化,這是在避免不成熟的劣化。

例外情況:

    應該總是在構造函數體內而不是初始化列表中執行非托管資源獲取,比如並不立即將結果傳遞給智能指針構造函數的new表達式。當然,最好是一開始就沒有這種不安全的無屬主資源。

最後更新:2017-04-03 12:55:19

  上一篇:go MFC 列表控件CListCtrl加載類似QQ界麵的頭像與文字
  下一篇:go mysql連接失敗或出現“Too many connections”錯誤