构造函数初始化列表初始化成员变量的顺序

构造函数采用初始化列表进行初始化时,成员变量的初始化顺序(与声明顺序有关)

最近学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的值不定)。

猜你喜欢

转载自blog.csdn.net/shangzhengyu/article/details/113818860