C++系列赋值运算符重载

news2025/1/13 17:33:54

赋值运算符重载

  • 类的默认函数
    • 拷贝构造函数和赋值运算符
  • 重载赋值运算符
    • 相关注意事项

类的默认函数

一个类至少有4个默认函数:

  • 默认构造函数
  • 拷贝构造函数
  • 析构函数
  • 赋值运算符重载函数

拷贝构造函数和赋值运算符

  • 拷贝构造函数是在创建类的时候调用的,之前类并不存在。
  • 赋值运算符是在两个类均存在的情况下,把一个类的属性全部赋值给另外一个类。
  • 默认的拷贝构造函数和默认的赋值运算符在对象有堆区内存时,因为默认的均是浅拷贝,所以均会存在内存重复释放的问题。

重载赋值运算符

  • 语法:类名& operator=(const 类名& ref_h)

相关注意事项

  • 在对象的属性有在堆区开辟内存的情况下,不管是拷贝构造函数还是赋值运算符,都需要进行自定义。
  • 使用new在堆区重新开辟空间,避免重复释放。

  • 浅拷贝
    在这里插入图片描述

  • 深拷贝


在这里插入图片描述

code:
	#include <iostream>
	using namespace std;
	class Horse
	{
	private:
		int *m_age;
	public:
		Horse(int ref_age)
		{
			m_age = new int(ref_age);
		}
		Horse(const Horse& ref_h)
		{
			m_age = new int(*ref_h.m_age);
			//m_age = ref_h.m_age;   //默认的构造函数是这种实现方式,简单的赋值操作,在存在指针时,只是将指针简单赋值,指针指向的堆区空间并不进行拷贝。
			cout << "拷贝, " << m_age << ",  " << ref_h.m_age << ", age: " << * ref_h.m_age << endl;
		}
		
		Horse& operator=(const Horse& ref_h)		// 返回自身的引用,链式编程,实现连等操作
		{
			if (this == &ref_h)		// 如果是自身赋值,如h1=h1,直接返回
				cout << "自身赋值" << endl;
				return *this;
			// 如果对象已经有开辟了空间,先进行释放
			if (m_age != NULL)
			{
				delete m_age;
				m_age = NULL;
			}
			//m_age = ref_h.m_age;   //默认的是这种实现方式,简单的赋值操作,在存在指针时,只是将指针简单赋值,指针指向的堆区空间并不进行拷贝。
			m_age = new int(*ref_h.m_age); // 深拷贝
			cout << "=," << m_age << ",  " << ref_h.m_age << ", age: " << * ref_h.m_age << endl;
			return *this;
		}
		
		~Horse()
		{
			if (m_age != NULL)
			{
				cout << "析构:" <<  m_age << endl;
				delete m_age;
				m_age = NULL;
			}
		}
		
		void show_info()
		{
			cout << "age: " << * m_age << endl;
		}
	};
	
	// 对拷贝构造函数的测试
	void test01()
	{
		Horse h1(0);
		h1.show_info();
		Horse h2(h1);
		h2.show_info();
	}
	
	// 对=操作符的测试
	void test02()
	{
		Horse h1(88);
		Horse h2(2);
		Horse h3(5);
		h3 = h2 = h1;
		h1.show_info();
		h2.show_info();
		h3.show_info();
	}
	
	void main()
	{
		test01();
		cout << "************************" << endl;
		test02();
		system("pause");
	}
result:
	age: 0
	拷贝, 0000024C16116510,  0000024C16116A50, age: 0
	age: 0
	析构:0000024C16116510
	析构:0000024C16116A50
	************************
	=,0000024C16116150,  0000024C16116750, age: 88
	=,0000024C161164D0,  0000024C16116150, age: 88
	age: 88
	age: 88
	age: 88
	析构:0000024C161164D0
	析构:0000024C16116150
	析构:0000024C16116750
  • 注意在赋值运算符重载函数中,先判断是否在堆区有内存,有的话先释放,再重新开辟。

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

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

相关文章

利用PCA科学确定各个指标的权重系数

背景参考: 1、提取主成分 对样本进行PCA分析,查看不同变量贡献率,确定主要的指标。我们可以通过下列代码获取需要的所有数据: import numpy as np from sklearn.decomposition import PCA# 创建一个数据 np.random.seed(0) data = np.random.random((100,5)) y = np.ra…

深入理解CI/CD流程:改变你的开发生命周期

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

投后管理系统的主要功能及开发

投后管理系统是一种用于跟踪和管理投资组合中的投资的工具&#xff0c;通常由私募股权、风险投资公司、资产管理公司和投资者使用。其主要功能包括以下内容&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合…

全新跑分软件GeekRUN-7问世

实测非常好用CPU跑分神器点击下载 感兴趣的可以测测你的手机跑的多少。 我的峰值是7340&#xff0c;低值是4685&#xff0c;测试时后台不能有任何APP

丙烯酸共聚聚氯乙烯树脂

声明 本文是学习GB-T 42790-2023 丙烯酸共聚聚氯乙烯树脂. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了丙烯酸共聚聚氯乙烯树脂的外观、物化性能等技术要求&#xff0c;描述了相应的采样、试验方 法、检验规则、标志、包装、…

2023年中国场馆产业研究报告

第一章 行业综述 1.1 定义与分类 场馆&#xff0c;作为一个多元化和充满活力的行业&#xff0c;为人们提供了一个为不同目的而聚集的空间。无论是为了活动、表演、展览还是聚会&#xff0c;场馆都在为社区的社会、文化和经济建设做出了不可或缺的贡献。 场馆是一个为举办各类…

