C++基础 运算符重载

news/2026/1/25 17:36:11/文章来源:https://www.cnblogs.com/c1zastar/p/19530178

对于内置的数据类型, 编译器知道如何进行运算. 但是对于自定义类型, 编译器并不知道如何将他们相加

1 加号运算符重载

作用 : 实现两个自定义类型的相加

语法结构:

类名 operator+(类名 &对象1,类名 &对象2){
函数体
return 某一个对象;
}

也可以直接使用匿名对象作为返回值, 这样可以精简函数

加法运算符可以在类内进行重载, 但是这样就没有办法进行加法交换律了, 类内定义的运算符重载的左值必须是类的对象, 但是如果已经定义了有参构造函数的话, 是可以进行 对象+数字 的运算的(编译器根据构造函数自动转换,) ,但是如果在类内进行加号运算符的重载, 就没有办法进行数字+对象的操作, 因为数字不是对象

2 左移运算符重载

核心本质: coutostream 这个类里面的一个对象, 之所以能够实现cout << 输出的内容; 这个语句, 是因为对左移(<<)操作符进行了运算符的重载, 原理类似为:

初步重载:
void operator<< (ostream& cout , 输出的内容){内部的重载逻辑
}
但是这样还不行, 如果我们需要实现嵌套功能, 我们最好使函数的返回结果返回这个对象对应的引用
ostream& operator << (ostream &cout , 输出的内容){内部的重载逻辑return cout;
}
这样返回cout的引用之后, 可以实现返回cout的别名, 然后继续使用<<进行后续的输出, 形成链式传递

因此, 只要是ostream的一个对象 << int/char等等默认的数据类型, 编译器都会默认执行打印功能, 而ostream的对象并不一定是cout

而我们之所以需要左移运算符的重载, 是因为左移运算符在内置的重载逻辑里面只能进行int/char等等已知类型的重载, 不能进行自定义类型(如person类)的输出

通过上述的描述, 我们知道了我们需要的效果: cout << 类.对象; 这个结构是对左移运算符的重载, 同时为了实现链式传递, 我们必须规定运算符重载的返回值是cout的引用, 因此就有了左移运算符重载的基本框架:

ostream& operator<< (ostream &x,const 类 &y){x << y.属性;  y.属性必须是编译器的已知类型, 否则无法进行输出.return x;
}

同时, 由于我们没有办法定义对象函数进行左移运算符的重载, 我们只能定义全局函数, 所以我们必须使用 友元 进行函数权限的提升
例如: friend ostream& operator<< (ostream &x, const 类 &y);

3 自增运算符重载

自增运算符分为两种:

  • 前置自增运算符: 先进行自增, 然后进行返回, 因此必须要返回对应的对象
  • 后置自增运算符: 返回值必须是自增之前的值, 同时还要保证相应的值得到了自增, 因此可以返回一个局部变量的值而不是返回引用, 同时为了和前置自增运算符的重载进行区分, 后置运算符的重载要加上站位函数(int)
  • 站位函数: 可以不用定义变量, 但是函数引用的时候必须要赋值, 不能空着不写, 主要作用是匹配函数签名
#include <iostream>  
using namespace std;  
class Person{  
public:  
    friend Person& operator++(Person& p1);  
    friend Person operator++ (Person &p1,int);  
    friend ostream& operator<< (ostream &x,const Person & p);  
    Person(){}  
    Person(int i_age):age(i_age){}  
    Person(const Person&p){  
        age = p.age;  
    }  
private:  
    int age;  
};  
Person& operator++(Person& p1){  
    p1.age++;  
    return p1;  
}  
Person operator++ (Person& p1,int){  
    Person t(p1);  
    p1.age++;  
    return t;  
}  
ostream& operator<< (ostream &x,const Person & p){  
    x << p.age;  
    return x;  
}  
int main(){  
    Person man(19);  
    cout <<  man;  
    cout << ++man;  
    cout << man;  
    return 0;  
}

4 赋值运算符重载

作用: 主要是处理动态变量赋值之后不同对象占有同一块内存的bug

注意: 赋值运算符的重载有几个十分重要的点:

  • 赋值运算符的重载只能作为类成员函数在类内定义
  • 一定要添加拷贝构造函数
  • 添加字符值检查
  • 添加赋值对象是否为空的检查
  • 构造析构函数删除动态内存
#include <iostream>
using namespace std;
class Person{
public:Person(){}Person(int i_age){age = new int (i_age);}Person (const Person& p){if(p.age != NULL){this->age = new int (*p.age);}else{this->age = NULL;}}~Person(){delete this->age;}
public:Person& operator= (const Person &p2){if(this == &p2){return *this;}delete this->age;if(p2.age != NULL){this->age = new int (*p2.age);}else this->age = NULL;return *this;}
private:int* age = NULL;
};

