析构函数详解

2023-11-05

析构函数详解

析构函数的概念
  • 前面通过构造函数的学习,我们知道一个对象是怎么来的,那一个对象又是怎么没呢的?
  • 析构函数:与构造函数功能相反,析构函数是完成对象的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成类的一些资源清理工作。
  • 析构函数用来完成对象资源清理的工作
析构函数的特性
  • 析构函数名是在类名前加上字符 ~。
  • 无参数无返回值。
  • 一个类有且只有一个析构函数。若用户没有显式定义,系统会自动生成默认的析构函数。
  • 当对象生命周期结束时,C++编译系统系统会自动调用析构函数
  • 下面是通过C++的类,来封装顺序表
#include<iostream>
#include<assert.h>
using namespace std;

class SeqList
{
public:
	SeqList(int capacity = 10)
	{
		array = (int*)malloc(sizeof(int) * capacity);
		assert(array);
		_capacity = capacity;
		_size = 0;
	}
private:
	int* array;
	int _size;
	int _capacity;
};
void TestSeqList()
{
	SeqList s;
}
int main()
{
	SeqList s(100);

	return 0;
}
但是上面的代码存在有很大的问题,就是代码中所创建的变量并没有被销毁和释放,用析构函数来清理资源
  • 在这种情况下,我们需要使用析构函数来完成对象资源的销毁工作。
#include<iostream>
#include<assert.h>
using namespace std;

class SeqList
{
public:
	SeqList(int capacity = 10)
	{
		cout << "SeqList(int):" << this << endl;
		array = (int*)malloc(sizeof(int) * capacity);
		assert(array);
		_capacity = capacity;
		_size = 0;
	}

	//析构函数
	~SeqList()
	{
		if (array)
		{
			free(array);
			_capacity = 0;
			_size = 0;
		}
		cout << "~SeqList():" << this << endl;
	}
private:
	int* array;
	int _size;
	int _capacity;
};
void TestSeqList()
{
	SeqList s;
}
int main()
{
	SeqList s(100);

	return 0;
}
析构函数不能重载
  • 析构函数没有参数,所以析构函数无法重载,都没有参数,怎么重载
关于编译器自动生成的析构函数,是否会完成一些事情呢?下面的程序我们会看到,编译器生成的默认析构函数,对会自定类型成员调用它的析构函数
#include<iostream>
#include<string.h>
using namespace std;
class String
{
public:
	String(const char* str = "jack")
	{
		_str = (char*)malloc(strlen(str) + 1);
		strcpy(_str, str);
	}
	~String()
	{
		cout << "~String()" << endl;
		free(_str);
	}
private:
	char* _str;
};
class Person
{
private:
	String _name;
	int _age;
};
int main()
{
	Person p;
	return 0;
}
编译器也会生成默认的析构函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

