C++中的析构函数

一、析构函数概念

析构函数不是完成对象的销毁,对象的销毁是由编译器完成的。析构函数完成的是对象中资源的清理工作。通常是对对象中动态开辟的空间进行清理。

二、析构函数特性

1.析构函数的函数名是 ~类名

2.析构函数无参数无返回值

3.一个类中只能有一个析构函数,析构函数不支持重载

4.若未显式定义析构函数,编译器会默认生成一个析构函数

5.析构函数由编译器在对象生命周期结束时自动调用

class A {
private:int* _a;public://构造函数A(){_a = (int*)calloc(10, sizeof(int));}//析构函数~A(){if (_a){free(_a);_a = nullptr;}}
};

三、析构函数的用处 

对于我们显式定义且手动设置清理资源的析构函数,它会清理相应的资源。但是对于显示定义但未设置清理资源和编译器默认生成的析构函数,它们会做什么呢?其实,析构函数还有一项功能,就是调用自定义类型数据的析构函数。

析构函数与构造函数相同,在处理自定义类型数据时,会调用自定义类型数据的析构函数。

class Time {
private:int _hour;int _minute;int _second;public://无参构造函数Time(){//cout << "Time(int hour, int minute, int second)" << endl;//cout << "调用自定义类型数据的构造函数" << endl;_hour = 0;_minute = 0;_second = 0;}//打印void Print(){cout << _hour << " " << _minute << " " << _second << endl;}//析构函数~Time(){cout << "~Time()" << endl;cout << "调用自定义类型的析构函数" << endl;}
};class Date {
private:int _year = 1;int _month = 1;int _day = 1;Time _time;public://打印void Print(){cout << _year << " " << _month << " " << _day << endl;}//有参构造函数Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}};int main()
{Date d(2024, 2, 6);return 0;
}

 总结:如果类中没有动态开辟空间,析构函数可以不写,使用编译器默认生成的额析构函数;如果类中动态申请了空间,一定要显式实现析构函数清理动态申请的空间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/468780.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity(单元测试)在STM32上的移植与应用

概述 Unity Test是一个为C构建的单元测试框架。本文基于STM32F407为基础&#xff0c;完全使用STM32CubeIDE进行开发&#xff0c;移植和简单使用Unity。 单片机型号&#xff1a;STM32F407VET6 软件&#xff1a;STM32CubeIDE Version: 1.14.1 Unity Version&#xff1a;2.…

新项目,从0到1,SpringBoot+Vue.js权限管理系统,拿去做毕设

大家好&#xff0c;我是 jonssonyan 最近把以前做的权限管理系统重新整理了一下&#xff08;将一些不规范的地方规范了一下&#xff0c;并且在关键地方写了注释&#xff09;&#xff0c;代码全部开源&#xff0c;这个项目是以现在主流的前后端分离模式开发的&#xff0c;包含前…

Django学习全纪录:编写你的第一个 Django 应用,Django内置数据库的配置,以及扩展性的数据库介绍和配置

天下古今之庸人&#xff0c;皆以一惰字致败&#xff1b;天下古今之人才&#xff0c;皆以一傲字致败。——[清]曾国藩 导言 大家好&#xff0c;在上一篇文章里&#xff0c;我们一起学习了Django的视图以及路由&#xff0c;并且对Django的应用有了初步的认识&#xff0c;掌握了…

vim编辑代码后退出编辑显示vim编辑的内容

在/etc/profile.d/下新建terminal.sh&#xff1a; 在terminal.sh里添加如下代码&#xff1a; #!/bin/bashexport TERMlinux 然后同步文件到内存&#xff1a; source /etc/profile

第二十九回 施恩三入死囚牢 武松大闹飞云浦-分布式版本控制系统Git使用

武松要蒋门神答应三件事&#xff1a;离开快活林、东西都归还施恩&#xff0c;公开对施恩赔礼道歉&#xff0c;不许在孟州住。蒋门神不得已都答应了&#xff0c;灰溜溜地离开了孟州城。 一个月之后&#xff0c;天气转凉&#xff0c;张都监调武松到孟州城&#xff0c;做了他的亲…

JDK Development Kit 21.0.2的安装和使用

下载链接&#xff1a;https://www.oracle.com/java/technologies/downloads/#jdk21-windows&#xff0c;选择Windows-x64 Installer&#xff0c;下载下来的是一个exe程序&#xff0c;双击进行安装。 安装时可以修改安装位置&#xff0c;其余选项都不用修改。我的安装位置选择默…

猫头虎分享已解决Bug || Invariant Violation in React: Element Type is Invalid ‍

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

中小学信息学奥赛CSP-J认证 CCF非专业级别软件能力认证-入门组初赛模拟题第二套(选择题)

CSP-J入门组初赛模拟题二 1、在计算机内部用来传送、存贮、加工处理的数册或指令都是以()形式进行的 A、二进制 B、八进制 C、十进制 D、智能拼音 答案&#xff1a;A 考点分析&#xff1a;主要考查小朋友们计算机相关知识&#xff0c;在计算机中都是采用二进制运算&#…

猫头虎分享已解决Bug || TypeError: can‘t pickle _thread.lock objects

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

四、Mybatis配置文件深入

1.核心配置文件SqlMapConfig.xml 1.1 MyBatis核心配置文件层级关系 1.2MyBatis常用配置解析 1)environments标签 其中&#xff0c;事务管理器&#xff08;transactionManager&#xff09;类型有两种&#xff1a; JDBC&#xff1a;这个配置就是直接使用了JDBC 的提交和回滚设…

Unity类银河恶魔城学习记录7-3 P69 Setting up sword‘s aim源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili PlayerAimSwordState.cs using System.Collections; using System.Collect…

证明之毕达哥拉斯定理

毕达哥拉斯定理 毕达哥拉斯的著名定理所讲的是&#xff0c;假设一直角三角形的三边长为a、b和c&#xff0c;其中c是斜边长&#xff08;直角所对的边&#xff09;&#xff0c;则 a 2 b 2 c 2 a^2b^2c^2 a2b2c2。这个定理有若干种证明&#xff0c;其中有一种特别简短&#xf…