C++:运算符重载-加号(+)

在C++中,运算符重载允许重新定义已有运算符的行为,以便让它们适用于自定义类型。这样,你可以通过自定义类型使用内置运算符,使得代码更加直观和易读。

此时我在代码中定义一个新类MyString

class MyString {
public:int m_nNumberA;int m_nNumberB;
public:MyString() {};//带有初始化列表的构造函数(这个知识点如果不清楚可以看我之前的文章)MyString(int NumberA, int NumberB) :m_nNumberA(NumberA), m_nNumberB(NumberB) {};
};
这个时候我在主程序中创建两个MyString类的对象,并让两个对象相加,MyString StringObjA(20,30);MyString StringObjB(40,50);MyString StringC = StringObjA + StringObjB;

可以看到代码报错,原因就是这个时候我并没有对运算符(+})进行重载,导致编译器并不清除自定义类的两个实例化对象相加到底要进行什么样的操作;我们可以通过运算符(+)重载对自定义类的对象进行的运算:

此时我希望两个对象相加最后得到的结果是两个对象的m_nNumberAm_nNumberB分别相加。

运算符重载通常是在成员函数或者全局函数来实现的。通过在类定义中声明特定的运算符函数,并在函数体内定义对应的操作,就可以实现对该运算符的重载。

接下来就以加号(+)为例子,阐述如何对双目运算符进行重载。

运算符重载格式:
返回类型 operator运算符(参数列表) {// 函数体
}

全局运算符重载

全局函数运算符重载的代码如下:

MyString operator+(const MyString &strObjA,const MyString &strObjB) {MyString tempObject;tempObject.m_nNumberA = strObjA.m_nNumberA + strObjB.m_nNumberA;tempObject.m_nNumberB = strObjA.m_nNumberB + strObjB.m_nNumberB;return tempObject;
}

定义了一个全局函数 operator+,用于重载加法运算符 +,使得 MyString 类型的对象可以使用 + 运算符进行相加操作。(如果要重载的是减法运算符那么可以写成 operator-,以此类推。)

MyString operator+(const MyString &strObjA,const MyString &strObjB)这行代码定义了一个返回类型为 MyString 的函数 operator+(重载运算符+的格式),接受两个MyString 类型的常引用参数 strObjAstrObjB。在函数中定义了一个名为 tempObjectMyString 类型的临时对象,用于保存两个参数对象相加后的结果,计算完成后将tempObject对象返回即可。

此时运行程序,得到结果:

    MyString StringObjA(20,30);MyString StringObjB(40,50);MyString StringC = StringObjA + StringObjB;std::cout << StringC.m_nNumberA << std::endl;std::cout << StringC.m_nNumberB << std::endl;

可以看到对象StringCm_nNumberAm_nNumberB的值对象StringObjA和对象StringObjBm_nNumberAm_nNumberB分别相加得到。

类内运算符重载
class MyString {
public:int m_nNumberA;int m_nNumberB;
public:MyString() {};MyString(int NumberA, int NumberB) :m_nNumberA(NumberA), m_nNumberB(NumberB) {};
​//类内进行重载MyString operator+(MyString &objB){MyString objTemp;objTemp.m_nNumberA = this->m_nNumberA + objB.m_nNumberA;objTemp.m_nNumberB = this->m_nNumberB + objB.m_nNumberB;return objTemp;};
};

对于类内重载的成员函数来说,只需要传入一个参数是因为第二个操作数已经被隐式地传递给了该成员函数的隐式 this 参数。在成员函数内部,this 指针指向调用该成员函数的对象。

在这个成员函数中,this 指针指向了调用对象的地址,即 StringObjA,而参数 other 则是显式传递的第二个操作数,即 StringObjB。因此,类内重载的成员函数只需要一个显式参数,因为第一个操作数隐式地由 this 指针表示。

那么此时再运行程序,结果为:

int main() {
​MyString StringObjA(20,30);MyString StringObjB(40,50);MyString StringC = StringObjA + StringObjB;
​std::cout << StringC.m_nNumberA << std::endl;std::cout << StringC.m_nNumberB << std::endl;system("pause");return 0;
}

可以看到对象StringCm_nNumberAm_nNumberB的值由对象StringObjA和对象StringObjBm_nNumberAm_nNumberB分别相加得到。

