C++赋值运算符重载

【C++】赋值运算符重载(超详细解析,小白必看系列) 运算符重载允许自定义类型使用内置运算符。函数名为 `operator` 后接运算符符号,返回值类型和参数列表类似普通函数。不能创建新运算符,必须有类类型参数,内置类型运算符含义不能改变。以下运算符不能重载:`.*`、`::`、`sizeof`、`?:`、`.`。 阅读详情
AI摘要

本文详细讲解C++中运算符重载的基本规则,重点分析赋值运算符重载的应用场景与实现方法。强调在涉及动态资源管理时必须自定义赋值运算符,避免浅拷贝导致的重复释放问题,并指出默认赋值操作仅适用于无资源申请的简单类对象。

1.运算符重载

1.1运算符重载的定义

运算符的定义要用到一个关键字operator,那么这个定义的格式就是operator+运算符号+(参数列表)+函数主体+返回值,如下图所示

1.2运算符重载的概念

我们要确定一个概念,就是对象之间是可以使用运算符的,但是当运算符用于对象之间时,会调用对应的运算符重载,如果没有用于对象之间的这个运算符重载,编译器就会报错。

1.3运算符重载参数个数问题

运算符重载参数个数可以参考运算符的参数个数,比如

==有两个参数,A==B,

++有一个参数,A++  

-有两个参数 A-B     :      在左边就给左边参数,在右边就给右边参数

1.4当运算符重载是成员函数

 假如我在类中加一个private

那我们只能将运算符重载归到类中才能对private进行访问 

为什么这样会报错呢?

因为C++在设计的时候,类中的成员函数第一个运算对象默认传给this指针,所以上面的D1可以不用写,编译器会将它传给this指针

但是我们也要注意了,在引用那个值的时候我们不能再用结构体变量名称引用了,我们需要用this指针去指向那个值

1.5重载运算符的优先级和结合性与对应运算符保持一致 

1.6不能通过连接语法中没有的符号来创建新的运算符

比如operator¥,“¥”这种的符号的运算符根本没有

1.7有些运算符不能进行重载

比如       .*       和      ::       和       sizeof        和        ?:       和         .

上面5个运算符不能进行重载

1.8重载运算符至少有一个类类型的参数

像如果我们定义一个这样的重载运算符,编译器就会报错 

1.9前置类型++和后置类型++的区分

当我们要定义前置类型++和后置类型++时,我们的重载运算符都是operator++

不能区分开来,那么C++就设计了区分的方式

如果是后置++那么就在设置重载时再加一个int形参

如果是前置++那么就不需要加int形参 

 2.赋值运算符重载

1.赋值运算符重载的应用

赋值重载运算符的符号是=

赋值运算符重载和拷贝函数的功能类似都是将一个对象的数据拷贝到另外一个数据、

区别是赋值运算符重载是对两个已有的对象进行拷贝

拷贝函数是用一个已有的对象去初始化另外一个对象

建议将赋值运算重载函数的被拷贝参数加const,以防这个参数被修改

还有就是将赋值运算重载函数的返回值定义为类类型,方便进行多重赋值   

 

 2.赋值重载运算符的一些性质

当我们不去定义赋值重载运算符时,编译器会自动生成一个默认的赋值重载运算符,

这个默认的赋值重载运算符的拷贝是一个字节一个字节去拷贝的

所以对于类里面全是内置类型的对象,默认赋值重载运算符就可以解决问题,对于自定义类型,当要进行赋值时,编译器会自动调用它自己的赋值重载运算符。

但是当对象中存在向系统申请资源时,默认的赋值重载就不太能解决问题了,我们来测试一下

看上面代码我们来测试一下如下图 

你们看d2和d3的所有的变量都一致

但是代码运行结束的结果却是

造成这种现象的原因是因为d2和d3的arr指针都指向同一块区域,当d3结束调用析构函数时便会释放这块区域的数据, 然后d2结束调用它的析构函数时又会对这块区域释放数据,那么这块数据就释放了两次,所以当我们的内置类型有对系统申请资源的情况我们就要自己定义赋值重载运算符,