析构函数详解 的相关文章

  • IUnknown—COM和MFC

    转自 http hi baidu com zhangqiuxi blog item 6d9603ad9c8fe5084b36d6a0 html 问题 我用MFC编写COM程序有一段时间了 知道如何使用宏和嵌套类 以及如何在嵌套类中处理IUn
  • 五. python面向对象(多态 和metaclass=abc.ABCMeta)

    一 多态 多肽 一种事物的多种形态 叫多肽 例如 动物 animal 猫 狗 animal py 文件 动物类 都有名字这个属性 和吃这个方法 class Animal object def init self name self name
  • 多线程系列之——事件内核对象

    所有内核对象里面事件内核对象是最简单的一个 它包括一个使用计数 还有两个布尔值 一个布尔值用来表示事件是手动重置事件还是自动重置事件 另一个布尔值表示当前是否处于触发状态 当一个手动重置事件被触发的时候 所有等待该事件的线程都能变成调度状态
  • C++工程师复习题

    一 auto ptr 类使用必须满足下列限制 1 不要使用 auto ptr 对象保存指向静态分配对象的指针 2 不要使用两个 auto ptrs 对象指向同一对象 3 不要使用 auto ptr 对象保存指向动态分配数组的指针 4 不要将
  • 编写程序模拟完成动态分区存储管理方式的内存分配和回收。

    usr bin python coding utf 8 class Table object 空闲分区表 0 开始地址 1 长度 freeTable 占用分区表 0 程序名 1 开始地址 2 长度 useTable def init sel
  • c/c++入门教程 - 1.基础c/c++ - 1.0 Visual Studio 2019安装环境搭建

    推荐视频课程 https www bilibili com video BV1et411b73Z p 2 已投币三连 b站果然是个学习的网站 本来是想在linux环境下运行QT 于是先学了几个月linux嵌入式驱动开发 后来发现太底层了 与
  • JNA模拟复杂的C类型——Java映射char*、int*、float*、double*

    文章目录 引言 Java Native Type Conversions Java和C基本类型指针对应关系 Pointer的具体用法 引言 最近项目在用Java调用C写的一些三方库 没办法直接调 用Java封装一下C的接口 这就少不了要用到
  • C/C++中浮点数格式学习——以IEEE75432位单精度为例

    这是浮点数的通常表示形式 在IEEE754中 单精度浮点数有如下形式 32位单精度 单精度二进制小数 使用32个比特存储 1 8 23位长 S Exp Fraction 31 30至23偏正值 实际的指数大小 127 22至0位编号 从右边
  • 无法打开源文件<sys/time.h>,但是用time.h编译就会出错,缺少gettimeofday()

    因为sys time h是uinx系统下的库文件 而现在使用的平台是在windows 由于未指明程序运行的系统 导致找不到对应的头文件 需要重新实现gettimeofday 函数 define WIN32 include
  • 使用QZXing生成并解析二维码

    QZxing 是对 zxing 的一个封装 用于在 Qt 程序中加入条形码和二维码识别的功能 这里就讲讲如何编译和使用这个库 前几年 QZXing 的代码是放到 sourceforge net 上的 现在迁移到了 github com 所以
  • 经典面试题之new和malloc的区别

    new和malloc的区别是C C 一道经典的面试题 我也遇到过几次 回答的都不是很好 今天特意整理了一下 0 属性 new delete是C 关键字 需要编译器支持 malloc free是库函数 需要头文件支持 1 参数 使用new操作
  • vector,list,deque区别

    http blog csdn net renkaihao article details 6803866 vector和built in数组类似 它拥有一段连续的内存空间 并且起始地址不变 因此它能非常好的支持随即存取 即 操作符 但由于它
  • C++中的RTTI

    文章目录 dynamic cast运算符 指针类型的dynamic cast 引用类型的dynamic cast typeid运算符 使用RTTI type info类 参考资料 RTTI Runtime Type Information
  • 模板的完全特例化和部分特例化

    介绍 完全特例化就是类型完全明确的版本 而部分特例化指的是 只知道是几个参数的函数而不知道参数的类型 或者是只知道是引用或者是指针类型 而不知道具体是char 还是 int 模板特例化实例1 template
  • 【C/C++】 - Linux下查找函数头文件 以及 man命令拓展

    背景 比如现在需要找C语言 sleep函数的头文件 使用man来查找 可以先man sleep 可以发现出来的默认是sleep 1 是一个User Commands 明显不是我们需要的 这里提示了 看sleep 3 那我们查看下sleep
  • Open3D(C++)实现建筑物点云立面和平面分割提取

    Open3D C 实现建筑物点云立面和平面分割提取 近年来 点云技术在城市规划 机器人地图构建等领域得到广泛应用 本篇文章将介绍如何利用Open3D C 库实现建筑物点云立面和平面分割提取 准备工作 首先需要编译安装Open3D库 本文使用
  • 虚函数不能声明为static

    虚函数申明为static报错 class Foo public Foo default static virtual Foo int main Foo foo return 0 main cpp 10 25 error member Foo
  • enable_shared_from_this使用介绍

    文章目录 enable shared from this定义 使用场合 源码实现 注意 enable shared from this定义 定义于头文件 template lt class T gt class enable shared
  • C 语言教程:数据类型和格式说明符

    C 语言中的数据类型 C 中的变量必须是指定的 数据类型 并且您必须在 printf 函数中使用 格式说明符 来显示它 创建变量 int myNum 5 整数 没有小数点 float myFloatNum 5 99 浮点数 char myL
  • 在 Solaris 上,使用 gcc 编译的库与使用 cc 生成的库的使用方式是否相同?

    我目前正在尝试编译 libxml2在 Solaris 上 当我运行源代码提供的 configure 脚本时 会自动使用 gcc 和 g 编译器 但是 我想使用 cc 和 CC 编译器 所以我跑 configure CC cc CXX CC

