构造函数采用初始化列表进行初始化时,成员变量的初始化顺序(与声明顺序有关)
最近学C++的时候一直很迷惑,特别是组合类的构造函数的执行顺序,一直都让我很头疼(下一篇博客再分享吧),在这里和大家分享一下,顺便写的有不对的地方,欢迎大家批评指正。
test1
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
class Point{
private:
int m_x;
int m_y;
public:
Point() : m_x(1), m_y(m_x + 1){
cout << "Point的初始化列表构造调用" << m_x << " " << m_y << endl;
}
~Point(){
cout << "Point的析构函数调用" << m_x << " " << m_y << endl;
}
Point(Point &p){
m_x = p.m_x; m_y = p.m_y;
cout << "Point的拷贝构造调用" << m_x << " " << m_y << endl;
}
int getX(){
return m_x;
}
int getY(){
return m_y;
}
};
int main(){
int i, j, k;
Point p1;
return 0;
}
执行结果如下:
可以看到m_x、m_y按照我们预想的结果进行了初始化,输出结果符合预期。
接下来我们将私有变量m_x、m_y的声明顺序调换一下,看看结果会是怎样。
test2
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
class Point{
private:
int m_y;
int m_x;
public:
Point() : m_x(1), m_y(m_x + 1){
cout << "Point的初始化列表构造调用" << m_x << " " << m_y << endl;
}
~Point(){
cout << "Point的析构函数调用" << m_x << " " << m_y << endl;
}
Point(Point &p){
m_x = p.m_x; m_y = p.m_y;
cout << "Point的拷贝构造调用" << m_x << " " << m_y << endl;
}
int getX(){
return m_x;
}
int getY(){
return m_y;
}
};
int main(){
int i, j, k;
Point p1;
return 0;
}
执行结果如下:
可以看到,m_y的值并不是2,这就是因为初始化顺序的问题,导致了m_y的值并不和我们预想的结果一样。
总结
类的成员变量在使用初始化列表进行初始化时,成员变量的初始化顺序与构造函数中初始化成员列表的顺序无关,只与定义成员变量的顺序有关。
从test1中可以看到,我们先声明了变量m_x,后声明了变量m_y,所以通过初始化列表进行初始化时会先初始化m_x,后初始化m_y,这样就符合我们的预期(即先有m_x = 1; 后执行m_y = m_x + 1; 于是有m_x = 1; m_y = 2)。
而对于test2而言,由于我们先声明的m_y,后声明的m_x,所以会先初始化m_y,后初始化m_x(即先有m_y = m_x + 1; 后执行m_x = 1; 于是有m_x = 1; m_y的值不定)。