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++构造函数初始化列表中的执行顺序和成员的声明顺序有关,与实现顺序无关。 **
再看一下交换实现顺序的结果