C++程序执行顺序解析:Postoffice构造时成员对象构造与析构顺序问询
C++程序执行顺序详细解析:构造与析构的调用流程
嘿,咱们来一步步拆解这个C++程序的执行顺序,把构造函数和析构函数的调用逻辑讲得明明白白的~
一、程序启动:main函数创建Postoffice对象
当main里执行Postoffice p;时,Postoffice对象的构造流程就启动了。敲黑板:C++规定,类构造函数体执行之前,必须先按成员变量的声明顺序初始化所有成员,这点非常关键!
1. 初始化Postoffice的第一个成员:Clock clock
这个成员没有显式指定初始化方式,所以会调用Clock的默认构造函数,输出:
Constructor Clock
2. 初始化Postoffice的第二个成员:Room room
Room类本身包含一个Clock成员,所以初始化Room对象时,也要遵循“先成员后自身构造”的规则:
- 先调用Room内部Clock的默认构造函数,输出:
Constructor Clock - 再调用Room的构造函数,输出:
Constructor room
二、进入Postoffice构造函数体执行
现在所有成员都初始化完毕,才会执行Postoffice构造函数里的代码:
- 执行
clock=Clock(18,30);这行代码:- 首先会创建一个临时Clock对象,调用带参数的构造函数,输出:
constructor clock at 1830 - 然后把这个临时对象赋值给已经初始化好的Postoffice的
clock成员(注意:这是赋值操作,不是重新构造,因为clock已经完成初始化了) - 临时对象使命完成后,会在当前语句结束后立即被销毁,调用Clock的析构函数,输出:
Destructor Clock
- 首先会创建一个临时Clock对象,调用带参数的构造函数,输出:
- 执行构造函数里的
cout语句,输出:Constructor postoffice
三、main函数执行结束,对象销毁
当main函数执行到return 0;时,Postoffice对象p开始被销毁。另一个关键规则:析构顺序和构造顺序完全相反:
- 先调用Postoffice的析构函数,输出:
Destructor postoffice - 然后按成员声明的逆序销毁Postoffice的成员变量(先销毁
room,再销毁clock):- 销毁Room对象
room:- 先调用Room的析构函数,输出:
Destructor room - 再销毁Room内部的Clock成员,调用Clock的析构函数,输出:
Destructor Clock
- 先调用Room的析构函数,输出:
- 销毁Postoffice的
clock成员,调用Clock的析构函数,输出:Destructor Clock
- 销毁Room对象
四、完整输出顺序总结
把上面的步骤串起来,程序运行的完整输出是:
Constructor Clock Constructor Clock Constructor room constructor clock at 1830 Destructor Clock Constructor postoffice Destructor postoffice Destructor room Destructor Clock Destructor Clock
核心规则回顾
- 构造顺序:类对象构造时,先按成员变量的声明顺序(不是初始化列表顺序)初始化所有成员,再执行构造函数体;如果成员是类对象,先递归初始化该成员的所有子成员,再调用该成员的构造函数。
- 析构顺序:完全和构造顺序相反,先执行类的析构函数体,再按成员声明的逆序销毁成员;成员是类对象的话,先调用该成员的析构函数,再递归销毁它的子成员。
- 临时对象:当创建临时对象(比如
Clock(18,30))时,若没有被绑定到引用,会在当前语句结束后立即销毁。
内容的提问来源于stack exchange,提问作者Ahsan
相关产品推荐
相关产品推荐

