c++中以下几种情况的变量的初始化不可以写在构造函数里,而是要写在初始化参数列表中
1.const常量
class AA
{
public :
const int num;
public :
AA():num(123)//在初始化列表里初始化const常量
{ }
};
int main()
{
AA aa;
cout<<aa.num<<endl;
return 0;
}
2.引用
class AA
{
public :
int &num;
int b;
public :
AA():num(b),b(123)//在初始化列表里初始化引用
{ }
};
int main()
{
AA aa;
cout<<aa.num<<endl;
return 0;
}
3.包含另一个类的对象且该类的构造函数是自定义的
class AA
{
public :
AA(int x)
{ cout<<"AA";
}
};
class BB
{
public :
AA aa;
public:
BB():aa(123)//在初始化列表里初始化另一个类
{
cout<<"BB";
}
};
特别的,我们来看一下下面这种情况:
class AA
{
public :
int a;
int b;
public :
AA(int x):b(x),a(b)
{ }
};
int main()
{
AA aa(100);
cout<<aa.a<<endl;
cout<<aa.b<<endl;
return 0;
}
我们会发现a的结果是有问题的,这是为什么呢?
原因就是我们是先定义a的,自然在这姓的时候就先执行a的赋值,即将b的值赋予a,但此时b还没有值,所以结果只会输出b的值,我们可以通过以下两种方式改正
1.调整变量的定义顺序
public :
int b;
int a;
public :
AA(int x):b(x),a(b)
{ }
2.调整赋值顺序
public :
int a;
int b; public :
AA(int x):b(a),a(x)
{ }