摘要:
设置一次,到处是用:在构造函数中,使用初始化代替复制来设置成员变量,能够防止发生不必要的运行时操作,而输入代码的工作量则保持不变。
构造函数会在系统内部生成初始化代码。考虑如下代码:
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表达式。当然,最好是一开始就没有这种不安全的无属主资源。