5 关系运算符重载

关系运算符的重载比较简单, 只需要定义返回类型是bool类型就可, 我的推荐是作为全局函数定义在类外

bool operator 关系运算符(const & 类 对象1,const& 类 对象2){如果为真 return true;如果为假 return false;
}
然后再加上友元, 就完成了 

6 函数调用运算符重载(仿函数)

仿函数非常灵活, 没有固定的形式, 仿函数调用的时候与正常函数的区别可以说是对象的名称代替了函数的名称, 甚至可以直接进行匿名对象的仿函数调用,比如:
`类名 () (参数); //这里中间的括号和前面的类名共同构成了一个匿名对象, 由于匿名对象用完就释放, 所以可以进行一次性的仿函数操作

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

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

相关文章

计算小杨击败怪物

这个问题需要计算小杨击败怪物所需的最少攻击次数。怪物血量为 h,小杨可以使用物理攻击(第 i 次造成 2^{i-1} 点伤害)和至多一次魔法攻击(选择一个不超过当前血量的质数 x 造成伤害)。目标是使怪物血量恰好为 0。…

支付宝消费券回收(方法、流程、折扣)全指南

随着移动支付广泛普及,大量闲置的支付宝消费券因过期或使用限制,造成资源浪费。数据显示,2025年全国未核销消费券规模超12亿元,60%因失效白白流失。高效回收支付宝消费券,既能避免经济损失,也是对资源的优化配置…

如何检查本地 / 远程端口是否打开 ?

在 Linux 中&#xff0c;端口是一个编号的网络连接&#xff0c;它允许设备通过 Internet 或本地网络与其他设备通信。确保端口是开放和可访问的非常重要&#xff0c;它确保网络业务的正常运行。在本文中&#xff0c;我们将讨论五个检查 Linux 中端口是否打开的常用方法。 Chec…

网络威胁情报:构建你自己的情报源——DIY情报系统如何阻止零日攻击

网络威胁情报&#xff1a;构建你自己的情报源 DIY情报系统如何阻止零日攻击 警报在凌晨2点17分响起&#xff1a;未知恶意软件正在窃取薪资数据。我们每年花费50万美元的商业威胁源毫无反应。但我自制的智能系统却立即发出了警报——因为三天前&#xff0c;我已在我们的行业论坛…

Itasca PFC6.0 HCA空心扭剪试验 很久没有发布新品了 最近很忙 以后会抽空陆续上新

Itasca PFC6.0 HCA空心扭剪试验 很久没有发布新品了 最近很忙 以后会抽空陆续上新 这次上新HCA空心扭剪试验的模拟 采用6.0的flac耦合shell单元模拟内外柔性膜 采用创新方法施加扭转 且能稳定控制主应力角 这个模型还有很大的开发空间 最近实验室的师弟问我PFC6.0能不能玩点新花…

Java程序员如何一周速通Redis?

Redis想必大家都听说过&#xff0c;不管是面试还是工作上我们都能见到。但是Redis到底能干什么&#xff1f;又不能干什么呢&#xff1f;&#xff08;如下图&#xff09;为什么要用Redis&#xff1f;上面说了Redis的一些使用场景&#xff0c;那么这些场景的解决方案也有很多其它…

Java分布式系统开发与实践!

我们都知道&#xff0c;目前大型网站跟企业级应用目前的要求都是达到“互联网三高”&#xff0c;这时传统的集中式系统肯定是无法满足基本的需求的&#xff0c;越来越多的企业的系统架构目前都是向着分布式系统的方向演进。分布式系统的特征分布式系统相对于传统的集中式系统来…

Java程序员请注意:Redis进阶骚操作都在这里了!

大家都知道Redis的业务范围是非常广的&#xff0c;但是对于刚入行的小伙伴来说可能也就知道个缓存跟分布式锁。因为Redis的很多功能在一些小企业里&#xff0c;根本是用不到的&#xff0c;得等到并发量到了一定的程度&#xff0c;系统扛不住了&#xff0c;才会用到Redis那些高级…

基于狼群优化算法的LSSVM回归预测GWO-LSSVM 为了提高最小二乘支持向量机(lssvm...

基于狼群优化算法的LSSVM回归预测GWO-LSSVM 为了提高最小二乘支持向量机&#xff08;lssvm&#xff09;的回归预测准确率&#xff0c;对lssvm中的惩罚参数和核惩罚参数利用灰狼优化算法进行优化。 Matlab 代码调参这事儿在机器学习里总让人头疼&#xff0c;就像在漆黑的森林里找…

探寻2026四川电梯广告优选:口碑与实力并存,电梯广告/电梯视频广告/户外LED广告/高铁广告,电梯广告品牌推荐榜单

随着城市消费场景的持续升级,电梯广告作为高频触达都市中产群体的核心媒介,正成为品牌方抢占消费者心智的“黄金入口”。据第三方机构统计,2025年四川电梯广告市场规模突破45亿元,年复合增长率达18%,其中成都、绵…

2025年气动旋转接头实力榜:国内哪些厂家最靠谱?气电滑环/集电环/电滑环/气动旋转接头,气动旋转接头供应厂家推荐

随着工业自动化、机器人及高端装备制造业的蓬勃发展,作为实现设备旋转部分与固定部分之间介质(如气体、电信号)连续传输的关键部件,气动旋转接头的市场需求持续增长。然而,市场繁荣的背后也伴随着挑战:产品同质化…

吐血推荐!本科生AI论文工具TOP9:开题报告全攻略

吐血推荐&#xff01;本科生AI论文工具TOP9&#xff1a;开题报告全攻略 2026年本科生AI论文工具测评&#xff1a;为何值得一看 随着人工智能技术的不断进步&#xff0c;越来越多的本科生开始借助AI写作工具提升论文写作效率。然而&#xff0c;面对市场上琳琅满目的选择&#xf…

转行简历怎么写?简历制作网站模板直达,HR认可更易过

投了几十份简历都没回应&#xff1f;应届生不会写简历、跳槽族不知道如何突出业绩、转行人士找不到匹配模板&#xff0c;甚至排版混乱、信息堆砌&#xff0c;直接被HR pass——这是不是你的求职难题&#xff1f;HR筛选简历只花3秒&#xff01;核心看4点&#xff1a;基本信息简洁…

电商GIF主图制作教程?高效 GIF 压缩工具免费攻略

电商运营做产品主图、教师制作课件素材、设计师设计社交平台配图时&#xff0c;常遇到 GIF 制作步骤繁琐、压缩后画质模糊、格式转换后无法适配平台的问题&#xff0c;耗费大量精力却达不到预期效果。这里分享精准的 GIF 规格参考&#xff1a;电商主图 GIF 建议 800800px、播放…

学长亲荐8个一键生成论文工具,研究生轻松搞定论文写作!

学长亲荐8个一键生成论文工具&#xff0c;研究生轻松搞定论文写作&#xff01; 论文写作的“加速器”&#xff1a;AI 工具如何改变研究生的学习节奏 在当今学术研究日益复杂的背景下&#xff0c;研究生们面对的不仅是繁重的课程任务&#xff0c;还有论文写作带来的巨大压力。…

C#上位机模板程序,使用的是台达AS228主机PLC,功能齐全,自动运行页面、切换页面、手动调...

C#上位机模板程序&#xff0c;使用的是台达AS228主机PLC&#xff0c;功能齐全&#xff0c;自动运行页面、切换页面、手动调试、参数设置页面都有。 最近在工业自动化项目里摸爬滚打&#xff0c;发现台达AS228这PLC真是经得起折腾的主儿。刚好手头有个自用的C#上位机模板&#x…

三菱FX1N与3台东元Teco N310变频器通讯实战之旅

三菱FX1N与3台东元Teco N310变频器通讯实战程序可直接拿来实用了&#xff0c;三菱FX PLC与东元N310变频器modbus RTU通讯采用器件&#xff1a;三菱FX1N 24MT PLC&#xff0c;1个FX1N 485BD板&#xff0c;3个东元Teco N310系列变频器。 也可以是FX2N&#xff0c;FX2N 485BD功能&…

YOLO26改进 - 卷积Conv | SPD-Conv空间深度转换卷积优化空间信息编码,攻克小目标检测难题

前言 本文介绍了一种名为SPD-Conv的新型CNN构建块及其在YOLO26中的结合。传统CNN在处理低分辨率图像或小物体时&#xff0c;因使用步长卷积和池化层导致细粒度信息丢失、性能下降。SPD-Conv由空间到深度&#xff08;SPD&#xff09;层和非步长卷积&#xff08;Conv&#xff09…

在线 GIF 生成如何保画质?高效 GIF 制作工具实操指南

做自媒体配图、电商主图或课件动图时&#xff0c;总遇到 GIF 制作复杂、视频转 GIF 步骤繁琐&#xff0c;转换后格式不兼容&#xff0c;甚至动图太大无法上传的问题&#xff0c;浪费大量时间还没效果。这里给大家分享实用的 GIF 规格参考&#xff1a;微信动图建议尺寸 400400px…