高质量程序设计指南c++/c语言(4)--构造函数的成员初始化列表
我们一般习惯在构造函数体内进行初始化数据成员,然而这不是真正意义上的初始化,而是赋值。真正的初始化是使用所谓的初始化表达式表(简称初始化列表)进行的,该列表里的初始化工作发生在函数体内的任何代码被执行之前。
(1)类的非静态const数据成员和引用数据成员只能在初始化列表里初始化,因为他们只存在初始化语义,而不存在赋值语义。
(2)类的数据成员的初始化可以采用初始化表或函数体内赋值两种方式。这两种方式的效率不完全相同。
class A { }; class B { public: B(const A &a); private: A m_a; }; //(1) B::B(const A &a):m_a(a) {} //(2) B::B(const A &a) { m_a = a; }
第二种方式实际上是这样的:先暗地里创建m_a对象(调用了A的默认构造函数),在调用A的赋值函数,才将a赋值给m_a,显然第一种方式的效率比第二种高。