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

文章目录

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

析构函数

析构函数的定义

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

stm32 hid自定义接收发送程序开发过程记录

cubleMX配置如下 修改端点描述符一次传输的数据大小 根据cubelMX标准在这里修改 编译错误 直接修改(因为没有使用nodef )编译通过 修改报告描述符(默认的描述符无法传输数据) 参考:USB协议详解第10讲(USB描…

C++从入门到精通——string类

string类 前言一、为什么学习string类C语言中的字符串示例 二、标准库中的string类string类string类的常用接口说明string类对象的常见构造string类对象的容量操作string的接口测试及使用string类对象的访问及遍历操作下标和方括号遍历范围for遍历迭代器遍历相同的代码&#xf…

元宇宙APP搭建重点,会用到哪些三方服务?

元宇宙APP的搭建是一个综合性的项目,涉及到众多关键要素和第三方服务。以下是一些元宇宙APP搭建的重点,以及可能用到的第三方服务: 一、搭建重点 技术框架的选择与搭建:元宇宙APP需要稳定、高效的技术框架来支撑其运行。这包括前…

上位机图像处理和嵌入式模块部署(树莓派4b与视觉slam十四讲)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 实际使用中,树莓派4b是非常好的一个基础平台。本身板子价格也不是很贵,建议大家多多使用。之前关于vslam,也就是…

Leetcode刷题-(36~40)-Java

算法是码农的基本功,也是各个大厂必考察的重点,让我们一起坚持刷算法题吧。 遇事不决,可问春风,春风不语,即是本心。 我们在我们能力范围内,做好我们该做的事,然后相信一切都事最好的安排就可…

深入理解Python协程:从基础到实战

title: 深入理解Python协程:从基础到实战 date: 2024/4/27 16:48:43 updated: 2024/4/27 16:48:43 categories: 后端开发 tags: 协程异步IO并发编程Pythonaiohttpasyncio网络爬虫 第1章:协程基础 1.1 协程概念介绍 协程(Coroutines&…

【科学研究】读博:一场精神赌博❓

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验,帮助大家尽早适应研究生生活,尽快了解科研的本质。祝一切顺利!—…

C++必修:类与对象(一)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C学习 贝蒂的主页:Betty’s blog 1. 面向过程与面向对象 1.1. 面向过程 我们之前学习的C语言就是一种面向过程的语…

java中http调用组件深入详解

目录 一、前言 二、http调用概述 2.1 什么是http调用 2.1.1 http调用步骤 2.2 HTTP调用特点 2.3 HTTP调用应用场景 三、微服务场景下http调用概述 3.1 微服务开发中http调用场景 3.2 微服务组件中http的应用 四、常用的http调用组件 4.1 java中常用的http组件介绍 4…

用 Python 创建 Voronoi 图

概述 最常见的空间问题之一是找到距离我们当前位置最近的兴趣点 (POI)。假设有人很快就会耗尽汽油,他/她需要在为时已晚之前找到最近的加油站,解决这个问题的最佳解决方案是什么?当然,驾驶员可以检查地图来找到最近的加油站&…

力扣每日一题-总行驶距离-2024.4.25

力扣题目:总行驶距离 题目链接: 2739.总行驶距离 题目描述 代码思路 直接用数学模拟计算即可 代码纯享版 class Solution {public int distanceTraveled(int mainTank, int additionalTank) {int sum 0;while(additionalTank > 0){if(mainTank > 5){mai…

CATO原理中的数学与魔术(六)——Baby Hummer的拓展一

在上一篇中,我们从CATO原理的数学讲解进入了魔术部分,介绍了其经典作品《Baby Hummer》,相关内容请戳: CATO原理中的数学与魔术(五)——Baby Hummer CATO原理中的数学与魔术(四)——…

leetcode 221 最大正方形面积

示例 3: 输入:matrix [["0"]] 输出:0 # 最大正方形面积 def max_square(matrix):m len(matrix)n len(matrix[0])if m 0 or n 0::return Nonemax_side 1dp [[0] * (n 1) for _ in range(m 1)]for i in range(1, m 1):fo…

2024全新瀚海跑道:矢量图片迅速养号游戏玩法,每天一小时,日转现200

最初我注意到这种玩法,是因为最近在浏览各大平台的视频时,我发现了一种特殊类型的账号,其养号成功率高达90%。这些账号发布的视频内容和数据非常夸张,而且制作起来非常简单,任何人都可以轻松上手。这些账号主要发布矢量…

Spring Web MVC入门(2)——请求

目录 一、传递单个参数 基础类型和包装类型的区别 1、基础类型 (1)不传参 (2)传字符串 2、包装类型 (1)不传参 (2)传字符串 3、小结 二、传递多个参数 三、传递对象 四、…

Leetcode_相交链表

✨✨所属专栏:LeetCode刷题专栏✨✨ ✨✨作者主页:嶔某✨✨ 题目: 题解: 看到这个题目首先我们要排除链表逆置的想法,如图、因为c1节点只有一个next指针,逆置后不可能同时指向a2和b3节点。 其次有的的同学…

阿里前端常考vue面试题汇总_阿里高级vue面试题

改变 ![](https://img-blog.csdnimg.cn/img_convert/b736620bcd29f08f3685022ab5583d8b.webp?x-oss-processimage/format,png)你会发现, **只有改变的栏目才闪烁,也就是进行重绘** ,数据没有改变的栏目还是保持原样,这样就大大节…

WebSocket 深入浅出

WebSocket 深入浅出 1. WebSocket 是什么2. WebSocket 建立连接通信的过程3. WebSocket 和http的联系与区别4. WebSocket 的使用场景及限制 1. WebSocket 是什么 定义:WebSocket 是一种网络通信协议,它允许在单个TCP连接上进行全双工通信。是HTML5规范提…

网络安全实训Day15

写在前面 电子垃圾,堂堂恢复连载。本来不想分天数梳理了,但是最后要写实训报告,报告里还要有实训日记记录每日学的东西,干脆发这里留个档,到时候写报告提供一个思路。 网络空间安全实训-渗透测试 渗透测试概述 定义 一…

关于conda占C盘内存的问题

文章目录 前言一、C盘中.conda文件中的envs二、C盘中.conda文件中的pkgs 前言 最近发现C盘空间越来越少,于是就去清理了一下conda在C盘的存储,不看不知道,一看吓一跳,足足十几G!于是去网上搜索了相关的包能不能删除&a…