美文网首页C++ 杂记
条款 04:确定对象被使用前已先被初始化

条款 04:确定对象被使用前已先被初始化

作者: 赵者也 | 来源:发表于2017-07-19 08:19 被阅读8次

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++ 有着十分固定的“成员初始化次序”: **

  1. 基类早于派生类被初始化
  2. 类的成员变量总是以其声明次序被初始化。因此,我们在成员初始化列表中最好也是按照成员声明的次序进行初始化。虽然,这不是必须的。

** 请记住:**

  1. 为内置型对象进行手工初始化,因为 C++ 不保证初始化它们。
  2. 构造函数最好使用成员初始化列表,而不要在构造函数本体内使用赋值操作。初始值列表列出的成员变量,其排列次序应该和它们在 class 中声明次序相同。
  3. 为免除“跨编译单元的初始化次序”问题,请以 local static 对象替换 non-local static 对象。

相关文章

网友评论

    本文标题:条款 04:确定对象被使用前已先被初始化

    本文链接:https://www.haomeiwen.com/subject/wmikkxtx.html