Bootstrap

C++构造函数的初始化列表

C++中如何初始化列表?

在这里插入图片描述
看一段简单代码:

class Test
{
public:
	Test(int a)
	{
		ma = a;
	}
private:
	const int ma;
};

运行结果:
在这里插入图片描述
可以看见程序运行出错,什么原因呢?
在这里插入图片描述
原因就是 const 修饰的变量必须初始化
那么C++中如何给有const修饰的变量做初始化呢?

看下边一段代码:

class Test
{
public:
	Test(int a):ma(a)
	{
		//ma = a;
	}
private:
	const int ma;
};

在这里插入图片描述

当然,在实际情况中,变量很多情况下不止一个。那么,构造函数初始化列表中的执行顺序与什么有关呢?

看一段代码:

class Test
{
public:
	Test(int a)
		:ma(mb), mb(a)
	{
	}
	void Show()
	{
		std::cout << "ma: " << ma << std::endl;
		std::cout << "mb: " << mb << std::endl;
	}
private:
	int ma;
	int mb;
};
int main()
{
	Test test(10);
	test.Show();
	return 0;
}

ma、mb的值分别是多少呢?ma = mb = 10 ?
在这里插入图片描述
看下结果:
在这里插入图片描述
可以看见ma 是一个无效值(开辟内存时用cccccccc做初始化,而cccccccc就是个无效值)mb = 10;可以看出mb给ma赋值的时候mb自身还未被a赋值;
在看下边代码:

class Test
{
public:
	Test(int a)
		:ma(mb), mb(a)
	{
	}
	void Show()
	{
		std::cout << "ma: " << ma << std::endl;
		std::cout << "mb: " << mb << std::endl;
	}
private:
	int mb;
	int ma;
	
};
int main()
{
	Test test(10);
	test.Show();
	return 0;
}

此时ma、mb的值又是多少,还和刚才一样?
在这里插入图片描述
在这里插入图片描述
只有mb = 10,才有ma = 10;
在这里插入图片描述
是不是有点懵逼?

接下来我们看看两段代码的区别:
在这里插入图片描述
在这里插入图片描述
可以看到两端代码的唯一区别就是变量的声明顺序的先后问题。
所以,**C++构造函数初始化列表中的执行顺序和成员的声明顺序有关,与实现顺序无关。 **
再看一下交换实现顺序的结果
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

;