美文网首页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