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