析构函数/拷贝构造/赋值重载

news2025/1/10 23:41:31

析构函数:

	//  析构函数
	~Stack()
	{
		_top = 0;
		_capacity = 0;
		free(_a);
		_a = nullptr;
	}

1 、2两点与构造函数类似。

3、当我们未显示定义时,编译器会自动生成默认的析构函数。C++中,对于内置类型不进行任何处理,对于自定义类型,会分别去调用它们的析构函数。

对于Date类,没有动态申请资源,且全是内置类型,编译器不进行任何处理。当然,当对象的生命周期结束后,里面的变量也会销毁。

对于Stack类,有动态申请资源,也有内置类型,无自定义类型。对于动态申请资源的部分,我们需要自己写析构函数,对这些部分进行free,当对象生命周期结束时,编译器自动调用我们写的析构函数,对于申请的空间进行释放。内置部分可以在~Stack中进行清理、置空等。

对于MyQueue类,内部是2个自定义类型的Stack函数,默认析构函数会自动调用Stack的析构函数,从而自动对MyQueue的对象进行资源清理工作。

拷贝构造函数:

默认拷贝构造对于内置类型会进行浅拷贝,对于自定义类型,会去调用它们的拷贝构造函数。

Date类,直接将所有变量进行浅拷贝即可。

MyQueue类,调用2次Stack的拷贝构造,完成对对象的拷贝构造。

对于Stack类,默认拷贝构造只能完成浅拷贝,此时就需要手动写一个 深拷贝构造。

 当Stack是浅拷贝时,两次的_a指针指向同一块空间。在对st2进行析构时,会对这块空间free,当对st1进行析构时,就会对同一块空间多次free,从而产生错误。

要分清 深、浅拷贝之间的区别。

	//  拷贝构造函数
	Stack(const Stack& x)
	{
		_top = x._top;
		_capacity = x._capacity;
		int* tmp = (int*)malloc(sizeof(int) * x._capacity);
		if (nullptr == tmp)
		{
			perror("malloc fail");
			return;
		}
		_a = tmp;
		memcpy(_a, x._a, sizeof(int) * x._top);
	}

拷贝构造函数典型调用场景:
1、使用已存在对象创建新对象
2、函数参数类型为类类型对象
3、函数返回值类型为类类型对象

 返回的值不是引用,且为自定义类型时,都会调用对应的拷贝构造函数。

这里给ret赋值,实际上是初始化操作,因此也需要调用拷贝构造函数。

传参时,由于形参是一份临时拷贝,因此也需要调用拷贝构造。

注意:实现拷贝构造时,参数类型必须是这个类的引用  const Type& x,如果不为引用,则在传参时就会调用拷贝构造,从而引发无限递归调用,发生错误。

运算符重载:

C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其
返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。
函数名字为:关键字operator后面接需要重载的运算符符号
函数原型:返回值类型 operator操作符(参数列表)。

简单来说:在C语言中,我们对于内置类型可以使用运算符进行有关操作。而在C++中,我们想将这些操作推广到自定义类型中。

而对于不同的自定义类型,可以使用的运算符是不同的,我们可以自己定义几个特殊的函数来实现这些运算符的功能。

注意:

 作为类成员函数(在类的内部进行实现)重载时,其形参看起来比操作数数目少1,因为成员函数的第一个参数为隐藏的this指针。

赋值运算符重载:

1. 赋值运算符重载格式

1、参数类型:const T&,传递引用可以提高传参效率。
2、返回值类型:T&,返回引用可以提高返回的效率,有返回值目的是为了支持连续赋值。     

3、检测是否自己给自己赋值。
4、返回*this :要复合连续赋值的含义。

这里我将定义和声明分离了,因此需要加上Date::来限定是Date类中的赋值运算符重载。 

 d2=d1的连续赋值,返回值是d2作为这个表达式的返回值。

再将整体给d3初始化,这里虽然用了赋值符号=,但其实是初始化,即调用拷贝构造。

用户没有显式实现时,编译器会生成一个默认赋值运算符重载,默认赋值是浅拷贝。

目录

析构函数:

拷贝构造函数:

运算符重载:

赋值运算符重载:


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

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

相关文章

【SAS应用统计分析】方差分析

声明:本文知识参考内容来自网络,如有侵权请联系删除。 目录 【anova过程】 1.anova过程的语句格式 2.语句说明 【glm过程】 1.glm过程的语句格式 2.语句说明 【实例分析】 【实验步骤】 总结 【anova过程】 SAS系统的START软件提供了anova过程…

TensorRT:自定义插件学习与实践 001

文章简述 本文简单列出了编写Tensorrt插件所需要的关键方法,分为两个部分,一是插件类的具体实现方法,另外是插件工厂的调用方法,插件类最终将编译为.so文件,使用时在c或python中调用,所以插件类的方法调用在其他部分,在本文中难以直观的体现调…

PyQt5

最近在学习pyqt5, 使用pyqt5的时候出现了一些莫名奇妙的问题,解决之后决定把它记录下来,方面pyqt5的初学者使用。 每个问题会按照如下方式进行描述 1、问题描述: 2、解决方法: 问题1: 使用pyinstaller打…

计算机网络笔记:TCP三次握手和四次挥手过程

TCP是面向连接的协议,连接的建立和释放是每一次面向连接的通信中必不可少的过程。TCP连接的管理就是使连接的建立和释放都能正常地进行。 三次握手 TCP连接的建立—三次握手建立TCP连接 ① 若主机A中运行了一个客户进程,当它需要主机B的服务时&#xff0…

迁移学习

