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

C++类的构造顺序

1. C++ 类成员与自身的构造和析构顺序

  1. 默认先构造类成员(类成员的构造顺序就是类成员在类中被书写的顺序),然后再构造类本身。参看 “测试代码 1”。
  2. 默认先析构类本身,然后再析构类成员(类成员的析构顺序就是类成员在类中被书写顺序的反顺序)。参看 “测试代码 1”。
  3. 如果类成员在类的构造函数中才被初始化,那么就是先调用类自身的构造函数,然后再按类成员在构造函数中的初始化顺序依次构造类成员。但是析构顺序总是先析构类本身,然后再析构类成员(类成员的析构顺序就是类成员在类中被书写顺序的反顺序)。参看 “测试代码 2”。
  4. 可以使用智能指针,并在类的析构函数中调用智能指针的reset函数显式更改类成员之间的析构顺序,以及类成员和类本身的析构顺序。参看 “测试代码 3”。

1.1. 测试代码 1

#include<iostream>usingnamespacestd;classA{public:A(){cout<<"constructor A"<<endl;}~A(){cout<<"destructor A"<<endl;}};classB{public:B(){cout<<"constructor B"<<endl;}~B(){cout<<"destructor B"<<endl;}};classC{public:C(){cout<<"constructor C"<<endl;}~C(){cout<<"destructor C"<<endl;}private:A a;B b;};intmain(){C c;return0;}

输出:

constructor A constructor B constructor C destructor C destructor B destructor A

1.2. 测试代码 2

#include<iostream>#include<memory>#include<utility>usingnamespacestd;classA{public:A(){cout<<"constructor A"<<endl;}~A(){cout<<"destructor A"<<endl;}};classB{public:B(){cout<<"constructor B"<<endl;}~B(){cout<<"destructor B"<<endl;}};classC{public:C(){cout<<"constructor C"<<endl;b=std::make_unique<B>();a=std::make_unique<A>();}~C(){cout<<"destructor C"<<endl;}private:A a1;unique_ptr<A>a;unique_ptr<B>b;};intmain(){unique_ptr<C>c=std::make_unique<C>();return0;}

输出:

constructor A constructor C constructor B constructor A destructor C destructor B destructor A destructor A

1.3. 测试代码 3

#include<iostream>#include<memory>#include<utility>usingnamespacestd;classA{public:A(){cout<<"constructor A"<<endl;}~A(){cout<<"destructor A"<<endl;}};classB{public:B(){cout<<"constructor B"<<endl;}~B(){cout<<"destructor B"<<endl;}};classC{public:C(){cout<<"constructor C"<<endl;a=std::make_unique<A>();b=std::make_unique<B>();}~C(){cout<<"destructor C"<<endl;a.reset();b.reset();}private:unique_ptr<A>a;unique_ptr<B>b;};intmain(){unique_ptr<C>c=std::make_unique<C>();return0;}

输出:

constructor C constructor A constructor B destructor C destructor A destructor B

2. C++ 父类和子类的构造和析构顺序

对象在创建时构造函数的调用顺序:

  1. 调用父类的构造函数;
  2. 调用成员变量的构造函数;
  3. 调用类自身的构造函数。

子类对象析构时的顺序(析构函数的调用顺序与构造函数相反):
2. 执行自身的析构函数;
3. 执行成员变量的析构函数;
4. 执行父类的析构函数。

http://www.gsyq.cn/news/131442.html

相关文章:

  • (稀缺资源)Open-AutoGLM内部测试数据曝光:准确率高达99.7%的实测报告
  • 还在手动查体检报告?Open-AutoGLM自动查询方案来了,效率提升90%!
  • Flink2.1.1-传感器温度计算示例
  • 告别反复重拍,Open-AutoGLM让你一次过审:国家级证件照生成实战解析
  • 【医疗AI新突破】:Open-AutoGLM如何实现个性化用药提醒?
  • 2025年度微动开关实力厂家推荐榜单,电动推杆微动开关/小型微动开关/微动开关/汽车微动开关/微动开关订制厂家推荐榜单 - 品牌推荐师
  • 2025年度微动开关实力厂家推荐榜单,电动推杆微动开关/小型微动开关/微动开关/汽车微动开关/微动开关订制厂家推荐榜单 - 品牌推荐师
  • 体检报告查询进入AI时代:Open-AutoGLM究竟带来了哪些颠覆性变革?
  • 【Open-AutoGLM收益监控终极方案】:5分钟搭建实时收益提醒系统
  • Flink2.1.1-docker安装
  • 【Open-AutoGLM会议纪要生成全攻略】:3大核心技术揭秘与落地实践
  • Java 岗面试 99 题 (含答案):JVM+Spring+MySQL+ 线程池 + 锁
  • 2025年大连值得信赖的BIP企业排行,人力云/好业财/协同云/税务云/好会计/财务云/易代账/供应链云/好生意BIP服务商选哪家 - 品牌推荐师
  • 网络调试助手链接服务器
  • Open-AutoGLM接入难题一网打尽(3大常见错误+7种解决方案)
  • 【Java毕设源码分享】基于springboot+vue的的大学生创业网站的建设及应用(程序+文档+代码讲解+一条龙定制)
  • 好写作AI:你的论文被“审稿人雷达”扫出AI味了吗?
  • 【Java毕设源码分享】基于springboot+vue的的大学生二手电子产品交易平台设计与实现(程序+文档+代码讲解+一条龙定制)
  • Open-AutoGLM真的能根治“号贩子”问题吗:一线医院实测数据曝光
  • 【Java毕设源码分享】基于springboot+vue的的大学生二手闲置物品置换交易管理系统设计与实现(程序+文档+代码讲解+一条龙定制)
  • Open-AutoGLM收益查询避坑指南(资深工程师亲授6大核心要点)
  • 手把手教你部署Open-AutoGLM洗车预约系统:10分钟快速上线指南
  • 【Java毕设源码分享】基于springboot+vue的的大学生家教服务管理系统设计与实现(程序+文档+代码讲解+一条龙定制)
  • Open-AutoGLM实战指南:7步搭建企业级智能会议纪要系统
  • (AI+汽车养护的终极方案)Open-AutoGLM技术白皮书首度公开
  • 【Open-AutoGLM体检报告查询全解析】:手把手教你快速获取与解读AI健康报告
  • JavaSE——带参数的方法
  • UE:怎么查看打包到底打包了哪些文件
  • Open-AutoGLM智能用药系统:3大核心机制让你再也不会漏服药物
  • Open-AutoGLM性能优化全攻略:支撑万人并发预约的7个关键技术点