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

news2024/11/24 6:33:21

在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.coloradmin.cn/o/1634217.html

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

相关文章

MySQL常见问题解决和自动化安装脚本

常见问题 MySQL密码正确但无法登录的情况 这种情况一般都是因为缓存&#xff0c;使用mysql -u root -p123456直到成功登陆为止&#xff0c;并且进入之后重新修改密码&#xff0c;多次重复修改密码的命令并且再一次清除缓存后退出。 ALTER USER rootlocalhost IDENTIFIED WIT…

Microsoft Threat Modeling Tool 使用(二)

主界面 翻译 详细描述 选择了 “SDL TM Knowledge Base (Core)” 模板并打开了一个新的威胁模型。这个界面主要用于绘制数据流图&#xff08;Data Flow Diagram, DFD&#xff09;&#xff0c;它帮助您可视化系统的组成部分和它们之间的交互。以下是界面中各个部分的功能介绍&a…

CogAgent:开创性的VLM在GUI理解和自动化任务中的突破

尽管LLMs如ChatGPT在撰写电子邮件等任务上能够提供帮助&#xff0c;它们在理解和与GUIs交互方面存在挑战&#xff0c;这限制了它们在提高自动化水平方面的潜力。数字世界中的自主代理是许多现代人梦寐以求的理想助手。这些代理能够根据用户输入的任务描述自动完成如在线预订票务…

Bert基础(二十)--Bert实战:机器阅读理解任务

一、机器阅读理解任务 1.1 概念理解 机器阅读理解&#xff08;Machine Reading Comprehension, MRC&#xff09;就是给定一篇文章&#xff0c;以及基于文章的一个问题&#xff0c;让机器在阅读文章后对问题进行作答。 在机器阅读理解领域&#xff0c;模型的核心能力体现在对…

STM32使用PWM驱动直流电机

系列文章目录 STM32单片机系列专栏 C语言术语和结构总结专栏 文章目录 1. 直流电机和驱动简介 2. 驱动电路原理 3. 代码实现 3.1 PWM.c 3.2 PWM.h 3.3 MOTOR.c 3.4 MOTOR.h 3.5 main.c 3.6 完整工程文件 PWM和OC输出比较详解&#xff1a; STM32定时器的OC比较和PW…

LT6911GX HDMI2.1 至四端口 MIPI/LVDS,带音频 龙迅方案

1. 描述LT6911GX 是一款面向 VR / 显示应用的高性能 HDMI2.1 至 MIPI 或 LVDS 芯片。HDCP RX作为HDCP中继器的上游&#xff0c;可以与其他芯片的HDCP TX配合使用&#xff0c;实现中继器功能。对于 HDMI2.1 输入&#xff0c;LT6911GX 可配置为 3/4 通道。自适应均衡功能使其适合…

使用Github+Picgo+npm实现免费图床

本文参考自 Akilar&#xff0c;原文地址&#xff1a;https://akilar.top/posts/3e956346/ Picgo的配置 Github图床仓库内容不能超过1GB&#xff0c;因为Github原则上是反对仓库图床化的&#xff0c;超过1GB之后会由人工审核仓库内容&#xff0c;如果仓库被发现用来做图床&…

简要说说软分叉和硬分叉。

前言 一、软分叉 二、硬分叉 三、用途 总结 前言 软分叉和硬分叉是区块链技术中的两个重要概念&#xff0c;它们通常与加密货币的网络升级有关。下面我将分别解释这两个概念&#xff0c;并提供一些例子来帮助理解。下面是方便理解软分叉和硬分叉的图 一、软分叉 软分叉是一…

docker学习笔记4:CentOS7安装docker

文章目录 一、安装docker二、配置阿里云加速三、测试镜像安装本篇博客介绍如何在centos7里安装docker,关于CentOS7的安装可以查看本专栏的这篇博客: VmWare CentOS7安装与静态ip配置 centos7里安装docker步骤如下: 一、安装docker 先在终端输入su进入root用户,输入如下命…

Outlook大附件插件 有效解决附件大小限制问题

