类和对象【三】析构函数和拷贝构造函数

文章目录

  • 析构函数
    • 析构函数的定义
    • 析构函数的作用
      • 主要作用
      • 次要作用
    • 析构函数的特点
  • 拷贝构造函数
    • 拷贝构造函数的定义
    • 拷贝构造函数的作用
      • 主要作用
      • 次要作用
    • 拷贝构造函数的特点
    • 浅拷贝和深拷贝
      • 浅拷贝
      • 深拷贝
    • 拷贝构造函数的调用场景

析构函数

析构函数的定义

析构函数(destructor) 与构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统自动执行析构函数。
析构函数往往用来做“清理善后” 的工作(例如:在建立对象时用new开辟了一片内存空间,delete会自动调用析构函数后释放内存)。
来自百度百科


析构函数的作用

主要作用

完成对 对象 申请来的资源清理工作

析构函数可以用于释放对象在使用过程中分配的资源,如动态分配的内存打开的文件句柄网络连接
这样可以避免资源泄漏,确保程序的稳定性和资源的有效管理


次要作用

可以根据析构函数在对象生命周期结束时编译器自动调用这个特点,在析构函数中完成一些特殊操作

【例如:在类里创建一个static修饰的成员变量,让它在调用构造函数时++,调用拷贝构造时++,调用析构函数时- -,这样就可以实时记录还有多少个“存活”】


析构函数的特点

  1. 析构函数名是在类名前加上字符 。

  2. 析构函数没有参数也返回值类型。

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

  4. 因为析构函数没有参数,所以析构函数不能重载,所以一个类只有一个析构函数

  5. 如果没有显式实现析构函数,编译器会自动生成一个默认的析构函数
    这个默认的析构函数的特点是:
    1 对内置类型成员变量不做处理无论内置类型是否申请了资源,都不处理
    2 对自定义类型 就自动调用所属的类的析构函数

    在这里插入图片描述


拷贝构造函数

拷贝构造函数的定义

拷贝构造函数是C++中一种构造函数的重载,它的作用是:用已有对象创建一个新对象,并将已存在的同类对象的数据成员拷贝到新对象中。
拷贝构造函数的形参是一个对该已有对象的引用,并且通常会被声明为const,以防止通过引用修改原对象


拷贝构造函数的作用

主要作用

用已有对象创建一个新对象,并将已存在的同类对象的数据成员拷贝到新对象中。

次要作用

可以根据拷贝构造函数在创建对象时编译器自动调用这个特点,在析构函数中完成一些特殊操作

【例如:在类里创建一个static修饰的成员变量,让它在调用构造函数时++,调用拷贝构造时++,调用析构函数时- -,这样就可以实时记录还有多少个“存活”】


拷贝构造函数的特点

  1. 拷贝构造函数是构造函数的重载,所以它也是构造函数,它只能用于创建新对象不能用于两个已经创建对象之间的拷贝

  2. 拷贝构造函数只有一个参数,参数必须是该类的对象的引用
    如果第不是该类的对象的引用或者有多个参数,那它就不是拷贝构造,而是普通构造函数

  3. 拷贝构造的第一个参数必须是该类对象的引用,不能是该类对象本身
    因为传值调用时,形参是实参的临时拷贝,所以规定了传对象本身的时候要调用拷贝构造函数
    这样的话,如果一个类的拷贝构造的参数是该类对象本身,那么调用拷贝构造,就要向传参,而传对象本身的时候又要调用拷贝构造,调用拷贝构造又要先传参数………
    就会无穷递归

    在这里插入图片描述

  4. 如果没有显式的写出拷贝构造函数,编译器会自动生成一个默认的拷贝构造函数
    这个默认的拷贝构造函数的特点是:
    1,对内置类型【int char等】成员直接浅拷贝
    2,对自定义类型【class,struct等】成员就调用该自定义类型自己的拷贝构造


浅拷贝和深拷贝

浅拷贝

把一个对象中的成员中存储的值直接拷贝给另一个对象的对应成员就是浅拷贝

下图就是一个浅拷贝的拷贝构造函数
在这里插入图片描述
浅拷贝的缺点:
如果对象的成员申请了资源,那么成员中存储的往往是那片资源的地址

