#include <iostream>
using namespace std;
class X{
private:
int i;
int j;
public:
X(int val):j(val),i(j){
}
int geti(){
return i;
}
int getj(){
return j;
}
};
class Y{
private:
int i;
int j;
public:
Y(int val):j(val){
i=j;
}
int geti(){
return i;
}
int getj(){
return j;
}
};
int main(){
X x=X(5);
cout<<x.geti()<<" "<<x.getj()<<endl;
Y y=Y(4);
cout<<y.geti()<<" "<<y.getj()<<endl;
return 0;
}
上面程序的输出是
/home/zmx/CLionProjects/zmx/cmake-build-debug/zmx
0 5
4 4
Process finished with exit code 0
成员初始化列表的顺序和成员的初始化顺序无关,程序按照成员被声明的顺序来初始化相关成员,所以i(j)先执行,但是程序员的意图是先用val初始化j,再用j初始化i.所以这与程序员的意图想违背。
采用如下定义,则能达到目的。
Y(int val):j(val){
i=j;
}