一、为什么要有初始化列表?有什么作用?
class Test
{
public:
Test(int a,int b)
{
ma = a;
mb = b;
}
private:
int ma;
int mb;
};
对于上面的函数,Test类中的构造函数中,是分别用a和b给ma和mb赋值,是一个赋值的过程。
但是,在有的情况就下会发生错误,比如下面的代码;
class Test
{
public:
Test(int a,int b)
{
ma = a;
mb = b;
}
private:
int ma;
const int mb;
};
对于这个类来说,成员变量mb之前加了const,我们都知道变量前面加const表明了这个变量是常量,常量必须进行初始化,不能再赋值进行修改,因此用初始化列表就能解决这个问题,代码修改为下面这样
class Test
{
public:
Test(int a,int b):ma(a),mb(b)
{}
private:
int ma;
**const int mb;**
};
因此我们知道了初始化列表是用来初始化一定要初始化的成员变量,并且const修饰的成员变量一定要在初始化列表中初始化。
二、初始化列表中的执行顺序是如何的??
分析下面代码,讨论ma和mb的值是多少?
class Test
{
public:
Test(int a,int b):**mb(a),ma(a)**
{}
void Show()
{
cout<<"ma:"<<ma<<endl;
cout<<"mb"<<mb<<endl;
}
private:
int ma;
int mb;
};
int main()
{
Test test1(10,20);
test1.Show();
return 0;
}
运行程序 ---------> ma:10,
---------------------- > mb:10
如果将成员变量mb定义在ma之前, 打印结果 ma:10,mb是一个无效值
由此我们知道 初始化列表中的执行顺序只和成员变量的声明顺序有关。