组合类构造函数初始化列表初始化成员变量的顺序
昨天说的今天更新组合类的构造函数通过初始化列表初始化成员变量的顺序,还好没有拖拉,这几天也算是渐渐的明白了一些,在这里和大家分享,若有错误,欢迎大家批评指正。
test1
#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
class Point{
private:
int m_x;
int m_y;
public:
Point(int x, int y) : m_x(x), m_y(y){
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;
}
};
class Line{
private:
Point m_s, m_e;
public:
Line(Point s, Point e) : m_s(s), m_e(e){
cout << "Line的初始化列表构造函数调用" << endl;
}
Line(Line &L) : m_s(L.m_s), m_e(L.m_e){
cout << "Line的拷贝构造函数调用" << endl;
}
double getDis(){
double x = double(m_s.getX() - m_e.getX());
double y = double(m_s.getY() - m_e.getY());
return sqrt(x * x - y * y);
}
};
int main(){
Point p1(1, 2), p2(3, 4);
Line L1(p1, p2);
return 0;
}
结果
test2
#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
class Point{
private:
int m_x;
int m_y;
public:
Point(int x, int y) : m_x(x), m_y(y){
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;
}
};
class Line{
private:
Point m_s, m_e;
public:
Line(Point s, Point e) : m_e(s), m_s(e){
cout << "Line的初始化列表构造函数调用" << endl;
}
Line(Line &L) : m_s(L.m_s), m_e(L.m_e){
cout << "Line的拷贝构造函数调用" << endl;
}
double getDis(){
double x = double(m_s.getX() - m_e.getX());
double y = double(m_s.getY() - m_e.getY());
return sqrt(x * x - y * y);
}
};
int main(){
Point p1(1, 2), p2(3, 4);
Line L1(p1, p2);
return 0;
}
结果
结论
- 调用组合类的构造函数时,首先需要实参传递给形参,注意参数传递的顺序是从右到左。
- 当创建一个组合类对象的时候,构造函数的执行顺序是:先调用内嵌对象的构造函数(按照内嵌对象成员在组合类中的定义顺序,与组合类构造函数的初始化列表顺序无关)。然后执行组合类构造函数的函数体。
解释
对于test1:创建p1、p2很好理解;之后调用Line的拷贝构造函数,参数传递从右到左,于是先拷贝p2,后拷贝p1;之后,执行这个部分[m_s(s), m_e(e)],由于m_s在m_e之前定义,所以先构造m_s,后构造m_e,符合代码输出的结果。
对于test2:变动的只有这个部分[m_e(s), m_s(e)];但是由于m_s在m_e之前定义,所以先构造m_s,于是输出语句 “Point的拷贝构造函数调用3 4” ,后构造m_e,于是输出语句 “Point的拷贝构造函数调用1 2” 。