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

Abh*_*rma -5 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;
}
Run Code Online (Sandbox Code Playgroud)

它给出了预期的结果,但是,

#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;
}
Run Code Online (Sandbox Code Playgroud)

出乎意料的结果.

唯一的区别是int a,bint b,a

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

Ben*_*ley 6

好吧,你已经发现了差异.这是非常重要的一个.类的成员按照它们在类定义中出现的顺序进行初始化,而不管它们出现在构造函数的成员初始化列表中的顺序如何.并且由于初始化b取决于值a,因此a首先应该初始化是很重要的.这就是为什么这样做的原因:

int a,b;
Run Code Online (Sandbox Code Playgroud)

但这不是:

int b,a;
Run Code Online (Sandbox Code Playgroud)

如果编写构造函数使得这些依赖项不存在,那会更好(更不容易出错).然后你不必担心声明的顺序.

XYZ(int i, int j):a(i), b(i*j){}
Run Code Online (Sandbox Code Playgroud)

  • @AbhishekSharma:http://stackoverflow.com/questions/1711990/what-is-this-weird-colon-member-syntax-in-the-constructor (2认同)

Mar*_*kus 5

在第二个例子中,b在a之前初始化.所以b得到了评估的结果a*j,其中a仍未初始化.