构造函数初始化列表(应尽量使用初始化列表)
介绍
过去的赋值情况
class Function
{
public:
Function(int n1, int n2)
{
num1 = n1;
num2 = n2;
}
private:
int num1;
int num2;
};
使用c++的初始化列表
class Function
{
public:
Function(int n1, int n2):num1(n1),num2(n2){}
private:
int num1;
int num2;
};
使用初始化列表的好处
1)、比较直观的好处:使代码看上去更精简
2)、比较重要的好处:在简单的int等类型赋值时并没有明显的效率上的提升,但是在进行较复杂的类型赋值时,能够提升程序的效率,下面将详细解释
#include<iostream>
using namespace std;
class Base
{
public:
Base()
{
cout << "Base构造函数" << endl;
}
Base(const Base& b)
{
cout << "--Base拷贝构造函数--" << endl;
}
};
class Inher
{
public:
Inher(Base& b):base(b){} //base(b) 会调用拷贝构造函数
Inher(Base& b) //触发了Base对象的构造函数
{
base = b;
}
private:
Base base;
};
int main()
{
Base b;
Inher in(b);
system("pause");
return 0;
}
在使用初始化列表时,在参数初始化的时候是通过它本身的拷贝构造函数初始化的,拷贝构造函数一般使用引用后直接赋值,效率高,形如:
Base(Base& p)
{
m_pName = p.m_pName;
}
若像以前那样在函数体中赋值,会在再次调用base的默认构造函数,若类较复杂,那将占用较多的时间来创建对象。
必须使用初始化列表的情况
1.常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面
2.引用类型,引用必须在定义的时候初始化,并且不能重新赋值,所以也要写在初始化列表里面
3. 没有默认构造函数的类类型,因为使用初始化列表可以不必调用默认构造函数来初始化,而是直接 调用拷贝构造函数初始化
- 注意:
成员是按照他们在类中出现的顺序进行初始化的,而不是按照他们在初始化列表出现的顺序初始化的
class foo
{
public:
int i ;int j ;
foo(int x):i(x), j(i){}; // 正常, 先初始化i,后初始化j
foo(int x):j(x), i(j){} // 报错
};
参考文章:
c++中的初始化列表详解