You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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构造函数里的代码:

  1. 执行clock=Clock(18,30);这行代码:
    • 首先会创建一个临时Clock对象,调用带参数的构造函数,输出:
      constructor clock at 1830
      
    • 然后把这个临时对象赋值给已经初始化好的Postoffice的clock成员(注意:这是赋值操作,不是重新构造,因为clock已经完成初始化了)
    • 临时对象使命完成后,会在当前语句结束后立即被销毁,调用Clock的析构函数,输出:
      Destructor Clock
      
  2. 执行构造函数里的cout语句,输出:
    Constructor postoffice
    

三、main函数执行结束,对象销毁

当main函数执行到return 0;时,Postoffice对象p开始被销毁。另一个关键规则:析构顺序和构造顺序完全相反:

  1. 先调用Postoffice的析构函数,输出:
    Destructor postoffice
    
  2. 然后按成员声明的逆序销毁Postoffice的成员变量(先销毁room,再销毁clock):
    • 销毁Room对象room:
      • 先调用Room的析构函数,输出:
        Destructor room
        
      • 再销毁Room内部的Clock成员,调用Clock的析构函数,输出:
        Destructor Clock
        
    • 销毁Postoffice的clock成员,调用Clock的析构函数,输出:
      Destructor Clock
      

四、完整输出顺序总结

把上面的步骤串起来,程序运行的完整输出是:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 00:17:48