😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
⏰发布时间⏰:2024-06-06 18:33:19
本文未经允许,不得转发!!!
目录
- 🎄一、为什么需要析构函数
- ✨1.1
- ✨1.2
- 🎄二、什么是析构函数
- 🎄三、使用析构函数
- 🎄四、默认析构函数
- 🎄五、总结
🎄一、为什么需要析构函数
上一篇文章,我们学了构造函数,知道构造函数会在创建对象时,由系统自动调用。如果我们在构造函数中申请了资源或内存,希望在对象被销毁时才释放这些资源和内存。
下面代码在构造函数申请了内存:
class CDate
{
CDate(){
str = new char[64];
}
private:
int year;
int mon;
int day;
char *str;
};
此时我们就需要一个成员函数,可以在对象被销毁时被调用的,我们只需要在该函数去释放这些资源和内存就可以了。C++提供了一个在对象被销毁时会自动调用的函数——析构函数。
✨1.1
✨1.2
🎄二、什么是析构函数
析构函数:在对象被销毁时,系统会自动调用一次的特殊的成员函数,主要是用于释放资源、释放内存的清理工作。
析构函数的函数名很特殊:在类名前加波浪号(~
),没有返回值,也没有参数。
下面看看怎样声明和定义析构函数? 以 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》