这些C ++代码有什么区别?

时间:2016-04-09 18:22:16

标签: c++ constructor initialization

我正在尝试这个构造函数代码并且对它的工作原理感到困惑。

#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,bint b,a

以及XYZ(int i, int j):a(i), b(a*j){}如何正常工作?

2 个答案:

答案 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仍未初始化。