这些C++代码之间有什么区别

What is the difference between these C++ codes?

本文关键字:什么 区别 之间 C++ 代码 这些      更新时间:2023-10-16

我正在尝试这个构造函数代码,但对它的工作方式感到困惑。。

#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

CCD_ 3究竟是如何工作的?

好吧,您已经发现了差异。这是一个非常重要的问题。类的成员按照它们在类定义中出现的顺序进行初始化,而不管它们在构造函数的成员初始值设定项列表中的出现顺序如何。由于b的初始化取决于a的值,因此首先初始化a是很重要的。这就是为什么它有效:

int a,b;

但事实并非如此:

int b,a;

不过,如果您编写构造函数以使这些依赖项不存在,则会更好(更不容易出错)。那么你就不必担心申报的顺序了。

XYZ(int i, int j):a(i), b(i*j){}

在第二个例子中,b在a之前初始化。因此,b得到了a*j的求值结果,其中a仍然未初始化。