很多企业都是使用Outlook来进行邮件的收发&#xff0c;可是由于附件大小有限&#xff0c;导致很多大文件发不出去&#xff0c;就会产生Outlook大附件插件这种业务需求。 邮件系统在发送大文件时面临的限制问题主要如下&#xff1a; 1、附件大小限制&#xff1a;大多数邮件服务…

操作系统课程设计-人机交互的模拟操作系统

&#xff08;一&#xff09;课设板块 模块划分&#xff1a; &#xff08;1&#xff09;、进程管理模块 &#xff08;2&#xff09;、内存管理模块 &#xff08;3&#xff09;、文件管理模块 &#xff08;4&#xff09;、设备管理模块 &#xff08;5&#xff09;、界面管理模块…

Elasticsearch中【文档查询】DSL语句以及对应的Java实现

目录 全文检索查询 精准查询 布尔查询 排序、分页查询 高亮 地理查询 复合查询 Elasticsearch提供了基于JSON的DSL&#xff08;Domain Specific Language&#xff09;来定义查询。常见的查询类型包括&#xff1a; 查询所有&#xff1a;查询出所有数据&#xff0c;一般测…

C语言:项目实践(贪吃蛇)

前言&#xff1a; 相信大家都玩过贪吃蛇这款游戏吧&#xff0c;贪吃蛇是久负盛名的游戏&#xff0c;它也和俄罗斯方块&#xff0c;扫雷等游戏位列经典游戏的行列&#xff0c;那贪吃蛇到底是怎么实现的呢&#xff1f; 今天&#xff0c;我就用C语言带着大家一起来实现一下这款游戏…

Springboot+Vue项目-基于Java+MySQL的校园疫情防控系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

达梦(DM) SQL聚集函数及日期运算操作

达梦DM SQL聚集函数及日期运算操作 聚集函数MAX、MIN、SUM、AVG、COUNT使用分析函数 sum (…) over (order by…) 可以生成累计和更改累计和的值计算出现次数最多的值 日期运算加减日、月、年加减时、分、秒日期间隔之时、分、秒日期间隔之日、月、年求两个日期间的工作天数确定…

《C语言深度解剖》(10):数组指针、指针数组和数组指针数组

&#x1f921;博客主页&#xff1a;醉竺 &#x1f970;本文专栏&#xff1a;《C语言深度解剖》《精通C指针》 &#x1f63b;欢迎关注&#xff1a;感谢大家的点赞评论关注&#xff0c;祝您学有所成&#xff01; ✨✨&#x1f49c;&#x1f49b;想要学习更多C语言深度解剖点击专栏…

抄表自动化的实现与优势

1.界定与简述 抄表自动化是一种当代关键技术&#xff0c;致力于取代传统的手动式抄表方法&#xff0c;通过远程数据数据采集解决&#xff0c;完成电力工程、水、气等公用事业电力仪表的全自动载入。这一系统利用先进的感应器、物联网技术(IoT)设备及数据数据分析工具&#xff…

2024年第十五届蓝桥杯江苏省赛回顾

呜呜呜~~~ 我在考完了后感觉自己直接炸了&#xff1a;好多学到的算法都没有用上&#xff0c;几乎所有的题目都是暴力的。。。 最后十几分钟对于一道dp算法终于有思路了&#xff0c;但是。。匆匆忙忙之间就是没有调试出来。&#xff08;还是交了一道暴力[旋风狗头]直接哭死~~&…

【七十三】【算法分析与设计】516. 最长回文子序列,二叉树,329. 矩阵中的最长递增路径,记忆化递归填表

516. 最长回文子序列 给你一个字符串 s &#xff0c;找出其中最长的回文子序列&#xff0c;并返回该序列的长度。 子序列定义为&#xff1a;不改变剩余字符顺序的情况下&#xff0c;删除某些字符或者不删除任何字符形成的一个序列。 示例 1&#xff1a; 输入&#xff1a;s &qu…

JAVA系列 小白入门参考资料 类和对象(3)

温馨提示&#xff1a; 此篇文章需要前两篇文章作为基础。 JAVA系列 小白入门参考资料 类和对象&#xff08;1&#xff09;​​​​​​​ JAVA系列 小白入门参考资料 类和对象&#xff08;2&#xff09; 目录 1. 封装 引入封装 访问修饰符 封装的具体实现 get方法和…