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

【和春笋一起学C++】(三十七)类的析构函数

目录

1.、析构函数的作用和特性

2、实例


1.、析构函数的作用和特性

接上篇文章《【和春笋一起学C++】(三十六)类的构造函数》,用类的构造函数创建对象后,程序将跟踪该对象,直到对象过期。对象过期时,程序将自动调用一个特殊的函数——析构函数,用于完成清理工作。例如,在构造函数中使用new开辟了一块内存,则析构函数将使用delete来释放这些内存。

析构函数的名称也很特殊,在类名前加上“~”,如上篇文章中Student类的析构函数为~Student()。析构函数没有返回值和声明类型,也没有函数参数,因此对于Student类的析构函数的原型,它必须是~Student()。

那什么时候调用析构函数呢?一般是在对象的生命周期结束时,由系统自动调用析构函数。具体有以下几种情况:

  • 如果创建的是静态存储类对象,则其析构函数在程序结束时自动被调用;
  • 如果创建的是自动存储类对象,则其析构函数在代码块结束时自动被调用;
  • 如果对象是通过new创建的,则当使用delete释放对象占用的内存时析构函数被自动调用;

如果类中没有提供析构函数,那么编译器将自动生成一个默认的析构函数。


原文为CSDN作者:三月微暖寻春笋


2、实例

将上篇文章中的Student类声明改为如下形式。

class Student
{
public:Student();Student(int yuwen_score_, int shuxue_score_, int yingyu_score_);~Student();void scoreSet(int yuwen_score_, int shuxue_score_, int yingyu_score_);int get_average_score();
private:std::string name;int *num;unsigned short yuwen_score;unsigned short shuxue_score;unsigned short yingyu_score;void show_score();
};

在私有数据成员中有一个int类的指针,使用默认构造函数对数据成员进行初始化如下:

Student::Student()
{name = "xxx";num = new int[8];for (int i = 0; i < 8; i++){num[i] = 0;}yuwen_score = 80;shuxue_score = 90;yingyu_score = 85;
}

默认构造函数中使用new开辟了占据8个int类型数据的内存空间,用于存储学生的学号。这段内存空间如果在析构函数中没有使用delete释放,则该类的自动存储类对象在代码块运行结束后,这段内存空间将不会被释放,从而导致内存泄露。所以,必须要在析构函数中使用delete来释放这段内存空间,不能使用编译器提供的默认析构函数。析构函数应定义为如下:

Student::~Student()
{delete[] num;
}

http://www.xdnf.cn/news/1378351.html

相关文章:

  • 死锁产生的条件是什么? 如何进行死锁诊断?
  • leetcode 974 和可被K整除的子数组
  • 集成电路学习:什么是YOLO一次性检测器
  • 关于国产 RAC 和分布式研讨
  • 【Python学习笔记】whl包打包
  • Day14——JavaScript 核心知识全解析:变量、类型与操作符深度探秘
  • Redis实战-优惠券秒杀解决方案总结大全
  • XC6SLX75-2FGG484C Xilinx Spartan-6 LX FPGA
  • 电子电气架构 --- 软件项目复杂性的驾驭思路
  • 基于Prometheus Pushgateway与Alertmanager的自定义指标监控与告警实践指南
  • C语言 | 高级C语言面试题
  • C语言二级考试环境配置教程【window篇】
  • 数学建模——马尔科夫链(Markov Chain Model)
  • Linux初始——基础指令篇
  • 数据结构:从堆中删除元素 (Deleting from a Heap)
  • 微服务-30.配置管理-动态路由
  • 3 无重复字符的最长子串
  • 第二阶段Winfrom-8:特性和反射,加密和解密,单例模式
  • Gopher URL协议与SSRF二三事
  • 入门概念|Thymeleaf与Vue
  • 路由基础(二):路由表和FIB表
  • Day7--HOT100--54. 螺旋矩阵,48. 旋转图像,240. 搜索二维矩阵 II
  • 【JAVA实现websocket】
  • Java设计模式之《外观模式》
  • 大模型安全概述、LlamaFirewall
  • 深度学习---卷积神经网络CNN
  • Git-远程操作
  • AI-Agent 深度科普:从概念到架构、应用与未来趋势
  • JVM之【Java对象在内存中的结构】
  • Linux--->网络编程(TCP并发服务器构建:[ 多进程、多线程、select ])