【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》

相关推荐

  1. C++ 构造函数 & 函数

    2024-06-07 09:08:01       40 阅读
  2. C++ 构造函数 & 函数

    2024-06-07 09:08:01       20 阅读
  3. C++_函数

    2024-06-07 09:08:01       31 阅读
  4. C++ 函数和构造函数

    2024-06-07 09:08:01       38 阅读
  5. C++入门【36-C++ 构造函数 & 函数

    2024-06-07 09:08:01       31 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-07 09:08:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-07 09:08:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-07 09:08:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-07 09:08:01       20 阅读

热门阅读

  1. 【Flutter 面试题】 JIT 与 AOT分别是什么?

    2024-06-07 09:08:01       12 阅读
  2. 预测预测---通过KIMI来预测上海高考语文题目

    2024-06-07 09:08:01       9 阅读
  3. QCAD系列(2)---源文件结构模块分类

    2024-06-07 09:08:01       8 阅读
  4. (一)Kafka 监控之 Streams 监控(Streams Monitoring)

    2024-06-07 09:08:01       6 阅读
  5. mysql json_quote和json_unquote的用法

    2024-06-07 09:08:01       10 阅读
  6. zs6d配置-1

    2024-06-07 09:08:01       11 阅读
  7. 有趣的C语言——我的C语言之路

    2024-06-07 09:08:01       12 阅读
  8. 大数据和数据分析来优化推荐算法

    2024-06-07 09:08:01       12 阅读
  9. Linux 的应用领域

    2024-06-07 09:08:01       10 阅读
  10. GitHub个人访问令牌登录

    2024-06-07 09:08:01       8 阅读