好处1:效率提升:
如果只是一些内置的简单成员变量,效率没有太大变化,而当初始化的变量是一个 类 类型,那么效率的提升就明显了。
effective c++推荐使用初始化参数列表。
好处2:更加简洁
1、初始化参数列表
#include <iostream>
using namespace std;
class classA {
public:
classA() { cout << "classA()" << endl; }
classA(const classA& a) { cout << "copy classA()" << endl; }
~classA() { cout << "~classA()" << endl; }
classA& operator=(const classA& a) {
cout << "operator=" << endl;
return *this;
}
};
class classB
{
public:
classB(classA a) : mA(a) {}
~classB() { cout << "~classB()" << endl; }
private:
classA mA;
};
int main()
{
classA a;
classB b(a);
}
输出:
classA()
copy classA()
copy classA()
~classA()
~classB()
~classA()
~classA()
【拷贝构造函数概念】:只有单个形参,该形参是对本 类 类型对象 的引用
(一般常用const修饰)。
1、classA():创建对象classA a;
2、copy classA():这行代码classB b(a)中传参发生拷贝构造,由于传入的是引用,所以不会调用A的构造函数;
3、copy classA():初始化参数列表中发生拷贝构造;
2、构造函数体中直接赋值
#include <iostream>
using namespace std;
class classA {
public:
classA() { cout << "classA()" << endl; }
classA(const classA& a) { cout << "copy classA()" << endl; }
~classA() { cout << "~classA()" << endl; }
classA& operator=(const classA& a) {
cout << "operator=" << endl;
return *this;
}
};
class classB
{
public:
classB(classA a) {mA = a;}
~classB() { cout << "~classB()" << endl; }
private:
classA mA;
};
int main()
{
classA a;
classB b(a);
}
输出:
classA()
copy classA()
classA()
operator=
~classA()
~classB()
~classA()
~classA()
1、classA():创建对象classA a;
2、copy classA():这行代码classB b(a)中传参发生拷贝构造,由于传入的是引用,所以不会调用A的构造函数;
3、classA():classB中调用默认构造函数构造mA;
4、operator=:调用赋值构造函数将a赋值给mA
可以看出:
初始化参数列表少了一次默认的构造函数!