条款 04:确定对象被使用前已先被初始化
Make sure that objects are initialized before they’re used.
- 关于将对象初始化,C++反复无常,在某些语境下系统保证初始化,但某些语境下却不保证。C++存在无初始值对象,其他语言却大都没有这个概念。
- 通常情况下,你使用C part of C++而且初始化可能招致运行期成本,那么就不保证初始化。但是进入non-C part of C++,规则就会发生变化。这就可以解释C风格数组不保证其内容被初始化,但vector却有保证(由其构造函数负责)。
- 关于初始化和赋值。下列两种构造函数执行结果相同。但列表初始化的方式往往更高效。第一种赋值方式首先调用 A的默认构造函数,为三个成员设初值,然后再对他们赋予新值。默认构造函数所做的工作就此浪费。第二个版本避免了这个问题,而是直接对三个成员针对传入的参数设初值。值得说明的是,对于内置类型两种方式效率几乎相同(因为内置类型的的初始化和赋值成本相同),但是方便起见。建议都用列表初始化方式。
class A {
public:
A(const std::string& name, const std::list<std::string>& phones, int num);
private:
std::string name;
std::list<std::string> phones;
int num;
};
A::A(const std::string& name, const std::list<std::string>& phones, int num) {
this->name = name;
this->phones = phones;
this->num = num;
}
A::A(const std::string& name, const std::list<std::string>& phones, int num):
name(name),phones(phones),num(num) {}
- 为了避免在对象初始化之前就过早的使用他们,需要做三件事:1,手工初始化内置类型对象,2,使用成员初始化列表,3,在初始化顺序不定时,利用设计模式加强设计
请记住
1. 手工初始化内置类型对象,因为C++不保证初始化他们。 2. 构造函数最好最好使用成员初始化列表,而不要在构造函数内使用赋值操作。初始列列出的成员变量应该和他在class中的声明次序相同。 3. 为避免跨编译单元初始化序列,请以local static对象替代non-local static对象。
|