我正在尝试这个构造函数代码并且对它的工作原理感到困惑。
#include<iostream>
using namespace std;
class XYZ{
int a,b;
public:
XYZ(int i, int j):a(i), b(a*j){}
void show(){
cout<<a<<"\t"<<b<<"\n";
}
};
int main(){
XYZ X(2,3);
X.show();
return 0;
}
它给出了预期的结果,但是,
#include<iostream>
using namespace std;
class XYZ{
int b,a;
public:
XYZ(int i, int j):a(i), b(a*j){}
void show(){
cout<<a<<"\t"<<b<<"\n";
}
};
int main(){
XYZ X(2,3);
X.show();
return 0;
}
给出意想不到的结果。
唯一的区别是int a,b
和int b,a
以及XYZ(int i, int j):a(i), b(a*j){}
如何正常工作?
答案 0 :(得分:6)
嗯,你已经发现了差异。这是非常重要的一个。类的成员按照它们在类定义中出现的顺序进行初始化,而不管它们出现在构造函数的成员初始化列表中的顺序如何。由于b
的初始化取决于a
的值,因此首先应初始化a
非常重要。这就是为什么这样做的原因:
int a,b;
但这不是:
int b,a;
如果编写构造函数使得这些依赖项不存在,那会更好(更不容易出错)。然后你不必担心声明的顺序。
XYZ(int i, int j):a(i), b(i*j){}
答案 1 :(得分:5)
在你的第二个例子中,b在a之前被初始化。所以b得到了评估a*j
的结果,其中a仍未初始化。