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

【C++ | 析构函数】类的析构函数详解

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
⏰发布时间⏰:2024-06-06 18:33:19

本文未经允许,不得转发!!!

目录

  • 🎄一、为什么需要析构函数
  • 🎄二、什么是析构函数
  • 🎄三、使用析构函数
  • 🎄四、默认析构函数
  • 🎄五、总结


在这里插入图片描述

🎄一、为什么需要析构函数

上一篇文章,我们学了构造函数,知道构造函数会在创建对象时,由系统自动调用。如果我们在构造函数中申请了资源或内存,希望在对象被销毁时才释放这些资源和内存。
下面代码在构造函数申请了内存:

class CDate
{CDate(){str = new char[64];}
private:int year;int mon;int day;char *str;
};

此时我们就需要一个成员函数,可以在对象被销毁时被调用的,我们只需要在该函数去释放这些资源和内存就可以了。C++提供了一个在对象被销毁时会自动调用的函数——析构函数。


在这里插入图片描述

🎄二、什么是析构函数

析构函数:在对象被销毁时,系统会自动调用一次的特殊的成员函数,主要是用于释放资源、释放内存的清理工作。

析构函数的函数名很特殊:在类名前加波浪号(~),没有返回值,也没有参数。

下面看看怎样声明和定义析构函数? 以 CDate 类为例,代码如下:

class CDate
{CDate(){str = new char[64];}~CDate();	// 析构函数声明
private:int year;int mon;int day;char *str;
};// 析构函数定义
CDate::~CDate()
{delete[] str;
}

在这里插入图片描述

🎄三、使用析构函数

什么时候应调用析构函数呢?这由编译器决定,通常不应在代码中显式地调用析构函数。

一般情况下,析构函数会在对象被销毁时由系统自动调用一次,C++也允许程序员人为地调用析构函数,但一般不这么操作。

那么析构函数何时被调用,一般都下面几种情况:

  • 1、如果创建的是静态存储类对象,则其析构函数将在程序结束时自动被调用;
  • 2、如果创建的是自动存储类对象,则其析构函数将在程序执行完代码块时(该对象是在其中定义的)自动被调用;
  • 3、如果对象是通过 new 创建的,则它将驻留在栈内存或自由存储区中,当使用 delete 来释放内存时,其析构函数将自动被调用;
  • 4、程序有时会创建临时对象来完成特定的操作,在这种情况下,程序将在结束对该对象的使用时自动调用其析构函数。

下面例子演示销毁对象时自动调用析构函数:

// g++ 09_Destructor_Date.cpp
#include <iostream>using namespace std;class CDate
{
public:CDate(int year, int mon, int day);	// 构造函数声明~CDate();							// 析构函数声明void show(){cout << "Date: " << m_year << "." << m_mon << "." << m_day << endl;}private:int m_year;int m_mon;int m_day;char *str;
};// 构造函数定义
CDate::CDate(int year, int mon, int day)
{m_year = year;m_mon = mon;m_day = day;str = new char[64];cout << "Calling Constructor" << endl;
}// 析构函数定义
CDate::~CDate()
{delete[] str;cout << "Calling Destructor" << endl;
}int main()
{// 如果创建的是自动存储类对象,则其析构函数将在程序执行完代码块时(该对象是在其中定义的)自动被调用;{cout << "Call date Constructor" << endl;CDate date = CDate(2024,6,5);date.show();cout << "Call date Destructor" << endl;}cout << endl;// 如果对象是通过 new 创建的,则它将驻留在栈内存或自由存储区中,当使用 delete 来释放内存时,其析构函数将自动被调用cout << "Call pDate Constructor" << endl;CDate *pDate = new CDate(2024,6,7);pDate->show();cout << "Call pDate Destructor" << endl;delete pDate;return 0;
}

运行结果如下:
在这里插入图片描述


在这里插入图片描述

🎄四、默认析构函数

注意:每个类只有一个析构函数。
如果程序员没有提供析构函数,编译器将隐式地声明一个默认析构函数。

默认析构函数不会帮我们去释放资源和内存,所以当我们需要在对象结束时做一些清理工作时,还是需要自己定义析构函数。

CDate 类的默认析构函数可能如下:

CDate::~CDate()
{}

在这里插入图片描述

🎄五、总结

👉本文主要介绍类的析构函数的声明、定义、使用,以及析构函数在什么时候被调用。其实析构函数很简单,当你需要在对象被销毁时释放资源或内存时,就自己定义一个析构函数。

在这里插入图片描述
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁

参考:
《c++ primer plus》

http://www.lryc.cn/news/365526.html

相关文章:

  • ceph radosgw 原有zone placement信息丢失数据恢复
  • ​​​​【动手学深度学习】残差网络(ResNet)的研究详情
  • freertos初体验 - 在stm32上移植
  • ubuntu使用 .deb 文件安装VScode
  • 9.1.1 简述目标检测领域中的单阶段模型和两阶段模型的性能差异及其原因
  • 系统化自学Python的实用指南
  • 加密货币初创企业指南:如何寻找代币与市场的契合点
  • 【十二】图解mybatis日志模块之设计模式
  • RainBond 制作应用并上架【以ElasticSearch为例】
  • JVM相关:Java内存区域
  • 【C++】─篇文章带你熟练掌握 map 与 set 的使用
  • Mintegral数据洞察:全球中轻度游戏市场与创意更新频率
  • 贝锐蒲公英异地组网:降低建筑工地远程视频监控成本、简化运维
  • 大模型训练学习笔记
  • Linux C/C++时间操作
  • AI绘画工具
  • 图相似度j计算——SimGNN
  • 大模型创新企业集结!百度智能云千帆AI加速器Demo Day启动
  • 阿里云对象存储oss——对象储存原子性和强一致性
  • 星戈瑞 CY5-地塞米松的热稳定性
  • MongoDB CRUD操作:地理位置查询
  • mysql启动出现Error: 2 (No such file or directory)
  • 上位机图像处理和嵌入式模块部署(f407 mcu中的项目开发特点)
  • 插入排序—Java
  • c语言速成系列指针上篇
  • c++ 里函数选择的优先级:普通函数、模板函数、万能引用,编译器选择哪个执行呢?
  • 网鼎杯 2020 玄武组 SSRFMe
  • 纪念日文章:我的博客技术之路——两年回望
  • course-nlp——6-rnn-english-numbers
  • qnx 查看cpu使用