迁移学习 什么是迁移学习 迁移学习【斯坦福21秋季:实用机器学习中文版】 迁移学习(Transfer Learning)是一种机器学习方法,它通过将一个领域中的知识和经验迁移到另一个相关领域中,来加速和改进新领域的学习和解决问…

OS开源项目周报0105

由OpenDigg 出品的iOS开源项目周报第四期来啦。iOS开源周报集合了OpenDigg一周来新收录的优质的iOS开发方面的开源项目,方便iOS开发人员便捷的找到自己需要的项目工具等。 Hero 酷炫的iOS动画引擎 Traits 实时修改原生iOS 应用属性 JSDBanTangHomeDemo 仿半糖首页…

【Git】‘git‘ 不是内部或外部命令,也不是可运行的程序

一、问题 我想利用git clone命令从github上下载项目源代码,发现报错: git 不是内部或外部命令,也不是可运行的程序或批处理文件。我用cmd跑一下git命令,发现报错: 二、问题分析 这个错误提示表明您的系统中没有安装…

Illustrator如何使用基础功能?

文章目录 0.引言1.菜单栏2.工具箱 0.引言 因科研等多场景需要进行绘图处理,笔者对Illustrator进行了学习,本文通过《Illustrator CC2018基础与实战》及其配套素材结合网上相关资料进行学习笔记总结,本文对软件界面基本功能进行阐述。    1…

第四章 数据关联分析方法

基本概念和方法 关联规则和算法应用 基本概念和术语 关联规则算法应用: 一个关联规则分析的例子—————超市购物篮分析 不要看 后面数字看不懂 项集:是指项的集合。包含k个项的项集称为k-项集 支持度:若A是一个项集,则A的…

Vue3 +TypeScript 引入 BabylonJs(Vue3实现3D)【一篇文章精通系列】

本文主要介绍如何使用Vue3和TypeScript引入BabylonJs技术实现3D效果。结合实际案例,详细讲解了如何在Vue3项目中引入BabylonJs,并了解其相关知识。通过本文的学习,相信读者可以轻松掌握Vue3实现3D效果以及BabylonJs的相关知识。 Vue3 TypeS…

天梯赛L1-001 ~ 010

👂 White Lie - Jhameel - 单曲 - 网易云音乐 👂 丁丁猫儿 - 施鑫文月 - 单曲 - 网易云音乐 今年蓝桥 / 天梯都陪跑,希望明年,蓝桥杯省一(CA组60分),天梯赛国三(180分)…

详细的实用技巧,让你轻松成为WEB自动化测试大师

目录 一、什么是WEB自动化测试 二、WEB自动化测试工具 三、SeleniumPython环境搭建 1. 安装Python解释器 2. 安装Selenium库 3. 下载浏览器驱动程序 4. 配置环境变量 四、WEB自动化测试实战 1. 编写测试脚本 2. 使用Page Object模式 3. 使用数据驱动测试 五、总结 …

【PowerDesigner】一款超好用的E-R图工具,快速构建出高质量的数据库结构,提高开发效率和代码质量

博主简介:努力学习的大一在校计算机专业学生,热爱学习和创作。目前在学习和分享:数据结构、Go,Java等相关知识。博主主页: 是瑶瑶子啦所属专栏: Mysql从入门到精通 近期目标:写好专栏的每一篇文章 文章目录…

IPsec IKE第一阶段主模式和野蛮模式

国密标准GMT 0022-2014 IPSec VPN 技术规范,IPsec IKE过程中交换类型的定义将主模式Main mode分配值为2,快速模式-quick mode分配值为32。标准中并没有提现分配值为4的交换类型。在实际应用中,IKE第一阶段经常会出现交换类型为4的情况&#x…

留守儿童爱心网站

摘要 随着留守儿童爱心管理的不断发展,留守儿童爱心网站在现实生活中的使用和普及,留守儿童爱心管理成为近年内出现的一个热门话题,并且能够成为大众广为认可和接受的行为和选择。设计留守儿童爱心网站的目的就是借助计算机让复杂的管理操作…

【C++】-关于类和对象的默认成员函数(中)-拷贝构造函数和赋值运算符重载函数

💖作者:小树苗渴望变成参天大树 ❤️‍🩹作者宣言:认真写好每一篇博客 💨作者gitee:gitee 💞作者专栏:C语言,数据结构初阶,Linux,C 如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点…

带你玩转单向链表(学习必备)

本文概要 本篇文章主要介绍数据结构中单向链表各种操作,适合有C语言基础的同学,文中描述和代码示例很详细,干货满满,感兴趣的小伙伴快来一起学习吧! 🌟🌟🌟个人简介🌟&…

Redis入门到实战(实战篇)

Redis基础篇 实战篇Redis 开篇导读 亲爱的小伙伴们大家好,马上咱们就开始实战篇的内容了,相信通过本章的学习,小伙伴们就能理解各种redis的使用啦,接下来咱们来一起看看实战篇我们要学习一些什么样的内容 短信登录 这一块我们会使…

携程:一个被严重低估了的在线旅游平台?

来源:猛兽财经 作者:猛兽财经 携程和旅游行业面临的不利因素依然存在 在疫情期间,由于全球范围内的旅行受到了限制,所以整个旅游行业都受到了巨大打击。休闲旅游和商务旅行也陷入了停顿,此后一直在缓慢恢复。 而当疫情…

Java8流式操作——最终操作

什么是最终操作? 当我们通过最终方法对流对象进行操作,说明stream流操作也完成,最后我们将对象汇总成一个结果(总数、对象、集合……) 方法 collect:将Stream中的元素汇总(转化)成…