默认成员函数:析构、深浅拷贝

析构函数

析构函数:与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。

特性

  1. 析构函数名时在类名前面加上字符~
class Date
{
public:Date(int year, int month , int day){_year = year;_month = month;_day = day;}~Date(){......}private:int _year = 0;int _month = 0;int _day = 0;
}
  1. 无参数无返回值类型,不带void

  2. 一个类只能由一个析构函数,如果未显式定义,系统会自动生成默认的析构函数。

  3. 析构函数不支持重载。

  4. 对象声明周期结束时,C++编译系统自动调用析构函数。

  5. 编译器生成的默认析构函数,对自定义类型成员调用它的析构函数。对内置类型不做处理。

  6. 如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数。有资源申请时,一定要写,否则会造成资源泄露。

    对象的栈帧的开辟和销毁都是由编译器进行的。不需要析构
    动态开辟的空间资源才需要析构。

拷贝构造

拷贝构造函数:只有单个形参,该形参试对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。

特征

  • 浅拷贝:值拷贝
  • 深拷贝:深拷贝本质拷贝指向的资源,让两个被拷贝和拷贝者都有一样大的空间,一样大的值,但不是同一个空间。
  1. 拷贝构造函数是构造函数的一个重载形式

  2. 拷贝构造函数的参数只有一个且必须是类类型对象的引用,使用传值方式编译器直接报错,因为会引发无穷递归调用。

  3. 若未显式定义,编译器会生成默认的拷贝构造函数。默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。

  4. 编译器生成的默认拷贝构造函数已经可以完成字节序的值拷贝,还需要自己显实现吗?如果像日期类这种类没有必要的,但是如果是别的需要开辟空间的呢?

    创建一个stack的对象s1,s1调用构造函数,申请了一个空间。s2使用s1拷贝构造,而Stack中没有显式定义的拷贝构造函数,此时编译器默认生成了一个拷贝构造函数,默认的拷贝构造函数是按照值拷贝的方式进行拷贝的,即将s1中的成员变量存储的值原封不动的赋值给了s2中的成员变量,拷贝结束之后,s2中的成员变量指向了和s1成员变量指向的同一片空间。
    当程序结束的时候,s2先销毁,s1后销毁,s2先调用析构函数对这片申请的空间进行了析构,然后s1销毁,此时s1并不知道这片内存空间已经销毁了,再次对这片空间进行了析构,此时就会崩溃。对一片内存空间进行了多次释放。

浅拷贝

  • 类中如果没有设计资源申请时,拷贝构造函数是否写都可以;
  • 一旦涉及到资源申请,则拷贝构造函数是一定要写的,否则就是浅拷贝。
  1. 拷贝构造的典型调用场景:
    • 使用已存在的对象创建对象
    • 函数参数类型未类类型对象
    • 函数返回值类型为类类型对象
  • 为了提高程序效率,一般对象传参时,尽量使用引用类型,返回时根据实际场景,能用引用尽量使用引用。

  • 拷贝构造主要用于解决深拷贝的问题。

  • 深拷贝本质拷贝指向的资源,让两个被拷贝和拷贝者都有一样大的空间,一样大的值,但不是同一个空间。

深拷贝

//Stack st2(st1);
Stack(const Stack& st)
{_a = (int*)malloc(sizeof(int) * st._capacity);if(_a == nullptr){perror("malloc fail");exit(-1);}memcpy(_a,st._a,sizeof(int)*st._top);_top = st._top;_capacity = st._capacity;
}
  • 两个已经存在的对象拷贝,赋值拷贝
  • 一个已经存在的对象拷贝初始化另一个要创建的对象,就是拷贝构造
A aa1(1);A aa2(aa1);    //拷贝构造
A aa3 = aa1;   //拷贝构造aa2 = aa3;    //赋值拷贝

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

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

相关文章

Spring Bean的生命周期 五步 七步 十步 循序渐进

👨‍🏫 参考视频地址 💖 五步版 实例化 bean(构造方法)属性注入(set() 方法)初始化方法(自定义)使用bean销毁方法(自定义) 💖 七步版…

linux的 /usr/sbin/nologin /sbin/nologin /bin/false /etc/nologin 的作用与区别

/usr/sbin/nologin /sbin/nologin /bin/false /etc/nologin 的作用与区别 /usr/sbin/nologin /sbin/nologin /bin/false 这三者的作用几乎一样,都是禁止用户登录。 /usr/sbin/nologin /sbin/nologin 是同一个文件,通过软连接指向。 当把用户的bash设置…

生态系统类型分布数据、土地利用数据、植被类型分布、自然保护区分布数据

引言 全国自然保护区生态系统类型分布信息产品是指基于Landsat TM数字影像(以地形图纠正),采用全数字化人机交互遥感快速提取方法,建立全国自然保护区生态系统结构数据集,同时做成多种尺度的栅格数据,其中包…

JVM面试题:85道JVM虚拟机面试题及答案

面试题 1 .简述Java堆的结构?什么是堆中的永久代(Perm Gen space)? JVM整体结构及内存模型 试题回答参考思路: 1、堆结构 JVM的堆是运行时数据区,所有类的实例和数组都是在堆上分配内存。它在JVM启动的时候被创建。对象所占的堆内存是由自…

美国站群服务器如何提高企业网站的负载均衡能力?

美国站群服务器如何提高企业网站的负载均衡能力? 美国站群服务器是企业提高网站负载均衡能力的重要工具之一。随着网络流量的增加和用户需求的多样化,如何有效地管理和分配流量成为了企业面临的挑战。通过采用美国站群服务器,企业可以实现流量的智能分…