此时如果使用浅拷贝,就直接把这个成员中存储的地址给了另一个对象的成员,那么这两个对象的成员就会指向同一片资源,这样不仅使用不方便,析构释放资源的时候还会多次释放,导致程序崩溃


在这里插入图片描述
上图相当于
在这里插入图片描述

解决办法也很简单,就让两个对象指向的资源不是同一片就可以了,也就是深拷贝


深拷贝

当对象有成员指向资源的时候,如果要把这个对象拷贝给其他对象就要用深拷贝

深拷贝很简单,分2步

  1. 先“拷贝”指向资源的数据结构
    即如果成语指向的资源是一条节点都在堆区的链表,这个时候接受拷贝的对象的成员就也要在堆区申请空间,创建节点,制造出于那条链表相同的节点个数和节点大小

  2. 再拷贝数据
    即把指向资源中存储的有效数据拷贝个另一个成员

例 上面例举的浅拷贝时的问题就可以这样解决
在这里插入图片描述


拷贝构造函数的调用场景

  1. 使用已经创建好的对象去创建新的对象
    在这里插入图片描述

  2. 函数的参数类型是类的对象
    因为形参是实参的临时拷贝,所以当参数是类的对象的时候,就要创建一个对象作为形参,当调用该函数的时候,编译器自动调用拷贝构造

    在这里插入图片描述

3.函数的返回值是类的对象
因为在函数调用结束后函数的栈区内存会被回收,如果返回的是在函数内创建的对象,函数调用结束后,这个对象的生命周期也会结束,空间会被释放
为了防止这样的情况,就需要创建一个临时对象来存储可能被销毁的对象的数据,这个临时对象就要编译器自动调用拷贝构造函数创建

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

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

相关文章

mybatis基本使用

文章目录 1. mybatis2. 基本使用(1) maven坐标(2) 配置文件编写(3) 数据库操作(4) 注解查询 2. 基本配置(1) 读取外部配置文件(2) mapper映射 3. 映射文件查询删除/修改/新增 动态sql 1. mybatis MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高…

使用 Gradio 的“热重载”模式快速开发 AI 应用

在这篇文章中,我将展示如何利用 Gradio 的热重载模式快速构建一个功能齐全的 AI 应用。但在进入正题之前,让我们先了解一下什么是重载模式以及 Gradio 为什么要采用自定义的自动重载逻辑。如果你已熟悉 Gradio 并急于开始构建,请直接跳转到第…

【Camera KMD ISP SubSystem笔记】Request 流转与Bubble机制

ISP中断类型 SOF: 一帧图像数据开始传输 EOF: 一帧图像数据传输完成 REG_UPDATE: ISP寄存器更新完成(每个reg group都有独立的这个中断) EPOCH: ISP某一行结尾(默认20)就会产生此中断 BUFFER DONE: 一帧图像数据ISP完全写到DDR了 管理Isp request的几个List st…

代码随想录:二叉树22-24

