初始化列表和初始化函数的区别
其实并没有所谓的初始化函数的概念,本文中的初始化函数只是说明在函数体内进行赋值。而初始化列表才是真正意义上的对象初始化。
使用初始化列表效率会高一点。C++规定,对象的成员变量的初始化动作发生在进入构造函数本体之前。在构造函数体内只是赋值,并不是初始化。
请看下面这个栗子:
class base{
public:
base(){
cout<<"default constructor. "<<endl;
}
base(const int& _data){
data = _data;
cout<<"constructor 1."<<endl;
}
base(const base& a){
data = a.data;
cout<<"copy constructor."<<endl;
}
base& operator=(const base& a){
this->data = a.data;
cout<<"assign constructor."<<endl;
return *this;
}
protected:
int data;
};
class test{
public:
test(const base& temp):a(temp){
// a = temp;
}
protected:
base a;
};
int main (){
base b1(1);
test t1(b1);
return 0;
}
当用初始化函数方式时,运行结果为:
constructor 1.
delault constructor.
assign constructor.
当用初始化列表方式时,运行结果为:
constructor 1.
copy constructor.
这是因为编译器总是确保所有的成员对象在构造函数体执行之前初始化,所以当有类类型的成员数据时,在进入构造函数体之前已经完成第一次构造。构造函数使用初始化函数时,在赋值构造函数前,b1 已经自己调用默认构造函数完成第一次构造,之后再通过赋值构造函数进行第二次构造。而通过初始化列表方式构造则直接调用复制构造函数,比通过初始化函数少调用一次构造函数。