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

ops/2024/11/29 8:45:33/

在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.ppmy.cn/ops/30390.html

相关文章

FPGA学习笔记(2)——Verilog语法及ModelSim使用

1.1 语法 1、赋值语句 和 < 为阻塞赋值&#xff0c;当该语句结束时&#xff0c;下一个语句才开始执行&#xff0c;串行执行 < 为非阻塞幅值&#xff0c;该语句和整个语句块同时执行&#xff0c;并行执行 1.2 ModelSim使用 1、修改源文件路径&#xff1a;File -> …

【C语言的完结】:最后的测试题

看到这句话的时候证明&#xff1a; 此刻你我都在努力~ 个人主页&#xff1a; Gu Gu Study ​​ 专栏&#xff1a;语言的起点-----C语言 喜欢的一句话&#xff1a; 常常会回顾努力的自己&#xff0c;所以要为自己的努力留下足迹…

力扣HOT100 - 46. 全排列

解题思路&#xff1a; 回溯 假设给定数组nums为[1, 2, 3]&#xff0c;首先将其转换为List<Integer>类型的output为[1, 2, 3]。 在backtrack方法中&#xff0c;初始时first为0&#xff0c;所以进入第一个for循环&#xff0c;交换output中第一个元素和自身&#xff0c;然…

web自动化时,关闭浏览器“正受自动化控制“提示语和关闭保存密码提示框

1、问题描述&#xff1a; 问题1&#xff1a;期望关闭"Chrome正在被自动测试软件控制"提示语 问题2&#xff1a;关闭谷歌浏览器--是否保存密码弹窗 2、解决 from selenium.webdriver.chrome.options import Options from selenium import webdriveroptions Options…

Springboot + MySQL + html 实现文件的上传、存储、下载、删除

实现步骤及效果呈现如下&#xff1a; 1.创建数据库表&#xff1a; 表名&#xff1a;file_test 存储后的数据&#xff1a; 2.创建数据库表对应映射的实体类&#xff1a; import com.baomidou.mybatisplus.annotation.IdType;import com.baomidou.mybatisplus.annotation.Table…

学习CSS3,实现红色心形loading特效

试想一下&#xff0c;如果你的网站在加载过程中&#xff0c;loading图由一个老旧的菊花转动图片&#xff0c;变为一个红色的心形loading特效&#xff0c;那该有多炫酷啊。 目录 实现思路 初始化HTML部分 延迟动画是重点 设定动画效果 完整源代码 最后 实现思路 每个…

Docker-10 Docker Compose

一、前言 通过前面几篇文章的学习,我们可以通过Dockerfile文件让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况,或者开发一个Web应用,除了Web服务容器本身,还需要数据库服务容器、缓存容器,甚至还包括负…

区块链 | 由外部实体导致的 NFT 安全问题

&#x1f98a;原文&#xff1a; Understanding Security Issues in the NFT Ecosystem &#x1f98a;警告&#xff1a; 本文只记录了原文的第 6 节。 1 问题描述 NFT 所指向的数字资产&#xff08;图片、视频等&#xff09;必须是可以访问的&#xff0c;这样 NFT 才具有意义…