C++6--析构函数

news/2024/12/16 20:38:15/

目录

1.概念

2.特性


1.概念

与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作

2.特性

析构函数是特殊的成员函数,其特征如下:

  1. 析构函数名是在类名前加上字符~。
  2. 无参数无返回值类型。
  3. 一个类只能有一个析构函数。若未显示定义,系统会自动生成默认的析构函数。注意:析构函数不能重载。
  4. 对象生命周期结束时,C++编译系统自动调用析构函数
typedef int DataType;
class Stack
{
public:Stack(int capacity = 3){_a = (DataType*)malloc(sizeof(DataType) * capacity);if (_a == nullptr){perror("malloc::fail");return;}_capacity = capacity;_size = 0;}void Push(DataType data){//Checkcapacity();_a[_size--] = data;_size++;}//···~Stack(){if (_a){free(_a);_a = nullptr;_capacity = _size = 0;}}private:DataType* _a;int _capacity;int _size;
};int main()
{Stack s;s.Push(1);s.Push(2);
}

5.编译器生成的默认析构函数,对自定义类型成员调用它的析构函数。

class Time
{
public:~Time(){cout << "~Time()" << endl;}
private:int _hour;int _minute;int _second;
};class Date
{
private://基本类型(内置类型)int _year = 2024;int _month = 12;int _day = 15;//自定义类型Time _t;
};int main()
{Date d;return 0;
}
///程序运行结果后输出:Time()
//在main函数中根本没有直接创建Time类的对象,为什么最后会调用Time类的析构函数?
// 
//因为:main函数中创建了Date对象d,而d中包含4个成员变量,其中_year,_month,_day
//三个是内置成员,销毁时不需要资源清理,最后系统直接将其内存回收即可;
//而_t是Time类对象,所以在d销毁时,要将其内部包含Time类型的_t对象销毁,所以要调用Time
//类的析构函数。但是:main函数中不能直接调用Time类的析构函数,实际要释放的是Date类对象,
//所以编译器会调用Date类的析构函数,而Date没有显示提供,则编译器会给Date类生成一个默认
// 的析构函数,而Date没有显示提供,则编译器会给Date类生成一个默认的析构函数,目前是在其
// 内部调用Time类的析构函数,而Date对象销毁时,要保证其内部每个自定义对象都可以正确销毁
//main函数中并没有并没有直接调用Time类析构函数,而是显示调用编译器Date类生成的默认析构函数//注意:创建哪个类的对象则调用该类的析构函数,销毁那个类的对象则调用该类的析构函数

什么情况下,我们需要用析构函数?
1.一般情况下,有动态申请资源,就要显示写析构函数释放资源

2.没有动态申请的资源,不需要写析构

3.需要释放资源的成员都是自定义类型,不需要析构


http://www.ppmy.cn/news/1555672.html

相关文章

比特币是否会取代美元(以及其他主权货币)

上图是 Olivier Blanchard 宏观经济学第八版的英文版内容。这里用中文解释。 1. 背景与现状&#xff1a; 比特币的规模与美元相比仍然很小&#xff1a; 截至 2018 年 12 月&#xff0c;比特币的总流通量为 1730 万枚&#xff0c;每枚价值 $3,900&#xff0c;总市值约 $670 亿…

Kubernetes之自动化CI/CD简介

在 Kubernetes 环境下&#xff0c;CI/CD 的实现帮助开发团队自动化整个软件生命周期的流程&#xff0c;从代码提交到应用部署和管理。Kubernetes 作为一个容器编排平台&#xff0c;提供了高效的容器管理、部署、扩展等功能&#xff0c;而结合 CI/CD 流程&#xff0c;能够进一步…

Windows安装elasticsearch、Kibana以及IK分词器

一、下载 1.下载elasticsearch 访问官网Download Elasticsearch | Elastic&#xff0c;下载elasticsearch 2.下载 Kibana 访问Download Kibana Free | Get Started Now | Elastic &#xff0c;下载 Kibana 3. IK分词器下载 访问Gitee 极速下载/elasticsearch-analysis-ik选…

YOLO模型基础学习

1. 分类回归的特征值类型 2. 传统机器学习和深度学习对比 3. yolo目标检测的特征值类型 在yolo中特征值是中心点和宽高 2. yolo模型主干网路分析

升级Ubuntu 24.04 LTS报错“Oh no! Something has gone wrong.”

强烈建议&#xff1a;升级Ubuntu系统之前先配置好SSH远程访问 最近升级Ubuntu系统&#xff08;18->24&#xff09;&#xff0c;经历了一些惊魂时刻&#xff0c;复盘下来没有重装系统的最得益于SSH访问。 在升级到24.04版本时&#xff0c;一切似乎表现得很正常&#xff0c;…

【Java学习笔记】JUnit

一、为什么需要 JUnit 二、基本介绍 三、实现方法 第一次添加&#xff1a; 在需要测试的方法处输入 Test注解&#xff0c;快捷键AltInsert选择添加版本&#xff08;常用JUnit5.4&#xff09; 出现绿色箭头可进行测试和编译

Docker Compose实战三:轻松部署PHP

通过前面的文章&#xff08;Docker Compose基础语法与MySQL部署&#xff09;&#xff0c;你已经掌握了Docker Compose的基本语法和常用指令&#xff0c;并成功部署了一个MySQL数据库服务器。今天&#xff0c;我们将继续深入探索Docker Compose的强大功能&#xff0c;介绍如何使…

Go 怎么做性能优化芝麻开门篇

一、性能优化的流程 我们在对某个功能&#xff08;或单个接口&#xff09;做性能优化的时候。一般是该功能&#xff08;或接口&#xff09;性能无法满足我们的业务要求&#xff0c;所以被迫优化。在开始优化之前&#xff0c;我们需要明白一些理论知识。 1、常见的性能优化指标…