随机推荐

  • element组件库的el-select多选时候,选择三个时候下拉框抖动问题解决办法

    添加如下样式即可解决
  • 华为OD机试真题- 寻找链表的中间结点【2023Q1】【JAVA、Python、C++】

    题目描述 给定一个单链表 L 请编写程序输出 L 中间结点保存的数据 如果有两个中间结点 则输出第二个中间结点保存的数据 例如 给定 L 为 1 7 5 则输出应该为 7 给定 L 为 1 2 3 4 则输出应该为 3 输入描述 每个输入包
  • php mysql layui分页_php+layui数据表格实现数据分页渲染代码

    一 HTML 二 JS 说明 需要引入layui中的table和laytpl模板引擎 laytpl可以自定义事件及自定义数据字段等 查看详情 if d hotcake 超级爆款 d hotcake else if d hotcake 大爆款
  • resultType和parameterType的基本使用和区别

    resultType与parameterType的基本使用和区别 Mybatis的Mapper文件中的select insert update delect元素中都有一个parameterType和resultType属性 paramete
  • MQ 入门实践

    MQ Message Queue 消息队列 FIFO 结构 例如电商平台 在用户支付订单后执行对应的操作 优点 异步 削峰 解耦 缺点 增加系统复杂性 数据一致性 可用性 JMS Java Message Service Java消息服务
  • ajax详细用法

    一 基础知识 1 首先让我们了解ajax 通过在后台与服务器进行少量数据交换 AJAX 可以使网页实现异步更新 这意味着可以在不重新加载整个网页的情况下 对网页的某部分进行更新 2 ajax的核心步骤 创建XMLHttpRequest对象
  • Android读取联系人的姓名及电话号码

    Android中联系人的信息是通过ContentProvider来供外部应用获取的 我们使用时只需根据系统联系人ContentProvider的Uri即可获取所需数据 下面讲解如何获取联系人的姓名及电话号码 别的数据如邮箱 照片等数据的获取
  • flutter开发中常用的dart插件

    本文罗列了一些在用flutter进行移动开发时经常会用到的插件 flutter插件官网地址 https pub dartlang org packages 1 image picker 一个可以从图库选择图片 并可以用相机拍摄新照片的flu
  • 关于Java中序列化Serializable的简单注解

    最近学校的实训课程在学习ssm框架 其中有一点实体类里面实现了Serializable序列化的方法 查了一下 仍然有点模糊 序列化和数据库中的字段有关 方便数据存储和传输 import java io Serializable public
  • 计算机专业毕业设计题目大全

    计算机专业毕业设计题目大全 一 ASP类计算机专业毕业设计题目 文章目录 计算机专业毕业设计题目大全 一 ASP类计算机专业毕业设计题目 ASP NET类计算机专业毕业设计题目 Delphi类计算机专业毕业设计题目 JAVA类计算机专业毕业
  • 2020 AI产业图谱启动,勾勒中国AI技术与行业生态

    2020年国务院政府工作报告 提出 重点支持 两新一重 建设 其中 两新一重 中的第一个 新 就是新基建 而人工智能是新基建的重要组成部分 新基建首次被纳入政府工作报告后 各大科技厂商纷纷押注 重金投向 新基建 例如腾讯已经宣布未来五年将投
  • 网络问题导致的github提交失败解决方案

    参考文章 github push过程中的timeout问题 码农家园 1 打开 C Windows System32 drivers etc 下的hosts文件 2 访问 github global ssl Fastly net Serve
  • 质量成本(一致性成本和非一致性成本)

    项目管理知识体系指南第四版 PMBOK2008 8 1 2 2 质量成本 质量成本包括在产品生命周期中为预防不符合要求 为评价产品或服务是否符合要求 以及因未达到要求 而发生的所有成本 质量成本 一致性成本和非一致性成本 一致性成本包括预防
  • 机器学习环境的搭建(miniconda+pycharm)

    一 Python语言环境的安装 miniconda 1 软件安装 直接去官网下载Miniconda速度太慢 建议去清华开源找一个替代的镜像下载 并且在清华该网站上面 还有附带的一些镜像使用帮助 2 anaconda与miniconda的区别
  • STM32CubeMx采集多路ADC

    转载于https blog csdn net qq 24815615 article details 70227385 原文地址https www eemaker com stm32cubemxadc html 单片机为 STM32F103
  • IntelliJ IDEA 好用的插件

    IntelliJ IDEA 好用的插件 1 Maven Helper Maven Helper插件可以方便显示maven的依赖树和方便解决依赖冲突问题 2 Alibaba Java Coding Guidelines Alibaba Jav
  • @FeignClient Get请求、实体参数,自动转POST请求问题

    问题 报错提示不支持POST请求 解决 使用SpringCloud2 1以上版本提供的 SpringQueryMap注解标注在实体对象参数后解决 导入注解包路径 import org springframework cloud openfe
  • lapack安装 matlab,调用 LAPACK 和 BLAS 函数

    将参数从 Fortran 程序传递给 Fortran 函数 您可以从 Fortran MEX 文件中调用 LAPACK 和 BLAS 函数 以下示例使用两个矩阵 并通过调用 BLAS 例程 dgemm 将这两个矩阵相乘 要运行该示例 请将代
  • java生成excel文件并写入数据(附csv)

    写一个超级简单粗暴的小代码了 直接看吧 public static void createxlsFile String filePath String fileName String suffix Map
  • 析构函数详解

    析构函数详解 析构函数的概念 前面通过构造函数的学习 我们知道一个对象是怎么来的 那一个对象又是怎么没呢的 析构函数 与构造函数功能相反 析构函数是完成对象的销毁 局部对象销毁工作是由编译器完成的 而对象在销毁时会自动调用析构函数 完成类的