初始化列表的构造顺序
初始化列表的初始化顺序与变量声明的顺序一致,而不是按照出现在初始化列表中的顺序来进行的!
看如下的代码:
#include <stdio.h>
#include <iostream>
using namespace std;
class obj {
public:
obj(int k) :j(k), i(j)
{}
void print(void)
{
cout << i << endl << j << endl;
}
private:
int i; //真实的初始化顺序
int j;
};
int main()
{
obj s(2);
s.print();
system("pause");
return 0;
}
按常理说,一般的思路是看见构造函数中先初始化j,再用j去初始化i,那应该输出两个2,但实际上是:
这说明,真是的初始化顺序,是类中的定义顺序来的,不是声明顺序。
初始化列表和赋值的区别
首先先看看什么是初始化列表和赋值,
int a = 5;//赋值操作
int a(5); //初始化成员操作
这就是最简单的赋值操作,大部分情况下,结果都是相同的。
只能使用初始化而不能使用赋值操作的场景
- 在定义const和引用类型成员变量的时候,只能进行初始化操作而不能进行赋值操作。
- 类的构造函数需要调用其基类的构造函数的时候,也是只能用初始化的方法,不能用赋值操作。