谁能解释一下这个程序是如何按顺序运行的?



我不明白房间和时钟构造函数是如何被称为

调用邮局构造函数的顺序构造函数和析构函数。

#include <iostream>
using namespace std;
class Clock{
int HH, MM;
public :
Clock():HH(0), MM(0){
cout<<"Constructor Clock "<<endl;
}
Clock(int hh,int mm): HH(hh), MM(mm){
cout<<"constructor clock at "<<hh<<mm<<endl;
}
~Clock(){
cout<<"Destructor Clock"<<endl;
}
};
class Room{
Clock clock;
public:
Room(){
cout<<"Constructor room"<<endl;
}
~Room(){
cout<<"Destructor room"<<endl;
}
};
class Postoffice{
Clock clock;
Room room;
public:
Postoffice(){
clock=Clock(18,30);
cout<<"Constructor postoffice"<<endl;
}
~Postoffice(){
cout<<"Destructor postoffice"<<endl;
}
};
int main(){
Postoffice p;
return 0;
}

以下是p初始化过程中的事件顺序:

调用
  1. Postoffice::Postoffice()。在进入函数体之前,Postoffice的所有成员的初始化式按照声明的顺序运行。
  2. Clock::Clock()初始化Postoffice::clock
  3. 调用
  4. Room::Room()。类似于1。成员变量被调用,导致Clock::Clock()Room::clock运行。
  5. Room::Room()运行。
  6. Postoffice::Postoffice()运行,clock=Clock(18,30);执行。这首先创建一个临时的Clock对象,并将其分配给Postoffice::clock。在这个表达式的末尾,临时Clock对象被销毁(Clock::~Clock()调用)。
  7. 打印自Postoffice::Postoffice().

main函数结束时,p超出作用域,导致:

  1. 析构函数体Postoffice::~Postoffice()运行
  2. 在析构函数体完成后,Postoffice的成员变量按相反顺序被销毁,导致Room::~Room()的体运行。
  3. 程序体完成后,为Room::clock运行析构函数Clock::~Clock()
  4. 随着Postoffice::room的破坏完成,Postoffice::clock被破坏运行Clock::~Clock()

最新更新