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

一文带你学习C++析构函数

C析构函数的学习在C中析构函数是一种特殊类型的成员函数用于在对象生命周期结束时被自动调用。一个对象生命周期的终止可以发生在以下情况函数执行完毕对象被显式删除对象超出范围在这些情况下析构函数都会被调用该函数负责清除对象占用的内存空间和释放其他资源。析构函数的语法如下12345classClassName {public:ClassName();// 构造函数~ClassName();// 析构函数};可以看到在类中声明析构函数时在函数名前加上了一个波浪线符号“~”这用来表示这是一个析构函数。与构造函数一样析构函数也可以被重载接下来我们将介绍C析构函数的一些重要知识点并提供相应代码示例析构函数的基本使用当构造函数创建一个对象时它使用new运算符分配内存。在对象不再需要时我们需要使用delete运算符来释放内存。在这种情况下析构函数就可以派上用场。下面是一个简单的示例123456789101112131415161718192021222324252627282930313233#includeiostreamusingnamespacestd;classNumber {private:int* ptr;public:Number() {ptr newint;*ptr 0;}~Number() {deleteptr;}intgetValue() {return*ptr;}voidsetValue(intvalue) {*ptr value;}};intmain() {Number obj1;obj1.setValue(5);cout obj1.getValue() endl;return0;}在这个示例中我们使用了一个指向整数的指针并在构造函数中为其分配内存。在析构函数中我们使用delete运算符来释放该指针的内存空间。这个程序打印出5表明成功对obj1中的整数值进行了修改多个析构函数的使用如果在类中定义了多个析构函数无论是因为函数重载还是出于其他原因它们都会按照与它们的构造函数相同的顺序被自动调用 下面是一个示例123456789101112131415161718192021222324252627282930313233343536#includeiostreamusingnamespacestd;classStudent {private:intage;char* name;public:Student() {age 0;name newchar[10];}Student(inta,char* n) {age a;name newchar[strlen(n) 1];strcpy(name, n);}~Student() {delete[] name;}voiddisplay() {coutName: name Age: ageendl;}};intmain() {Student obj1(19,John);Student obj2(21,Peter);obj1.display();obj2.display();return0;}在这个示例中我们定义了两个构造函数一个默认的和一个带参数的。当我们创建两个对象时分别使用了这两个不同的构造函数。在析构函数中我们释放了为name指针分配的内存空间而不管哪个构造函数被使用这样就避免了内存泄露继承中的析构函数在继承中基类的析构函数会在派生类的析构函数之前被自动调用因此必须在基类中定义一个虚析构函数。这允许派生类中的任何资源在析构之前被清理。下面是一个示例12345678910111213141516171819202122232425262728293031#includeiostreamusingnamespacestd;classShape {public:Shape() {coutShape constructor\n;}virtual~Shape() {coutShape destructor\n;}};classSquare:publicShape {public:Square() {coutSquare constructor\n;}~Square() {coutSquare destructor\n;}};intmain() {Shape* shape newSquare();deleteshape;return0;}在这个示例中我们定义了一个Shape基类和一个Square派生类。由于Shape类定义了虚拟析构函数当我们通过基类指针delete Square对象时它将首先调用Shape类的析构函数然后再调用Square类的析构函数确保派生类中的任何资源被清理总结在本文中介绍了C析构函数的基本知识点包括在内存分配和释放、多个析构函数的使用和继承中的析构函数。强调了析构函数负责清理对象占用的内存空间和释放其他资源在对象的生命周期结束时被自动调用需要注意的是在使用析构函数时必须确保不会在它们已被调用的对象上进行任何操作否则可能会出现严重的编程错误。另外在使用多个析构函数时它们的顺序非常重要应该按照构造函数的顺序进行调用
http://www.zskr.cn/news/1359914.html

相关文章:

  • RK3588开发板蓝牙功能快速测试与配置指南
  • 2026年企业流量增长视角下档案托管行业GEO优化三家服务商专业分析与选型参考 - 产业观察网
  • 推理 → 行动 → 观察:用 LangChain + Python 实现一个智能体循环
  • 实测SpringBoot集成Taotoken后API调用的延迟与稳定性表现
  • STM32H5安全连接AWS IoT:基于TrustZone与Secure Manager的物联网方案
  • 联发科MT6833与MT6853 5G核心板:规格对比与产品选型实战指南
  • 【燃烧机】模拟了燃烧机的热力学循环分析活塞动力学以及温度和压力变化对发动机效率的影响【含Matlab源码 15557期】
  • Taotoken API Key管理与访问控制功能实际使用反馈
  • PIC32单片机通信接口开发实战:从UART、SPI、I2C到以太网
  • 基于PSoC3的智能锂电池充电器设计:从架构到固件的实战解析
  • RISC-V开发板USB手柄数据采集:Linux输入子系统与evdev接口实战
  • 企业级飞书文档自动化迁移架构深度解析与最佳实践
  • 深入解析Linux虚拟内存:从malloc到物理地址的转换机制
  • C语言抽象数据类型:从不完全类型到模块化设计实践
  • d2dx终极指南:如何让暗黑破坏神2在现代PC上焕发新生
  • RISC-V Linux内核启动:relocate汇编函数与MMU页表切换深度解析
  • Nim博弈阶梯型Nim博弈
  • AI浪潮下,软件开发行业的深度变革与未来走向
  • 瑞芯微RK3568与RK3566芯片选型指南:从接口差异到应用场景深度解析
  • Midjourney饱和度精准控制最后防线:从prompt语法层→渲染引擎层→输出编码层的5层穿透式调试法(含v6.1内核级参数映射表)
  • SAS宏编程中IN运算符的三种实现方法与实战应用
  • 类脑计算:突破冯·诺依曼瓶颈,迈向存算一体与脉冲神经网络新范式
  • 构建符合ISO 26262的嵌入式软件模型测试完整解决方案
  • 别再熬夜改格式了!okbiye 一键搞定毕业论文排版,导师看了都点头
  • 嵌入式TF卡硬核横评:A2/U3性能实测与选型避坑指南
  • 为什么 Agent 才是真正的企业 AI 操作系统
  • 如何快速解决Windows 11区域模拟问题:完整API钩子技术指南
  • 2026年中国生成式引擎优化GEO领域综合实力领先的三家服务商深度分析 - 产业观察网
  • 中之网科技:让工业制造“被看见、被看懂”的三维可视化专家
  • 搞自动化改造这钱到底花得值不值,听老板们唠明白