深入思考redis面经

1 redission分布式锁 1.1 为了保证数据一致性&#xff0c;引入了redission的锁&#xff0c;你是为了抗住高并发而去为了引入这个锁还是说为了保证数据一致性去引入的 答&#xff1a;主要是为了抗住高并发问题&#xff0c;解决redis的缓存击穿问题&#xff0c;但是也能解决一定…

【算法|链表】环形链表Ⅱ

环形链表Ⅱ 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统…

原创 VTK 基础入门 ( 一 ) 贴纹理

纹理 这个示例先读入一幅JPEG的二维纹理图;然后定义一个纹理类vtkTexture对象&#xff0c;接着把读入的NPG图像输入到vtkTexture 里&#xff0c; 作为它即将“贴”到平面上的一个纹理图;再定义一个vtkPlaneSource对象&#xff0c;类vtkPlaneSource 可以生成一个…

Pytorch学习:torch.max(input,dim,keepdim=False)

文章目录 torch.max()dimkeepdimdim0dim1 out&#xff1a;返回命名元组 (values, indices) torch.max() torch.max(input) → Tensor&#xff1a;返回 input 张量中所有元素的最大值。 注意输入的必须是张量形式&#xff0c;输出的也为张量形式 当输入为tuple类型时&#xf…

Attention is all you need 论文笔记

该论文引入Transformer&#xff0c;主要核心是自注意力机制&#xff0c;自注意力&#xff08;Self-Attention&#xff09;机制是一种可以考虑输入序列中所有位置信息的机制。 RNN介绍 引入RNN为了更好的处理序列信息&#xff0c;比如我 吃 苹果&#xff0c;前后的输入之间是有…

计算机组成原理之计算机系统概论、计算机的发展史、系统总线,三章开篇讲

第一章-计算机系统概论 1计算机系统简介 现代计算机的多态性 把感应器嵌入和装备到电网、铁道、桥梁、隧道、公路、建筑、供水系统、大坝、油气管道等各种物体中&#xff0c;并且被普遍连接&#xff0c;形成“物联网”&#xff0c;然后将“物联网”与现有的网络整合起来&…

无涯教程-JavaScript - ACOT函数

描述 ACOT函数以0至π之间的弧度(以弧度为单位)返回数的反正切或反余切的主值。 语法 ACOT (number)争论 Argument描述Required/OptionalNumberNumber is the cotangent of the angle you want. This must be a real number.Required Notes 要将输出从弧度转换为度, 使用D…

【计算机视觉 | 目标检测】YOLO-NAS的介绍以及如何使用?(含源代码)

文章目录 一、介绍1.1 亮点1.2 方案简介1.3 训练简介 二、使用案例 一、介绍 Github 仓库&#xff1a; https://github.com/Deci-AI/super-gradients/blob/master/YOLONAS.md1.1 亮点 参考QARepVGG&#xff0c;该方案引入了QSP与QCI模块以同时利用重参数与8-bit量化的优化&a…

C语言练习题解析(2)

&#x1f493;博客主页&#xff1a;江池俊的博客⏩收录专栏&#xff1a;C语言刷题专栏&#x1f449;专栏推荐&#xff1a;✅C语言初阶之路 ✅C语言进阶之路&#x1f4bb;代码仓库&#xff1a;江池俊的代码仓库&#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐ 文…

d3dx9_43.dll文件缺失的修复方法有哪些?4个方法快速修复d3dx9_43.dll

最近有很多小伙伴反映说他的电脑经常出现一个问题&#xff0c;那就是d3dx9_43.dll文件缺失了&#xff0c;然后一些程序都打不开&#xff0c;他们都是一脸懵逼&#xff0c;不知道怎么去处理这个问题&#xff0c;今天小编就要来给大家详细的说说这方面&#xff0c;d3dx9_43.dll文…

小谈设计模式(3)—策略模式

小谈设计模式&#xff08;3&#xff09;—策略模式 专栏介绍专栏地址专栏介绍 策略模式主要角色环境&#xff08;Context&#xff09;抽象策略&#xff08;Strategy&#xff09;具体策略&#xff08;Concrete Strategy&#xff09;角色总结 核心思想封装算法定义抽象策略使用环…

Minio入门系列【3】MinIO Client使用详解

1 简介 简称mc&#xff0c;是minio服务器的客户端&#xff0c;对ls&#xff0c;cat&#xff0c;cp&#xff0c;mirror&#xff0c;diff&#xff0c;find等UNIX命令提供了一种替代方案&#xff0c;它支持文件系统和兼容Amazon S3的云存储服务&#xff08;AWS Signature v2和v4&…

nginx知识点详解:反向代理+负载均衡+动静分离+高可用集群

一、nginx基本概念 1. nginx是什么&#xff0c;做什么事情&#xff1f; Nginx是一个高性能的HTTP和反向代理服务器&#xff0c;特点是占有内存少&#xff0c;并发能力强。Nginx转为性能优化而开发&#xff0c;能经受高负载考验。支持热部署&#xff0c;启动容易&#xff0c;运…

(三十二)大数据实战——Maxwell安装部署及其应用案例实战

前言 Maxwell是一个开源的MySQL数据库binlog解析工具&#xff0c;用于将MySQL数据库的binlog转换成易于消费的JSON格式&#xff0c;并通过Kafka、RabbitMQ、Kinesis 等消息队列或直接写入文件等方式将其输出。本节内容主要介绍如何安装部署Maxwell以及如何使用Maxwell完成数据…