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

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 对象。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 9,545评论 1 51
  • 1. 让自己习惯C++ 条款01:视C++为一个语言联邦 为了更好的理解C++,我们将C++分解为四个主要次语言:...
    Mr希灵阅读 2,881评论 0 13
  • C++文件 例:从文件income. in中读入收入直到文件结束,并将收入和税金输出到文件tax. out。 检查...
    SeanC52111阅读 2,883评论 0 3
  • 一个博客,这个博客记录了他读这本书的笔记,总结得不错。《深度探索C++对象模型》笔记汇总 1. C++对象模型与内...
    Mr希灵阅读 5,677评论 0 13
  • 对于金钱完全不感冒,一直抗拒看有关这方面的书籍。直到看到尧宝在未加任何引导的情况下会把钱放到自己的背包里,收到的红...
    小梦化蝶阅读 89评论 0 0