《Effective C++ 中文版 第三版》读书笔记
** 条款 04:确定对象被使用前已先被初始化 **
确保每一个构造函数都将对象的每一个成员初始化。
注意下面的构造函数:
Toby::Toby(string name,int age){
tobyName = name;
tobyAge = age;
}//< 这只是赋值,而不是初始化。
构造函数初始化的一个较好的做法是,使用成员初始化列表,替换以上的赋值动作:
Toby::Toby(string name,int age)
: tobyName(name),
tobyAge(age)
{
}
虽然最终结果相同。但是,后者效率更高。前者首先调用 default 构造函数为 tobyName、tobyAge 设初值,然后再立刻对它们进行赋值。而后者是将实参拿去作为各个成员变量的构造函数的实参,例如 tobyName 以 name 为初值进行 copy 构造,tobyAge 以 age 为初值进行 copy 构造。
对于大多数类型而言,比起先调用 default 构造函数,再调用 copy 赋值操作符的做法来说,只调用一次 copy 构造函数是高效的多的。
** C++ 有着十分固定的“成员初始化次序”: **
- 基类早于派生类被初始化
- 类的成员变量总是以其声明次序被初始化。因此,我们在成员初始化列表中最好也是按照成员声明的次序进行初始化。虽然,这不是必须的。
** 请记住:**
- 为内置型对象进行手工初始化,因为 C++ 不保证初始化它们。
- 构造函数最好使用成员初始化列表,而不要在构造函数本体内使用赋值操作。初始值列表列出的成员变量,其排列次序应该和它们在 class 中声明次序相同。
- 为免除“跨编译单元的初始化次序”问题,请以 local static 对象替换 non-local static 对象。
网友评论