news 2026/4/15 2:15:18

C++小课堂:当类的成员是另一个类的对象时,构造和析构顺序是怎样的?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++小课堂:当类的成员是另一个类的对象时,构造和析构顺序是怎样的?

📌 C++小课堂:当类的成员是另一个类的对象时,构造和析构顺序是怎样的?

大家好!今天我们来聊聊 C++ 中一个非常实用但容易被忽略的细节:当一个类的成员变量本身是一个类的对象时,它的构造和析构是如何进行的?

这种情况在面向对象编程中非常常见。比如,一个人(Person)拥有一部手机(Phone),那么Person类中就可以包含一个Phone类型的成员变量。这种“类中包含类对象”的设计,我们称之为对象成员(Object Member)


🔧 关键知识点

构造顺序

先调用成员对象的构造函数,再执行当前类的构造函数体

析构顺序

与构造相反——先执行当前类的析构函数体,再调用成员对象的析构函数

💡 注意:成员对象的初始化必须通过初始化列表完成,不能在构造函数体内赋值(尤其是没有默认构造函数时)!


🖥️ 示例代码(支持中文输出)

下面这段代码完整演示了上述过程,并使用#include <windows.h>配合SetConsoleOutputCP(CP_UTF8)实现控制台中文正常显示:

#include<windows.h> #include<iostream> usingnamespacestd; class Phone { public: Phone(string name) { m_PhoneName = name; cout << "Phone构造" << endl; } ~Phone() { cout << "Phone析构" << endl; } string m_PhoneName; }; class Person { public: //初始化列表可以告诉编译器调用哪一个构造函数 Person(string name, string pName) :m_Name(name), m_Phone(pName) { cout << "Person构造" << endl; } ~Person() { cout << "Person析构" << endl; } void playGame() { cout << m_Name << " 使用" << m_Phone.m_PhoneName << " 牌手机! " << endl; } string m_Name; Phone m_Phone; }; void test01() { //当类中成员是其他类对象时,我们称该成员为 对象成员 //构造的顺序是 :先调用对象成员的构造,再调用本类构造 //析构顺序与构造相反 Person p("To be number.wan" , "Xiaomi"); p.playGame(); } int main() { SetConsoleOutputCP(CP_UTF8); test01(); return0; }

🖨️ 运行结果

从输出可以看出:

  • Phone先构造(因为它是Person的成员)

  • Person后构造

  • 程序结束时,Person先析构,Phone后析构

这完全符合 C++ 标准规定的生命周期管理规则!


✅ 小结
  • 对象成员必须通过初始化列表进行初始化(尤其当成员类没有默认构造函数时)。

  • 构造顺序由成员声明顺序决定,与初始化列表中的书写顺序无关!

  • 析构总是按构造的逆序进行,确保资源安全释放。

掌握这一点,能帮助你写出更健壮、更符合 C++ 语义的类设计!


📘 如果你觉得这篇内容对你有帮助,欢迎点赞、转发,也欢迎在评论区留下你的疑问或想法!下期我们继续深入 C++ 面向对象的其他核心机制!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/14 20:29:31

PaddlePaddle镜像支持模型灰度压测,验证GPU服务承载能力

PaddlePaddle镜像支持模型灰度压测&#xff0c;验证GPU服务承载能力 在当前AI工业化落地加速的背景下&#xff0c;企业对深度学习服务的稳定性、响应速度和资源利用率提出了前所未有的高要求。尤其是中文NLP、图像识别等高频应用场景中&#xff0c;一个未经充分验证的新模型一旦…

作者头像 李华
网站建设 2026/4/4 19:10:50

Qwen图像编辑快速部署终极指南:5分钟搞定AI图像生成

Qwen-Image-Edit-Rapid-AIO作为ComfyUI生态中的革命性工具&#xff0c;通过创新的技术整合实现了高效的文本到图像生成与智能图像编辑功能。无论您是技术新手还是资深开发者&#xff0c;都能在极短时间内掌握这一强大的AI图像处理解决方案。✨ 【免费下载链接】Qwen-Image-Edit…

作者头像 李华
网站建设 2026/4/15 8:04:10

Proxmark3硬件架构深度解析:解锁RFID安全测试的终极利器

Proxmark3硬件架构深度解析&#xff1a;解锁RFID安全测试的终极利器 【免费下载链接】proxmark3 Proxmark 3 项目地址: https://gitcode.com/gh_mirrors/pro/proxmark3 想要真正掌握Proxmark3这款专业RFID安全测试工具&#xff0c;首先必须深入理解其精密的硬件设计。作…

作者头像 李华
网站建设 2026/4/13 20:10:00

界面分割的艺术:用shadcn/ui Separator组件打造精致视觉体验

界面分割的艺术&#xff1a;用shadcn/ui Separator组件打造精致视觉体验 【免费下载链接】awesome-shadcn-ui A curated list of awesome things related to shadcn/ui. 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-shadcn-ui 在现代Web应用开发中&#xff0c…

作者头像 李华
网站建设 2026/4/15 0:18:09

Chart.js 雷达图详解

Chart.js 雷达图详解 雷达图,又称蜘蛛图,是一种用于展示多变量数据的图表类型。在Web开发中,Chart.js是一个流行的JavaScript图表库,它提供了多种图表类型,其中包括雷达图。本文将详细介绍Chart.js雷达图的使用方法、特性以及如何优化。 一、Chart.js雷达图简介 Chart.…

作者头像 李华
网站建设 2026/4/14 5:16:36

MetaDrive实战指南:构建可扩展自动驾驶仿真环境的关键技术

MetaDrive实战指南&#xff1a;构建可扩展自动驾驶仿真环境的关键技术 【免费下载链接】metadrive MetaDrive: Composing Diverse Scenarios for Generalizable Reinforcement Learning 项目地址: https://gitcode.com/gh_mirrors/me/metadrive 自动驾驶技术的快速发展对…

作者头像 李华