上述例子是对+进行重载,- * /亦然。

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

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

相关文章

jupyter notebook导出pdf文件显示不了中文

找到文件index.tex.j2&#xff0c;我的在 C:\Users\Administrator\miniconda3\envs\opencv2\share\jupyter\nbconvert\templates\latex 我安装miniconda3并配置opencv2所需要的环境, 配置前 最后&#xff1a;用文本编辑器打开&#xff0c;修改图中article为ctexart&#xf…

滑动窗口详解

目录 一、滑动窗口的特定步骤&#xff1a; 二、题目解析 1、⻓度最⼩的⼦数组---点击跳转题目 3、最⼤连续 1 的个数 III----点击跳转题目 4、将 x 减到 0 的最⼩操作数----点击跳转题目 5、⽔果成篮----点击跳转题目 滑动窗口是双指针算法中细分的一种&#xff0c;它由暴…

数组模拟双链表-java

通过数组来模拟双链表&#xff0c;并执行一些插入和删除的功能。 目录 一、问题描述 二、模拟思路 1.变量解释 2.数组初始化 3.在下标是k的结点后面插入一个结点 4.删除下标为k的结点 5.基本功能解释 三、代码如下 1.代码如下&#xff1a; 2.读入数据&#xff1a; 3…

【Vue 2.x】学习vue之二组件

文章目录 Vue二组件第五章es6文件导入出1、导出export 组件&#xff08;component&#xff09;1、定义2、模块化与组件化3、组件的分类1、非单文件组件非单文件三步骤创建组件标准写法简化写法组件的嵌套非单文件的不足之处 2、单文件组件vue单文件组件的使用脚手架创建项目重点…

Flask教程2:flask高级视图

文章目录 add_url_rule类视图的引入装饰器的自定义与使用蓝图的使用url_prefix设置蓝图前缀 add_url_rule 欲实现url与视图函数的绑定&#xff0c;除了使用路由装饰器app.route&#xff0c;我们还可以通过add_url_rule(rule,endpointNone,view_funcNone)方法&#xff0c;其中&…

【网站项目】戒烟网站

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

2024 五一杯高校数学建模邀请赛(C题)| 煤矿深部开采冲击地压危险预测 |建模秘籍文章代码思路大全

铛铛&#xff01;小秘籍来咯&#xff01; 小秘籍团队独辟蹊径&#xff0c;构建了这一题的详细解答哦&#xff01; 为大家量身打造创新解决方案。小秘籍团队&#xff0c;始终引领着建模问题求解的风潮。 抓紧小秘籍&#xff0c;我们出发吧~ 让我们看看五一杯的C题&#xff01; 完…

专注 APT 攻击与防御—工具介绍-the-backdoor-factory

工具介绍 the-backdoor-factory 项目地址&#xff1a;GitHub - secretsquirrel/the-backdoor-factory: Patch PE, ELF, Mach-O binaries with shellcode new version in development, available only to sponsors 原理 可执行二进制文件中有大量的 00&#xff0c;这些 00 是…

uniapp 自定义 App启动图

由于uniapp默认的启动界面太过普通 所以需要自定义个启动图 普通的图片不可以过不了苹果的审核 所以使用storyboard启动图 生成 storyboard 的网站&#xff1a;初雪云-提供一站式App上传发布解决方案

【面试经典 150 | 数组】找出字符串中第一个匹配项的下标

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;find方法二&#xff1a;暴力匹配方法三&#xff1a;KMP 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;…

HTTP协议 --中

http状态码 当浏览者访问一个网页时&#xff0c;浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前&#xff0c;此网页所在的服务器会返回一个包含HTTP 状态码的信息头&#xff08; server header &#xff09;用以响应浏览器的请求。 HTTP 状态码的英文为…

力扣刷题第一天:消失的数字

大家好啊&#xff0c;从今天开始将会和大家一起刷题&#xff0c;从今天开始小生也会开辟新的专栏。&#x1f61c;&#x1f61c;&#x1f61c; 目录 第一部分&#xff1a;题目描述 第二部分&#xff1a;题目分析 第三部分&#xff1a;解决方法 3.1 思路一&#xff1a;先排序…