构造函数后加冒号及调用顺序

在做题时要求出这个题目的输出,答案是213312搞了半天没搞明白Whole(int x, int y, int z = 0)后面加冒号干啥使的,网上找了许多资料后才发现了原因。

此处先讲解程序的运行,有关于C++构造函数初始化列表在程序后面,像我一样的小白们可以先去文末学习初始化列表的知识再回来看这个程序;

程序执行步骤:
· 从main函数进入函数体执行 Whole obj(1, 2, 3);
·进入Whole类的构造函数Whole(int x, int y, int z = 0) :p2(x), p1(y),val(z),此时x=1,y=2,z=3.
·执行p1(y)
·进入part构造函数Part(int x = 0) :val(x),执行这一步时构造函数中的局部变量x=2,即将传入参数y=2的值赋给了x,然后用初始化成员列表的知识可知对象p1的成员变量val=2。
·输出val,此时是2
·接下来回到Whole(int x, int y, int z = 0) :p2(x), p1(y),val(z)执行p2(x),其中x=1,再传入到Part(int x = 0)构造函数中,之后再把值赋给对象p2的成员变量valval=1再输出。
·回到Whole(int x, int y, int z = 0) :p2(x), p1(y),val(z),执行val(z).此处Whole类对象obj的成员变量val=3,然后执行Whole构造方法,输出3
·结束了Whole构造方法,执行return 0;
·最后按照和初始化相反的顺序执行析构函数释放空间,初始化顺序为p1(y),p2(x),val(z),所以析构函数执行顺序为~Whole()、p2的~Part()、p2的Part(),依次输出3,2,1。
·最后程序结束
#include <iostream>
using namespace std;
class Part{
public :
Part(int x = 0) :val(x) {
cout << val;
}
~Part(){
cout << val;
}
private:
int val;
};
class Whole {
public:
Whole(int x, int y, int z = 0) :p2(x), p1(y),val(z) {
cout << val;
}
~Whole(){
cout << val;
}
private:
Part p1, p2;
int val;
};
int main() {
Whole obj(1, 2, 3);
return 0;
}

有关初始化列表的知识

1.若a,b是一个变量。
A( int aa, int bb ):a(aa),b(bb)
{
}
相当于
A( int aa, int bb )
{
a=aa;
b=bb;
}
2.若冒号后面接的是对象,就按照程序的声明顺序进行初始化,这也是为什么再上面的程序中先初始化p1(y)再初始化p2(x)的原因。在定义时的代码是Part p1,p2; p1在p2之前。
还有不懂可以看看这篇博客https://www.cnblogs.com/BlueTzar/articles/1223169.html

猜你喜欢

转载自www.cnblogs.com/ArnoldSchwarzenegger/p/12407909.html
今日推荐