当前位置: 首页 > 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.cnnetsun.cn/news/173687.html

相关文章:

  • 【Open-AutoGLM收益监控终极方案】:5分钟搭建实时收益提醒系统
  • 揭秘Open-AutoGLM体检数据查询机制:5步实现高效精准调用
  • Open-AutoGLM实战指南:7步搭建企业级智能会议纪要系统
  • 还在手动查收益?AutoGLM自动化查询方案让你效率提升10倍,省时又精准
  • 【Java毕设全套源码+文档】基于springboot的大学生家教兼职管理系统的设计与实现(丰富项目+远程调试+讲解+定制)
  • 从数据到决策,Open-AutoGLM如何重构车辆生命周期管理
  • 【Open-AutoGLM体检报告查询全解析】:手把手教你快速获取与解读AI健康报告
  • 社保数据天天查,你还在人工操作?Open-AutoGLM自动化方案已全面上线
  • (稀缺资源)Open-AutoGLM社保机器人部署教程:仅限内部流传的配置参数曝光
  • 2026年职场暗流:HR不会告诉你的CAIE证书真相,零基础如何破局?
  • 【高效出行必备技能】:利用Open-AutoGLM实现智能加油站实时检索
  • 为什么90%的预约系统都失败了?:Open-AutoGLM三大设计原则全公开
  • 【Open-AutoGLM加油站查询实战指南】:手把手教你快速定位全国油站信息
  • Android Qualcomm USB 专题系列【篇一:UsbHost模式配置】
  • 9 个降AI率工具,研究生必备!
  • SCI :Letter发表攻略:好发与否全解析
  • 预约总是失败?,深度剖析Open-AutoGLM服务排队机制与抢号策略
  • Open-AutoGLM维修服务预约实战技巧(90%用户不知道的隐藏通道)
  • 【Java毕设源码分享】基于springboot+vue的大学生爱心互助代购网站设计与实现(程序+文档+代码讲解+一条龙定制)
  • STP实验
  • 只用一个 GPT 客户端,如何实现一个可控、可审计的投资决策 Runtime?
  • 网页如何设计.NET Core大文件上传的日志记录与监控系统?
  • Open-AutoGLM 对比传统查询引擎:性能提升8倍的秘密是什么?
  • 揭秘Open-AutoGLM核心算法:1秒匹配最优家政服务员的底层逻辑
  • 传统美甲预约正在被淘汰?Open-AutoGLM带来的5大颠覆性变革
  • 为什么顶级票务平台都在测试 Open-AutoGLM?3个真实应用场景曝光
  • 好写作AI:论文写到后面忘了前面?你可能需要这份“逻辑心电图”
  • 从宕机到自愈:Open-AutoGLM自动恢复系统的7个核心技术组件
  • Open-AutoGLM电影票购买实战指南(99%人不知道的隐藏技巧)
  • 【稀缺资料】Open-AutoGLM企业级实战FAQ:仅限内部流传的7条黄金法则曝光