查看下面两段代码
(1)
class classA { ... }; class classB { public: classB(classA a) { mA = a; } private: classA mA; };(2)
class classA { ... }; class classB { public: classB(classA a): mA(a) {} private: classA mA; };
分情况说明:
对于类型1,在成员初始化列表和构造函数体内进行,在性能和结果上都是一样的
对于类型2,结果上相同,但是性能上存在很大的差别
因为类类型的数据成员对象在进入函数体是已经构造完成,也就是说在成员初始化列表处进行构造对象的工作,这是调用一个构造函数,在进入函数体之后,进行的是 对已经构造好的类对象的赋值,又调用个拷贝赋值操作符才能完成(如果并未提供,则使用编译器提供的默认按成员赋值行为)
简单的来说:
对于用户定义类型:
1)如果使用类初始化列表,直接调用对应的构造函数即完成初始化
2)如果在构造函数中初始化,那么首先调用默认的构造函数,然后调用指定的构造函数
所以对于用户定义类型,使用列表初始化可以减少一次默认构造函数调用过程
#include <iostream> using namespace std; class A { public: A() { cout << "A()" << endl; } A(int a) { value = a; cout << "A(int "<<value<<")" << endl; } A(const A& a) { value = a.value; cout << "A(const A& a): "<<value << endl; } int value; }; class B { public: B() : a(1) { b = A(2); } A a; A b; }; int main() { B b; system("pause"); }运行结果如下图: