C++超详细讲解运算符重载

发布时间:2026/7/21 15:49:43

C++超详细讲解运算符重载
概念C为了增强代码的可读性引入了运算符重载运算符重载是具有特殊函数名的函数也具有其返回值类型函数名字以及参数列表其返回值类型与参数列表与普通的函数类似。函数名字为关键字operator后面接需要重载的运算符符号。函数原型返回值类型 operator操作符(参数列表)需要注意的几点不能通过连接其他符号来创建新的操作符比如operator必须是已有的操作符重载操作符必须有一个类类型或者枚举类型的操作数用于内置类型的操作符其含义不能改变例如内置的整型不 能改变其含义作为类成员的重载函数时其形参看起来比操作数数目少1成员函数的操作符有一个默认的形参this限定为第一个形参参数个数与重载的运算符有关.* 、:: 、sizeof 、?: 、. 注意以上5个运算符不能重载运算符重载作用于左操作数会把左操作数当做第一个参数既然是对自定义类型对象之间的操作符的重载那么它的参数一定有此类型的对象并且需要对对象的成员进行操作这就需要打破封装的限制那么这个函数应该设置为全局的还是类的成员呢有以下几种思路函数设为公有成员变量设为公有不好函数设为公有另外写一个成员函数区获取成员变量的值不好将函数设为类的友元函数可以放入类中作为成员函数推荐1234567891011121314151617181920212223242526272829// 全局的operatorclassDate{public:Date(intyear 1900,intmonth 1,intday 1){_year year;_month month;_day day;}int_year;int_month;int_day;};// 这里会发现运算符重载成全局的就需要成员变量是共有的那么问题来了封装性如何保证// 这里其实可以用我们后面学习的友元解决或者干脆重载成成员函数。booloperator(constDate d1,constDate d2){returnd1._year d2._year d1._month d2._month d1._day d2._day;}intmain(){Date d1(2018, 9, 26);Date d2(2018, 9, 29);cout (d1 d2) endl;return0;}这样的写法就打破了封装让类的成员都暴露了出来这样的损失不太值得。赋值运算符重载赋值操作运算符重载特征如下参数类型相同返回值检测是否给自己赋值返回*this一个类如果没有显式的定义赋值操作符重载编译器会自动生成一个完成对象字节序的拷贝浅拷贝赋值运算符在类中不显式实现时编译器会生成一份默认的此时用户在类外再将赋值运算符重载为全局的就和编译器生成的默认赋值运算符冲突了故赋值运算符只能重载成成员函数。12345678910111213141516171819202122232425262728classDate{public:Date(intyear 1900,intmonth 1,intday 1){_year year;_month month;_day day;}voidDisplay(){cout _year - _month - _day endl;}private:int_year;int_month;int_day;};intmain(){Date d1;Date d2(2018, 10, 1);// 这里d1调用的编译器生成operator完成拷贝d2和d1的值也是一样的。d1 d2;d1.Display();d2.Display();return0;}是不是很像自动生成的拷贝构造那么它也存在一定的问题对于日期类的对象他能很好的完成赋值操作可对于指针类型呢下面的程序会崩溃12345678910111213141516171819202122232425classString{public:String(constchar* str songxin){cout String(const char* str \songxin\) endl;_str (char*)malloc(strlen(str) 1);strcpy(_str, str);}~String(){cout ~String() endl;free(_str);_str nullptr;}private:char* _str;};intmain(){String s1(tanmei);String s2;s2 s1;return0;}原因也是因为浅拷贝的关系导致同一块内存被释放了两次程序崩溃。可以不显式定义赋值操作符重载函数的情况成员变量没有指针成员变量的指针没有管理内存资源注意赋值操作符重载与拷贝构造不同的地方就是拷贝构造是在对象定义时而赋值操作符重载是作用于已经存在的对象。const成员const修饰类的成员函数有点奇怪const怎么能修饰函数呢将const修饰的类成员函数称之为const成员函数const修饰类成员函数实际修饰该成员函数隐含的this指针指向的对象表明在该成员函数中不能对指针指向对象的任何成员进行修改。123456789101112131415161718192021222324252627282930313233343536classDate{public:Date()//构造函数不写的话创建const的对象会报错。:_year(1900),_month(1),_day(1){}voidDisplay(){cout Display () endl;cout year: _year endl;cout month: _month endl;cout day: _day endl endl;}voidDisplay()const{cout Display () const endl;cout year: _year endl;cout month: _month endl;cout day: _day endl endl;}private:int_year;// 年int_month;// 月int_day;// 日};intmain(){Date d1;d1.Display();constDate d2;d2.Display();return0;}const的对象就会调用Display函数会调用哪一个呢注意到上面代码的第18行的函数被const修饰那么这个const有什么作用实际上这个const修饰的是*this表明 *this不可被修改那么const的对象就会调用被const修饰的函数否则可能会出现下面的问题。const对象可以调用非const成员函数吗​ 不可以权限放大。非const对象可以调用const成员函数吗​ 可以权限缩小。const成员函数内可以调用其它的非const成员函数吗​ 不可以权限放大。非const成员函数内可以调用其它的const成员函数吗​ 可以权限缩小。还有一个值得注意的地方上面的代码如果我们不显式定义构造函数的话实例化const的对象时会报错“d2”: 必须初始化 const 对象也就是说编译器认为const对象包括成员无法被赋值应该有初始化操作而默认生成的构造是没有对int有初始化操作的因此报错

相关新闻

Bili2text:当视频变成文字,你的学习效率会发生什么变化?

Bili2text:当视频变成文字,你的学习效率会发生什么变化?

2026/7/20 10:15:56

Bili2text:当视频变成文字,你的学习效率会发生什么变化? 【免费下载链接】bili2text Bilibili视频转文字,一步到位,输入链接即可使用 项目地址: https://gitcode.com/gh_mirrors/bi/bili2text 想象一下&#xf…

久坐族必看:如何预防和改善死臀综合症

久坐族必看:如何预防和改善死臀综合症

2026/7/20 10:15:56

1. 什么是"死臀综合症"?最近在健身圈和办公族中流行起一个新鲜词——"死臀综合症"(Dead Butt Syndrome)。这个听起来有点吓人的名词,其实是指由于长期久坐导致臀部肌肉萎缩、功能退化的现象。医学上更专业的叫…

基于序阻抗建模VSG的并网逆变器仿真模型(复现期刊+模型代码)

基于序阻抗建模VSG的并网逆变器仿真模型(复现期刊+模型代码)

2026/7/20 10:05:55

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 &#x1f381…

Fable 5:从AI工具到智能管理者的进化与应用

Fable 5:从AI工具到智能管理者的进化与应用

2026/7/21 15:47:39

1. Fable 5的定位转变:从工具到管理者Fable 5作为Anthropic推出的新一代AI模型,其定位已经发生了根本性的转变。过去我们可能习惯于把它当作一个简单的"打字机"或"问答机器"使用,但它的真正价值在于能够承担起"管理…

grunt-responsive-images高级功能:自定义单位、裁剪控制与图像滤镜应用终极指南

grunt-responsive-images高级功能:自定义单位、裁剪控制与图像滤镜应用终极指南

2026/7/21 15:47:39

grunt-responsive-images高级功能:自定义单位、裁剪控制与图像滤镜应用终极指南 【免费下载链接】grunt-responsive-images Produce images at different sizes for responsive websites. 项目地址: https://gitcode.com/gh_mirrors/gr/grunt-responsive-images …

TradingAgents-CN深度性能调优实战指南:从架构优化到成本控制

TradingAgents-CN深度性能调优实战指南:从架构优化到成本控制

2026/7/21 15:47:39

TradingAgents-CN深度性能调优实战指南:从架构优化到成本控制 【免费下载链接】TradingAgents-CN 基于多智能体LLM的中文金融交易框架 - TradingAgents中文增强版 项目地址: https://gitcode.com/GitHub_Trending/tr/TradingAgents-CN TradingAgents-CN作为基…

ArcGIS Pro设备位置功能详解与GNSS数据采集实践

