Effective C++ 学习之确定对象被使用前被初始化

  “确定对象的使用前被初始化“毫无疑问这和C++的构造函数有关,对内置类型来说在使用前确保被初始化的最好方式就是在定义一个变量的时候给他一个初始值。而对于自定义类型莫过于类的构造函数了,这相对与C来说的话优雅了很多。

  其中将类的成员变量的列表初始化和函数体内初始化,在讲到一下版本的构造函数时个人觉得有点不妥

ABEntry::ABEntry(const std::string& name, const std::string& address,
                                const std::list<PhoneNumber>& phones)
{
    theName = name;
    theAddress = address;
    thePhones = phones;
    numTimesConsulted = 0;
}

在书上提到使用上面的赋值版本的构造函数的时候,首先会调用default构造函数为类的成员进行初始化然后再对他们赋予新值。这样的解释个人觉得又一下几个疑问:

      1. default构造函数何时调用?

                    2.为什么在调用default构造函数后还会调用自己写的构造函数?

                    3. 由谁触发了自己写的构造函数的调用?

相比于先调用default构造函数初始化然后在进行赋值,个人觉得一下的这种解释更可靠一点:在调用赋值版本的构造函数时首先检查函数有没有初始化列表,如果有初始化列表则按照初始化列表中的值进行初始化,如果没有初始化列表,则使用各个成员变量的默认构造函数对自己进行初始化。而后在函数体中调用赋值运算符重载函数进行赋值操作。

上述的初始化方式肯定不是推荐的,因为,这样的构造函数相比与初始化列表方式的构造函数多调用了一个赋值运算符的重载函数。按照性能来说的话这是没有必要的。所以说尽量还是使用初始化列表的方式。

之前发现的一点错误:书上写的是类成员的default构造函数,这样的话也就说和我的理解一样了。之前的博文有误,请谅解

原文地址:https://www.cnblogs.com/lzh2nix/p/3025179.html