目录 700.二叉搜索树的搜索 题目 代码(二叉搜索树迭代) 代码(二叉搜索树递归) 代码(普通二叉树递归) 代码(普通二叉树迭代) 98.验证二叉搜索树 题目 代码(中序递…

oracle rman restore database的时候报错RMAN-06023: 没有找到数据文件1的副本来还原

一 问题描述 在oracle异地备份恢复测试数据库上执行restore database的时候报错: RMAN-06023: 没有找到数据文件1的副本来还原 可是我看备份明明都是存在的,而且已经执行了catalog start with命令。 有点奇怪的是catalog start with的时候&#xff0c…

牛客NC143 矩阵乘法【中等 矩阵 C++/Java/Go/PHP】

题目 题目链接: https://www.nowcoder.com/practice/bf358c3ac73e491585943bac94e309b0 思路 矩阵算法在图像处理、神经网络、模式识别等领域有着广泛的用途。在矩阵乘法中,A矩阵和B矩阵可以做乘法运算必须满足A矩阵的列的数量等于B矩阵的行的数量。运算…

d13(126-129)-勇敢开始Java,咖啡拯救人生

目录 Arrays类 数组中存储对象时 排序 在要比较的类中public class 类名 implements Comparable <类名> Comparator JDK8新特性&#xff1a;Lambda表达式 Lambda表达式的省略写法 方法引用 静态方法引用 实例方法引用 特定类型的方法引用 构造器引用 医院挂号系…

FANUC机器人SOCKET连接指令编写

一、创建一个.KL文件编写连接指令 创建一个KL文本来编写FANUC机器人socket连接指令 二、KAREL指令代码 fanuc机器人karel编辑器编辑的karel代码如下&#xff1a; PROGRAM SM_CON %COMMENT SOCKET连接 %STACKSIZE 4000 --堆栈大小 %INCLUDE klevccdfVAR status,data_type,in…

【draw.io的使用心得介绍】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

OpenHarmony实战开发-使用SmartPerf-Host分析应用性能

简介 SmartPerf-Host是一款深入挖掘数据、细粒度展示数据的性能功耗调优工具&#xff0c;可采集CPU调度、频点、进程线程时间片、堆内存、帧率等数据&#xff0c;采集的数据通过泳道图清晰地呈现给开发者&#xff0c;同时通过GUI以可视化的方式进行分析。该工具当前为开发者提…

2024第十五届蓝桥杯网络安全赛项WriteUp

欢迎关注公众号【Real返璞归真】回复【蓝桥杯2024】获取完整题目附件。 排名 安全知识 错1个选择题&#xff0c;题目说的不清楚&#xff0c;没搞懂题意。肯定不能用eval。错了理论题有点遗憾。 没想到这题前端是要解析json数据&#xff0c;排除CD选了A&#xff0c;结果发现正…

每日一题(力扣45):跳跃游戏2--贪心

由于题目已经告诉了我们一定可以跳到&#xff0c;所以我们只需去考虑前进最快的方法。即 判断当前下一步能跳的各个位置中&#xff0c;哪个能带你去去向最远的地方&#xff08;why&#xff1f; 因为其他位置所能提供的最大范围都没最远那个大&#xff0c;所以最远的那个已经可以…

嵌入式Linux学习——Ubantu初体验

Ubuntu 和Windows 的最大差别 Windows中的每一个分区都对应着一个盘符&#xff0c;盘符下可以存放目录与文件&#xff0c;而在Ubantu中没有盘符的概念&#xff0c;只有目录结构。实际上不同的目录可能挂载在不同的分区之下&#xff0c;如果想要查看当前目录位于磁盘的哪个分区…

【服务器部署篇】Jenkins配置后端工程自动化部署

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0c;产…

Transformer实战 单词预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f366; 参考文章&#xff1a;TensorFlow入门实战&#xff5c;第3周&#xff1a;天气识别&#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制 一、定义模型 from tempfile import Tempor…

ruoyi-nbcio-plus基于vue3的flowable为了适配文件上传改造VForm3的代码记录

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; h…

java如何使用webService方式调用对接第三方平台

实际使用记录&#xff0c;做个记录&#xff1a; 1、需要对方提供wsdl文件,该文件中有接口的Ip地址&#xff0c;方法名、参数等详细信息&#xff0c; wsdl文档中targetNamespace为命名空间 <xsd:element name"searchBGDMIInfo">标签中name是方法名&#xff1…

数据结构-树和森林之间的转化

从树的二叉链表的定义可知&#xff0c;任何一棵和树对应的二叉树&#xff0c;其根节点的右子树必为空。这里我们举三个树&#xff0c;将这个由三个树组成的森林组成二叉树是这个样子的。 下面我们说明一下详细过程&#xff0c;首先将每个树转化为二叉的状态&#xff0c;如图所示…

NAT网络地址转换实验(华为)

思科设备参考&#xff1a;NAT网络地址转换实验&#xff08;思科&#xff09; 一&#xff0c;技术简介 NAT&#xff08;Network Address Translation&#xff09;&#xff0c;即网络地址转换技术&#xff0c;是一种在现代计算机网络中广泛应用的技术&#xff0c;主要用于有效管…

汇编语言(详解)

汇编语言安装指南 第一步&#xff1a;在github上下载汇编语言的安装包 网址&#xff1a;GitHub - HaiPenglai/bilibili_assembly: B站-汇编语言-pdf、代码、环境等资料B站-汇编语言-pdf、代码、环境等资料. Contribute to HaiPenglai/bilibili_assembly development by creat…