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) { }
原文地址:https://www.cnblogs.com/curo0119/p/8533668.html
时间: 2024-11-16 20:53:47