#include<iostream>
using namespace std;
class A
{
public:
A() :
x(10), y(20), z(x) //对于const以及引用类型成员变量只能在初始化列表中进行初始化
{
x = 100;
//y=200; //错误: 向只读成员‘A::y’赋值
z = y;
}
A(int x, int y, int z) :
x(x), y(y), z(z)
{
}
void out()
{
cout << "x:" << x << endl;
cout << "y:" << y << endl;
cout << "z:" << z << endl;
}
private:
int x;
const int y;
int &z;
};
void main()
{
A a;
a.out();
}
初始化列表顺序:
- 成员变量在使用初始化列表初始化时,与构造函数中初始化成员列表的顺序无关,只与定义成员变量的顺序有关。因为成员变量的初始化次序是根据变量在内存中次序有关,而内存中的排列顺序早在编译期就根据变量的定义次序决定了。这点在EffectiveC++中有详细介绍。
- 如果不使用初始化列表初始化,在构造函数内初始化时,此时与成员变量在构造函数中的位置有关。
- 初始化列表优于构造函数体内赋值执行,并且构造函数体内赋值会带来额外的开销,效率会低于构造函数初始化列表。
class A
{
private:
int n1;
int n2;
public:
//初始化列表
A():
n2(0),n1(n2+2)
{
}
//赋值
//A()
//{
// n2 = 0;
// n1 = n2 +2;
//}
void Print()
{
cout << "n1:" << n1 << ", n2: " << n2 <<endl;
}
};
void main()
{
A a;
a.Print();
}