排序(一)----冒泡排序,插入排序

前言 今天讲一些简单的排序,冒泡排序和插入排序,但是这两个排序时间复杂度较大,只是起到一定的学习作用,只需要了解并会使用就行,本文章是以升序为例子来介绍的 一冒泡排序 思路 冒泡排序是一种简单的排序算法,它重复地遍历要排序的序列,每次比较相邻…

Dato for Mac v5.2.11激活版:掌握时间,掌控生活

在忙碌的生活中,您是否常常觉得时间不够用?Dato for Mac,您的时间管理专家,助您轻松掌控每一天。清晰的日历视图、个性化的提醒功能,让您的日程安排井井有条。无论是工作还是生活,Dato for Mac都能成为您的…

AI图像生成-调整

一、两张图画风不相似 2、在两张图的共同输出口新添加一个空白正面提示词板块和条件合并板块 二、预处理插件(提取人物姿态) 1、新建节点-》ControlNet预处理器-》面部与姿态-》Openpose姿态预处理器 2、添加上传图片板块与预览图片板块 3、提取姿态 右…

vue下载文件,获取header头文件名乱码,下载文件名有下划线的解决

后台以数据流将文件返回,将文件名放在header头里,是中文名,有乱码,如图 访问网络使用的是axios,在 // 响应拦截器 service.interceptors.response.use((res) > {........ if (res.config.responseType blob) {//文…

【Linux取经路】进程通信之匿名管道

文章目录 一、进程间通信介绍1.1 进程间通信是什么?1.2 进程间通信的目的1.3 进程通信该如何实现 二、管道2.1 匿名管道2.1.1 站在文件描述符角度深入理解管道2.1.2 接口使用2.1.3 PIPE_BUFFER 和 Pipe capacity2.1.4 管道中的四种情况2.1.5 管道特征总结 2.2 匿名管…

只用了三天就入门了Vue3?

"真的我学Vue3,只是为了完成JAVA课设" 环境配置 使用Vue3要去先下载Node.js。 就像用Python离不开pip包管理器一样。 Node.js — Run JavaScript Everywhere (nodejs.org) 下完Node.js去学习怎么使用npm包管理器,放心你只需要学一些基础的…

【MARIE】嵌入式系统设计半期报告:MARIE模拟器的使用

1.模拟器介绍 1.1 体系结构 MARIE (Machine Architecture that is Really Intuitive and Easy) 是一种机器架构和汇编语言。发布者还为机器提供了一组用 Java 编写的模拟器程序。MARIE.js 是 MARIE 的 JavaScript 版本实现。它旨在尽可能忠实于原始 Ja…

基于EKF扩展卡尔曼滤波的一阶环形倒立摆控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于EKF扩展卡尔曼滤波的一阶环形倒立摆控制系统simulink建模与仿真。基于扩展卡尔曼滤波(Extended Kalman Filter, EKF)的一阶环形倒立摆控制系统&…

【并发程序设计】4. exec函数族

4.exec函数族 exec函数族是一组用于在进程中启动另一个程序来替换当前进程的函数。 exec函数族主要用于在当前进程内部执行一个新的程序,而不会创建新的进程。 子进程调用exec函数,族父进程不受影响。进程当前内容被指定的程序替换,但进程…

【YOLOV5 入门】——Gradio搭建Web GUI

引入:上节搭建的UI可视化界面只能以运行程序弹出窗口的形式运行,不能在网页Web中使用,本次代码将会非常少! 一、Gradio简介与安装 Gradio 是一个用于构建机器学习模型演示界面和Web应用的开源库。提供了简单易用的界面&#xff0…

云端的艺术革命:云渲染如何重塑动画与视觉特效产业

在 2019 年,乔恩费儒(Jon Favreau)决定重拍迪士尼的经典电影《狮子王》。他的创新构想是以真实动物为模型,在非洲草原上拍摄,由真实动物“出演”的辛巴和其他角色,随后通过配音赋予它们生命。 为了实现这一…

janus源码分析(1)--代码结构整理

基础说明 janus官网 https://janus.conf.meetecho.com/index.html janus源码地址 https://github.com/meetecho/janus-gateway 编译及部署参考 https://pro-hnb.blog.csdn.net/article/details/137730389?spm1001.2014.3001.5502 https://pro-hnb.blog.csdn.net/article/deta…

【Python探索之旅】列表

目录 特点 入门 访问元素 新增元素 修改元素 插入元素 删除元素 完结撒花 前言 在Python中,列表(List)是最常用的数据结构之一,类似于其他语言,如Java,与其不同啊Python中不需要声明数据类型。它提供了一种灵活且高效的方式…

Linux-线程

目录 1. 线程概念 2. 线程vs进程 3. 线程的优缺点 4. 线程创建 4.1 pthread_create 4.2 pthread_self 5. 线程终止 5.1 return 5.2 pthread_exit 5.3 pthread_cancel 6. 线程等待 7. 线程分离 1. 线程概念 线程:轻量级进程,在进程内部执行&a…

谷歌Gemini时代来了!加固搜索护城河、赋能全家桶,Gemini 1.5 Pro升级至200万token

3 月中旬,谷歌宣布 Google I/O 定档北京时间 5 月 15 日凌晨 1 点。而当大会开幕时间临近,本应是讨论度最高的时候,「宿敌」OpenAI 却半路杀出,抢先一天,仅耗时 27 分钟就发布了颠覆性巨作 GPT-4o,将新一轮…