当前位置: 首页 > article >正文

构造函数与析构函数的执行顺序

对象作为成员变量的构造函数与析构函数

当一个类包含另一个类的对象作为成员时,这些成员对象的构造函数会在包含它们的对象的构造函数之前被调用,而它们的析构函数则会在包含它们的对象的析构函数之后被调用。成员对象的构造函数和析构函数的调用顺序与它们在类定义中出现的顺序相同。

class MemberClass {  
public:  
    MemberClass() { std::cout << "MemberClass Constructor\n"; }  
    ~MemberClass() { std::cout << "MemberClass Destructor\n"; }  
};  
  
class ContainingClass {  
    MemberClass member;  
public:  
    ContainingClass() { std::cout << "ContainingClass Constructor\n"; }  
    ~ContainingClass() { std::cout << "ContainingClass Destructor\n"; }  
};  
  
int main() {  
    ContainingClass obj; // MemberClass 的构造函数先被调用,然后是 ContainingClass 的构造函数  
    // ... 在这里,obj 对象可以使用 ...  
    // 当 main 函数返回时,obj 超出作用域  
    // ContainingClass 的析构函数先被调用,然后是 MemberClass 的析构函数  
    return 0;  
}

结果:构造的时候先搬床再封门,析构的时候先拆门在搬床

MemberClass Constructor
ContainingClass Constructor
ContainingClass Destructor
MemberClass Destructor

类继承执行顺序

#include <iostream>  
  
class Base {  
public:  
    Base() { std::cout << "Base Constructor\n"; }  
    ~Base() { std::cout << "Base Destructor\n"; }  
};  
  
class Derived : public Base {  
public:  
    Derived() { std::cout << "Derived Constructor\n"; }  
    ~Derived() { std::cout << "Derived Destructor\n"; }  
};  
  
int main() {  
    Derived d;  
    // 当d离开作用域时,析构函数会被自动调用  
    // 输出顺序将是:Derived Destructor, Base Destructor  
    return 0;  
}

结果:构造的时候搞base地基在建立房子,先抽象在具体,析构的时候反过来

Base Constructor
Derived Constructor
Derived Destructor
Base Destructor


http://www.kler.cn/news/304002.html

相关文章:

  • 多个系统运维压力大?统一运维管理为IT轻松解忧
  • 计算机网络八股总结
  • 使用vscode上传git远程仓库流程(Gitee)
  • uniapp点击跳转到对应位置
  • 写在OceanBase开源三周年
  • [项目][WebServer][日志设计]详细讲解
  • 【JVM 工具命令】JAVA程序线上问题诊断,JVM工具命令的使用,jstat, jstack,jmap命令的使用
  • 【机器学习】使用Numpy实现神经网络训练全流程
  • 关于若依flowable的安装
  • 76-mysql的聚集索引和非聚集索引区别
  • 为什么网站加载速度总是那么不尽如人意呢?(网站优化篇)
  • 2024.9.14(RC和RS)
  • Docker操作MySQL
  • 互联网环境下CentOS7部署K8S
  • LNMP的简单安装(ubuntu)
  • Artec Leo协助定制维修管道,让石油和天然气炼油厂不停产
  • vue3开发uniapp转字节小程序注意事项
  • 《C++PrimerPlus》第10章:类和对象
  • go语言开发windows抓包工具
  • 在centos上搭建syslog服务端
  • 详情攻略来了!浏览网站记录怎么查?一文读懂这3种实用方法
  • Vue3 响应式工具函数isRef()、unref()、isReactive()、isReadonly()、isProxy()
  • 火焰检测算法、明烟明火检测、烟火检测算法
  • dirty pages , swapiness 查看SWAP占用进程
  • 线性代数 第六讲 特征值和特征向量_相似对角化_实对称矩阵_重点题型总结详细解析
  • 【原创】java+springboot+mysql疫情期间在线答疑系统设计与实现
  • Word使用手册
  • MDK keil STM32 局部变量不能查看值,显示为not in scope
  • 数业智能心大陆探索生成式AIGC创新前沿
  • Mysql JSON结果不能IN