1、成员变量在使用初始化列表初始化时,与构造函数中初始化成员列表的顺序无关,只与定义成员变量的顺序有关。因为成员变量的初始化次序是根据变量在内存中次序有关,而内存中的排列顺序早在编译期就根据变量的定义次序决定了。这点在EffectiveC++中有详细介绍。
2、如果不使用初始化列表初始化,在构造函数内初始化时,此时与成员变量在构造函数中的位置有关。
什么意思呢,举个栗子
1.在初始化类表中初始化:
#include <iostream>
using namespace std;
class A
{
public:
//使用初始化列表初始化时,与定义成员变量的顺序有关。
//因为成员变量的初始化次序是根据变量在内存中次序有关,而内存中的排列顺序在编译期就根据变量的定义次序决定了。
A():n3(20),n2(3),n1(n2 + 6){} //重点在这句
//在构造函数内初始化时,与成员变量在构造函数中的位置有关
void print()
{
cout << "n1:" << n1 << " , n2:" << n2 << " , n3:" << n3 <<endl;
}
private:
int n1;
int n2;
const int n3;
};
//const成员常量只能在构造函数初始化列表中初始化,不能在构造函数中进行初始化
//static成员变量,不能在类内初始化
int main()
{
A a;
a.print();
return 0;
}
此时的输出结果是n1:6 , n2:3 , n3:20
n1的值是和编译器有关系的,此时的初始化顺序是n1,n2,n3,在初始化n1时由于n2值还未知,所以n1的值是不可预测的。
2.构造函数内初始化时
#include <iostream>
using namespace std;
class A
{
public:
//在构造函数内初始化时,与成员变量在构造函数中的位置有关
A()
{
n2 = 3;
n1 = n2 + 6;
}
void print()
{
cout << "n1:" << n1 << " , n2:" << n2<<endl ;
}
private:
int n1;
int n2;
};
int main()
{
A a;
a.print();
return 0;
}
此时的输出结果是n1:9 , n2:3
先初始化n2,再初始化n1;在构造函数内初始化时,与成员变量在构造函数中的位置有关