那么我们就要用到memcpy这个函数

如下代码

#include<iostream>
using namespace std;
class stack
{
public:
	stack& operator=(const stack& S1)
	{
		memcpy(this->arr, &S1, sizeof(int) * capacity);
		this->capacity = S1.capacity;
		this->top = 0;
		return *this;
	}
	stack(int n=10)
	{
		arr = (int*)malloc(sizeof(int) * n);
		if (arr == NULL)
		{
			perror("malloc");
			return;
		}
		capacity = 10;
		top = 0;
	}
	~stack()
	{
		free(arr);
		capacity = 0;
		top = 0;
	}
private:
	int* arr;
	int capacity;
	int top;
};
int main() {
	stack d2;
	stack d3;
	d3 = d2;
	return 0;
}

这种方式的赋值重载运算符就不会发生错误 

总结一下,当对象中没有对系统进行资源申请,那么编译器自动生成的赋值重载运算符就够用,如果有对系统进行资源申请,那么就需要我们自己定义赋值重载运算符。

C++之“赋值运算符重载“ 赋值运算符重载 阅读详情

相关推荐

【C++】赋值运算符重载

文章目录赋值运算符重载1. 运算符重载2. 赋值运算符重载 赋值运算符重载 默认情况下C++不支持自定义对象类型使用运算符 1. 运算符重载 函数名:operator + 运算符号 返回值:根据函数具体分析,如果是>/<,可能是bool,如果是-/+,可能是int 参数:操作符有几个操作数,参数就有几个 例子:比较年月日 bool operator>(const Date& d1, const Date& d2) { if (d1._year > d2._year)

Rinne's blog 2742

详解-赋值运算符重载(C++)

🎈C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。🎈函数名字为:关键字operator后面接需要重载的运算符符号。🎈函数原型:返回值类型 operator操作符(参数列表)注意:🎈1.不能通过连接其他符号来创建新的操作符:比如operator@🎈2.重载操作符必须有一个类类型或者枚举类型的操作数🎈3.用于内置类型的操作符,其含义不能改变,例如:内置的整型+,不 能改变其含义。

weixin_55582891的博客 3993

【C++】赋值运算符重载 const 友元

比如上述Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接访问Time类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行。那就不能是类的成员函数,但如果放在类外面定义,那就不能访问类内的成员变量了,这时就要利用我们的友元函数了。,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中。类内成员变量,但友元可以让他们实现,非常的方便,但方便的同时,都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。

rwh04160416的博客 1004

【C++】运算符重载 | 赋值运算符重载

1.常用的操作符有:+、-、*、/、++、--、=(赋值)、==(判断相等)、>、=、

2301_76540463的博客 3138

C++重载赋值运算符

在重载赋值运算符时,我们需要将实部和虚部都赋值给目标对象,因此我们使用了“浅拷贝”的方式。这里需要注意的是,赋值运算符函数的参数应该是 const 引用,以保证传入的值不会被修改。第二行使用了重载的赋值运算符。总的来说,重载赋值运算符可以让我们更加灵活地控制对象的赋值操作,使代码更加清晰和易于理解。在实际的开发中,我们应该根据具体的业务需求和语言约束来选择是否需要重载赋值运算符。在上面的代码中,我们定义了一个复数类Complex,它包含了两个私有数据成员 real 和 imag,分别表示实部和虚部。

PixelEnigma的博客 588

告别电源纹波!手把手教你用UCC28019设计一个高效率PFC模块(附完整原理图与BOM清单)

本文详细介绍了如何使用UCC28019设计高效率PFC模块,解决电源纹波问题。通过优化补偿网络、关键元器件选型及PCB布局,实现功率因数提升至0.99以上,降低输入电流谐波。附完整原理图与BOM清单,适用于电赛等快速开发场景。

weixin_42652674的博客 333

C++:运算符重载与类的赋值运算符重载函数

运算符重载

小青菜的博客 3288

【算法】基于STM32的MPU6050卡尔曼滤波算法(入门级)

1. 简介 卡尔曼滤波(Kalman filtering)是一种利用线性系统状态方程,通过系统输入输出观测数据,对系统状态进行最优估计的算法。由于观测数据中包括系统中的噪声和干扰的影响,所以最优估计也可看作是滤波过程。详情见:卡尔曼滤波简介 MPU6050的解算主要有三种姿态融合算法:四元数法 、一阶互补算法和卡尔曼滤波算法。我们常用的DMP库使用的是四元数法,本文采用卡尔曼滤波算法,使用RT-Thread国产操作系统,利用env工具进行串口、模拟IIC环境配置,使用10ms的线程进行卡尔曼滤波解算。 2.

weixin_44549777的博客 3万+

[c++]赋值运算符重载

本文介绍了C++中运算符重载的概念和应用。运算符重载允许自定义类型像内置类型一样使用运算符,通过在类中定义operator+、operator=等特殊函数实现。文章重点讲解了赋值运算符重载的实现要点,包括参数传递效率、返回引用支持连续赋值、避免自我赋值的判断等。同时对比了拷贝构造(创建新对象)和赋值运算符(已有对象间赋值)的区别。还指出赋值运算符必须作为类成员函数,不能重载为全局函数。通过日期类的代码示例,展示了==和=运算符重载的具体实现方法。

weixin_62529445的博客 1460

看完这篇爽文我终于学会了示波器(一)

示波器基础篇的介绍,希望对你有用,下次分享一下如何测试。

qq_45508321的博客 973

边缘AI工业落地:YOLO26-Seg + RK3588 NPU 极致部署(低功耗+实时实例分割,工业场景全覆盖)

本次实战汇总了「YOLO26-Seg+RK3588 NPU」工业边缘部署中最常见、最致命的8个坑点,所有坑点均来自真实工业项目,解决方案均为零代码/一键操作,无需复杂配置,能让你少走90%的弯路,节省大量时间,必看必记!❌ RKNN转换报错「算子不支持/模型加载失败」→ ✅ 导出ONNX时必须指定opset=12,重新导出即可,RK3588唯一兼容版本;❌ 分割mask错位/轮廓模糊 → ✅ 导出ONNX时加,并保证RKNN的归一化参数与YOLO26一致,零代码修复;

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1717

【带你吃透C++】运算符重载(赋值运算符重载)原来是这么一回事

运算符重载 C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,其目的就是让自定义类型可以像内置类型一样可以直接使用运算符进行操作。运算符重载,就是对已有的运算符赋予多重含义,使同一运算符作用于不同类型的数据时产生不同的行为。运算符重载的目的是使得 C++ 中的运算符也能够用来操作对象。 运算符重载函数名为:关键字operator后面接需要重载的操作符符号。 函数原型:返回值 operator运算符(参数列表) ...

平淡中造就不平凡 6193

pt100和max31865测室温跳变比较大,会从23.04跳到23.47,23.75反复跳变超过了0.5的误差范围,在VDD和GND之间加上0.1和10的滤波电容也不行,如何解决?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 2087

cpp--赋值运算符重载,浅显易懂!

本文详细讲解了赋值运算符重载,其中包括了定义,应用,以及一些容易困扰我们的问题

2302_80295520的博客 1154

从零开始讲DDR(8)——AXI 接口MIG 使用(1)

我们简单拆解了MIG AXI接口中测试文件的整体框架,首先在sim_tb_top.sv文件中例化了DDR模型和example_top。在example_top中,又例化了MIG IP和一个流量产生器ddr4_v2_2_8_axi_tg_top。在ddr4_v2_2_8_axi_tg_top中的主要功能是分别例化了boot_mode_gen,prbs_mode_gen,custom_mode_gen和axi_opcode_gen。

apple_53311083的博客 1587

Quuppa 如何引领蓝牙 ® 定位服务的全新发展方向

我们最优质的客户,是那些对其他实时定位系统(RTLS)的承诺感到失望、转而寻求 “能覆盖全业务场景的更广泛赋能技术” 的客户 —— 前文提到的消防车制造商就是典型案例:他们尝试并通过 Quuppa 的蓝牙方案取得了成功。我们希望业务合作伙伴(如系统集成商、解决方案提供商)能充分利用 Quuppa 智能定位系统的功能,为客户提供专属解决方案:无论是追踪微型标签、实现未来移动设备的 AoD 功能,还是基于 RSSI 的简单信标(信标作为物联网网关),这些功能都能让同一套 Quuppa 系统支持广泛的用例。

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 831

C++ ——赋值运算符重载函数

文章目录前言一、赋值运算符重载函数是什么?二、细谈赋值运算符重载函数2.1 参数列表2.2 返回值2.3调用时机二、赋值运算符重载函数练习 前言 在介绍赋值运算符重载之前,我们先看一段代码: class Complex //定义一个复数类 { public: Complex (double r = 0.0,double i = 0.0) //构造函数 { _real = r; _imag = i; } void Show()const;

xhuyang111的博客 3878

2024年CSP-X复赛真题题解(T1:购物)

2024年CSP-X复赛真题题解(T1:购物)

王老师青少年编程 1179

C++:拷贝构造函数、赋值运算符重载

如果一个构造函数的第一个参数是自身类类型的引用,且任何额外的参数都有默认值,则此构造函数也叫做拷贝构造函数,也就是说拷贝构造是⼀个特殊的构造函数。这样写才是拷贝构造,通过同类型的对象初始化构造,而不是指针。这里可以完成拷贝,但是不是拷贝构造,只是⼀个普通的构造。也可以这样写,这里也是拷贝构造。

2401_86551514的博客 2817

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C++ 赋值运算符重载

在 运算符重载当中,我们需要注意的是:不能通过连接其他符号来创建新的操作符:比如operator@重载操作符必须有一个类类型参数用于内置类型的运算符,其含义不能改变,例如:内置的整型+,不 能改变其含义作为类成员函数重载时,其形参看起来比操作数数目少1,因为成员函数的第一个参数为隐藏的this: .注意以上5个运算符不能重载。这个经常在笔试选择题中出现。是否要重载运算符,要看这个运算符实现效果对这个类是否有意义。

chihiro1122的博客 2573

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C++ 类和对象 赋值运算符重载

运算符重载是通过定义特殊的成员函数或全局函数来实现的。

m0_72625526的博客 1500

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

C++奇迹之旅:赋值运算符重载与隐式类型转换

运算符重载是C++中的一个重要特性,他允许我们为自定义的类型定义自己的运算符行为。通过运算符重载,我们可以使用与内置数据类型相同的语法来操作自定义类型,从而提高代码的可读性和可维护性。还是我们熟悉的日期函数: 然后我们定义两个日期对象d1和d2: 当你想要比较两个对象d1和d2的数据是否一样,这是通常的比较方法: 创建一个专门的比较函数来比较两个对象是否相同。 很明显的可以看出这是个比较函数,能不能直接通过像内置类型那样来比较相同呀,因此运算符重载就来了: C++为了增强代码的可读性引入了运算符重载,运算符

a_sen的博客 3318

【C++】深度解析---赋值运算符重载(小白一看就懂!!)

​【C++】为了增强代码的可读性引入了赋值运算符重载,赋值运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。但是赋值运算符重载的应用细节很多和之前讲过的拷贝构造函数数有着千丝万缕的关系,所以本文就来详细的讲解一下赋值运算符重载。 ​

weixin_45031801的博客 5869
上一篇: C++拷贝构造函数
下一篇: C++构造函数(初始化列表)
Arcane Code
博客等级 码龄3年 598粉丝 101原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值