ArcGIS Pro设备位置功能详解与GNSS数据采集实践

2026/7/21 15:47:39

1. ArcGIS Pro设备位置功能概述在ArcGIS Pro中,设备位置功能是一个强大的工具,它允许用户将GNSS接收器或其他位置设备连接到桌面GIS环境。这个功能最初是为移动端应用设计的,现在被完整地集成到了专业级的桌面GIS软件中。作为一名长期使用Arc…

TMS320F2837xD ePWM与eCAP模块:寄存器与Driverlib函数映射全解析

TMS320F2837xD ePWM与eCAP模块:寄存器与Driverlib函数映射全解析

2026/7/21 15:47:38

1. 项目概述如果你正在使用TI的TMS320F2837xD系列DSP进行电机控制、数字电源或者任何需要高精度波形生成与测量的项目,那么ePWM和eCAP这两个外设模块绝对是你绕不开的核心。我接触过不少工程师,包括早期的我自己,都曾一头扎进那上千页的技术参…

ROR1靶向ADC药物:突破性进展与临床价值

ROR1靶向ADC药物:突破性进展与临床价值

2026/7/21 15:37:38

1. 项目概述:ADC药物与ROR1靶点的突破性进展 上周行业里最振奋的消息莫过于华东医药宣布其ROR1靶向ADC药物获得FDA孤儿药资格认定。作为深耕肿瘤药物研发多年的从业者,我第一时间调取了公开资料进行研究。这个进展不仅意味着国内药企在ADC赛道实现了从跟…

微服务进阶:服务网格与Istio

微服务进阶:服务网格与Istio

2026/7/21 5:45:57

541|微服务进阶:服务网格与Istio 上篇文章我们聊了微服务的基本概念和拆分方法。 但微服务多了,问题也多了: 服务之间怎么通信? 怎么监控每个服务的调用链路? 熔断、限流、重试怎么做? 安全认证怎么统一? 以前这些都靠SDK库(比如Hystrix、Feign),每个服务都要集成…

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

2026/7/21 9:56:14

一、零售门店全域协同业务背景与行业痛点 1.1 门店超级终端设备矩阵(连锁便利店/商超标准配置) 自助收银Kiosk一体机:顾客结算、自助核销优惠券、商品素材预览;运营折叠平板:店长后台商品上新、图片录入、活动配置、…

噗叽短视频界面分析

噗叽短视频界面分析

2026/7/21 3:09:32

1 和小红书类似,可以采用类似判断方法------------其实他比小红书好判断,因为他没有图片,控件位置几乎是固定的,都不用判断------------2 因为他没有点赞按钮------------而且几乎所有控件位置都是完全一样的,所以我就…

GraphRAG Local + Ollama:微软知识图谱本地化

GraphRAG Local + Ollama:微软知识图谱本地化

2026/7/21 0:06:35

普通 RAG 有个老毛病:你问它「这堆文档整体在讲什么」,它答不上来。因为它只会把问题切成向量,去几十个文本块里捞最相似的几段拼给模型看。可「整体讲什么」这种问题,答案根本不在任何单独一段里——它散在全篇的联系里。 微软的…

AI 数据产品化思考:让分析能力变成可售卖的数据服务

AI 数据产品化思考:让分析能力变成可售卖的数据服务

2026/7/21 0:06:35

AI 数据产品化思考:让分析能力变成可售卖的数据服务 大家好,我是朱大喜。这周一直在复盘具体的项目和技术,最后一篇聊点不一样的东西——数据产品化。做了这么多年数据分析,我发现一个规律:能卖出去的从来不是"分…

基于人机协作的 AI 研发新体系架构:从 Harness 工程到 Loop 工程实践

基于人机协作的 AI 研发新体系架构:从 Harness 工程到 Loop 工程实践

2026/7/21 0:06:35

本文完整呈现了企业级 AI Coding 落地的核心方法论:从 Harness 工程的微观/宏观定义,到 Loop 工程的六大构建模块,再到基于 SDD(规范驱动开发)的工程化落地路径。干货较多,建议收藏细读。 我从 22 年开始就…