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,b和int b,a
以及如何XYZ(int i, int j):a(i), b(a*j){}正常工作?
好吧,你已经发现了差异.这是非常重要的一个.类的成员按照它们在类定义中出现的顺序进行初始化,而不管它们出现在构造函数的成员初始化列表中的顺序如何.并且由于初始化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)
| 归档时间: |
|
| 查看次数: |
69 次 |
| 最近记录: |