构造函数的执行分为两个阶段。隐式或显示初始化阶段,和一般的计算阶段。在计算阶
段,数据成员的设置被认为是赋值!而不是初始化。
所以,对于成员类对象,应该放在初始化列表中初始化,而不是放在构造函数中被赋值
这个地方我之前都忽略了。有成员初始化表就说明显示初始化阶段。而隐式初始化则是
数据成员按照顺序先后调用基类的构造函数(如果有的话),然后是成员类对象的缺省构
造函数。
- Class Example
- {
- public:
- Example();
- Example(const Example &exa);
- private:
- double _ia;
- string _name;
- }
- Example::Example()
- {
- _name = ''"; //name在构造函数Example()执行之前就已经调用了与其相关的省
- //string构造函数。而现在又在这里“初始化”是多此一举。
- _ia = 0.0;
- }
使用构造函数初始化和用成员列表初始化最终结果是一样。关心的就是效率问题。比如
在拷贝类的拷贝构造函数定义中,不分清初始化和赋值就会有问题,就会让一些操作执
行两次。
- Example::Example(const Example &exa)
- {
- _name = exa._name;//这样做,没有调用string的拷贝构造函数,只是调用缺省的构
- // 造函数,并且调用 string 的拷贝赋值操作符。做了两次工作
- _ia = exa._ia;
- }
- //因此改成这样比较好:
- Example::Example(const Example &exa):_name(exa._name)
- {
- _ia = exa._ia;
- }