C++编程规范之48:在构造函数中使用初始化代替赋值
2014-02-28 13:04
232 查看
摘要:
设置一次,到处是用:在构造函数中,使用初始化代替复制来设置成员变量,能够防止发生不必要的运行时操作,而输入代码的工作量则保持不变。
构造函数会在系统内部生成初始化代码。考虑如下代码:
实际上,生成的构造函数代码将类似于:
Employee():firstName_(), lastName_(){ firstName_ = "Leo"; lastName_ ="Chu" }
也就是说,并未显式初始化的对象将使用其默认构造函数自动初始化,然后使用复制操作符进行赋值。非简单(nontrivial)对象的赋值操作符所做的比构造函数还稍多一点,因为它要处理已经构造了的对象。
有话直说最好:在初始化列表中初始化成员变量,代码表达意图更加明确,而且锦山添花的是,代码通常还会更小、更快。
Employee():firstName_("Leo"), lastName_("Chu"){ }
这可不是不成熟的优化,这是在避免不成熟的劣化。
例外情况:
应该总是在构造函数体内而不是初始化列表中执行非托管资源获取,比如并不立即将结果传递给智能指针构造函数的new表达式。当然,最好是一开始就没有这种不安全的无属主资源。
设置一次,到处是用:在构造函数中,使用初始化代替复制来设置成员变量,能够防止发生不必要的运行时操作,而输入代码的工作量则保持不变。
构造函数会在系统内部生成初始化代码。考虑如下代码:
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表达式。当然,最好是一开始就没有这种不安全的无属主资源。
相关文章推荐
- C++构造函数对类成员变量初始化,使用初始化列表和构造函数内部直接赋值 的区别
- 条款12: 尽量使用初始化而不要在构造函数里赋值
- Effective C++学习笔记:尽量使用初始化而不要在构造函数里赋值
- 条款12: 尽量使用初始化而不要在构造函数里赋值(effectiveC++)
- 条款12:尽量使用初始化而不要在构造函数里赋值
- 为什么尽量使用初始化而不要在构造函数里赋值
- 为什么对于类的const成员,只能使用初始化列表,而不能在构造函数内部进行赋值操作
- 尽量使用初始化而不要在构造函数里赋值
- 条款 12: 尽量使用初始化而不要在构造函数里赋值
- Effective C++学习笔记之“尽量使用初始化而不要在构造函数里赋值”
- 尽量使用初始化而不要在构造函数里赋值
- 尽量使用初始化而不要在构造函数里赋值(转自effective c++ )
- 尽量使用初始化而不要在构造函数里赋值
- 尽量使用初始化而不要在构造函数里赋值
- 条款12: 尽量使用初始化而不要在构造函数里赋值
- 条款十二: 尽量使用初始化而不要在构造函数里赋值
- 何时构造函数必须使用初始化列表而不是赋值
- C++中使用初始化列表比在构造函数中对成员变量赋值更高效
- 何时构造函数必须使用初始化列表而不是赋值
- C++中使用初始化列表比在构造函数中对成员变量赋值更高效