C++学习笔记----8、掌握类与对象(六)---- 操作符重载(1)
经常在对象上执行如相加,比较,文件传输等操作。例如,spreadsheet只有在可以在上面执行自述运算才有用,比如对整行的单元格求和。所有这些都可以通过重载操作符来完成。
许多人发现操作符重载的语法复杂而令人迷惑。至少一开始是这样。真实情况是想让事情更简单。在本节你会发现,那并不意味着写类时更简单,只是使用类时更简单。关键点是让新类与内建像int与double这样的类型一样简单:使用+来使对象相加要比记住不管是add()或是sum()这样的成员函数名要容易多了。
注意:作为服务给客户提供类的操作符重载。
在这一点上,你可能会想到底哪些操作符可以重载呢?答案是几乎所有--甚至是你没有听说过的。本章会浮光掠影地简单涉及一下:赋值操作符在本章的前面 已经解释过了,而本节要介绍的是基础的算术操作符,缩写的算术操作符,以及比较操作符。重载流插入与释放操作符也比较有用。还有,有一些麻烦但是又比较有趣的东东,一开始你可能并不想用操作符重载来做。在标准库中大量使用操作符重载。以后我们会解释怎么以及什么时候重载其他的操作符。以及标准库方面的内容。
1、例子:SpreadsheetCell的另外内容的实现
在真正的面向对象的编程风格中,SpreadsheetCell对象应该能够把自己与其它SpreadsheetCell对象相加。将一个单元格与另一个单元格相加生成结果为第三个单元格。这并不会改变原来的任一单元格。SpreadsheetCell相加的意思就是单元格值的相加。
1.1、第一次尝试:加成员函数
可以为SpreadsheetCell类像这样声明与定义add()成员函数:
export class SpreadsheetCell
{
public:SpreadsheetCell add(const SpreadsheetCell& cell) const;// Omitted for brevity
};
该成员函数将两个单元格相加,返回一个新的第三个单元格 ,其值是前两个的和。声明为const并且 用一个const SpreadsheetCell的引用是因为add()不会改变任意一个源单元格。下面是其实现:
SpreadsheetCell SpreadsheetCell::add(const SpreadsheetCell& cell) const
{return SpreadsheetCell { getValue() + cell.getValue() };
}
可以像这样来使用add()成员函数:
SpreadsheetCell myCell { 4 }, anotherCell { 5 };
SpreadsheetCell aThirdCell { myCell.add(anotherCell) };
auto aFourthCell { aThirdCell.add(anotherCell) };
这也可以达到目的,但是有一点儿繁琐,我们可以做得更好。
1.2、第二次尝试:重载操作符+作为成员函数
用加号类似于两个int或者两个double的方式来将两个单元格相加会比较方便--有点儿像下面这样:
SpreadsheetCell myCell { 4 }, anotherCell { 5 };
SpreadsheetCell aThirdCell { myCell + anotherCell };
auto aFourthCell { aThirdCell + anotherCell };
c++允许你写自己的加号版本,叫做加操作符,来正确地作用于类。为了做到这一点,写一个名字叫做operator+的成员函数,看起来像这样:
export class SpreadsheetCell
{
public:SpreadsheetCell operator+(const SpreadsheetCell& cell) const;// Omitted for brevity
};
注意:在operator与加号之间可以加入空格。例如,可以将operator+写成operator +。我们还是使用没有空格的风格。
重载的operator+成员函数的定义与add()成员函数的实现是一样的:
SpreadsheetCell SpreadsheetCell::operator+(const SpreadsheetCell& cell) const
{return SpreadsheetCell { getValue() + cell.getValue() };
}
现在你就可以使用前面展示的加号操作符来将两个单元格 相加了。
我们还是比较习惯于这种语法。不要过于担心奇怪的成员函数名operator+----它就是一个类似于foo或add的名字而已。为了理解语法的其余部分,它有助于理解真实发生的情况。当c++编译器解析程序时,遇到比如说+,-,=,或<<这样的操作符,它会用operator+,operator-,operator=,或operator<<这样的名字来找函数或成员函数,特别是,带有适合的参数的。例如,当编译器看到下面的代码行,它会尝试在SpreadsheetCell类中去找成员函数名字为operator+,接受另一个SpreadsheetCell作为参数(或者,在本章后面会讨论到的,接受两个SpreadsheetCell参数的全局函数,名字叫做operator+):
SpreadsheetCell aThirdCell { myCell + anotherCell };
如果SpreadsheetCell类包含这样一个operator+成员函数,上面的行就会被翻译成这样:
SpreadsheetCell aThirdCell { myCell.operator+(anotherCell) };
注意,operator+没有要求其参数的对象是与它所写的类是同一种类型。你可以写一个SpreadsheetCell的operator+,拿一个Spreadsheet去加到SpreadsheetCell。这对于程序员是讲不通的,但是编译器是允许的。下一节会给出一个SpreadsheetCell的operator+接受double值的例子。
也要注意,可以让operator+返回你想的任何类型。然而,应该遵循最少惊奇的原则;也就是说,operator+的返回类型通常应该是用户想要的。
1.2.1、隐式转换
令人吃惊的是,一旦写完前面所示的operator+,不但可以将两个单元格相加,也可以将一个单元格加到一个string_view,一个double,或一个int!下面是一些例子:
SpreadsheetCell myCell { 4 }, aThirdCell;
string str { "hello" };
aThirdCell = myCell + string_view{ str };
aThirdCell = myCell + 5.6;
aThirdCell = myCell + 4;
这些代码能跑的原因是编译器会比尝试找到合适的operator+的所指的正确的类型更多的工作。编译器也会尝试找到合适的类型转换。SpreadsheetCell类有转换构造函数将double或string_view转换成一个SpreadsheetCell。在前面的例子中,当编译器看到一个SpreadsheetCell尝试将自身加到一个double上,它发现SpreadsheetCell构造函数用了double并且 构建了一个临时的SpreadsheetCell对象传递给operator+。同样的,当编译器看到代码行尝试将一个SpreadsheetCell加到一个string_view上时,它会调用string_view SpreadsheetCell构造函数生成一个临时的SpreadsheetCell传递给operator+。
要记住,虽然使用隐式转换构造函数可以效率不高,因为要生成临时对象。在这个例子中,为了避免隐式构建与double相加,可以写如下的第二个operator+:
SpreadsheetCell SpreadsheetCell::operator+(double rhs) const
{return SpreadsheetCell { getValue() + rhs };
}相关文章:
C++学习笔记----8、掌握类与对象(六)---- 操作符重载(1)
经常在对象上执行如相加,比较,文件传输等操作。例如,spreadsheet只有在可以在上面执行自述运算才有用,比如对整行的单元格求和。所有这些都可以通过重载操作符来完成。 许多人发现操作符重载的语法复杂而令人迷惑。至少一开始是这…...
Ascend C 自定义算子开发:高效的算子实现
Ascend C 自定义算子开发:高效的算子实现 在 Ascend C 平台上,开发自定义算子能够充分发挥硬件的性能优势,帮助开发者针对不同的应用场景进行优化。本文将以 AddCustom 算子为例,介绍 Ascend C 中自定义算子的开发流程及关键技术…...
面向对象技术——设计模式
目录 层次结构 具体设计模式分类 创建型模式(处理创建对象) 结构型模式(处理类和对象的组合) 行为型模式(描述类或者对象的交互行为) 创建型设计模式 编辑 结构型设计模式 行为型设计模式编辑 …...
2024 Mysql基础与进阶操作系列之MySQL触发器详解(20)作者——LJS[你个小黑子这都还学不会嘛?你是真爱粉嘛?真是的 ~;以后请别侮辱我家鸽鸽]
欢迎各位彦祖与热巴畅游本人专栏与博客 你的三连是我最大的动力 以下图片仅代表专栏特色 [点击箭头指向的专栏名即可闪现] 专栏跑道一 ➡️ MYSQL REDIS Advance operation 专栏跑道二➡️ 24 Network Security -LJS 专栏跑道三 ➡️HCIP;H3C-SE;CCIP——…...
找不到concrt140.dll如何修复,快来试试这6种解决方法
concrt140.dll是微软Visual C 2015 Redistributable Package中的一个重要动态链接库文件,它在许多Windows应用程序中扮演着关键角色。本文将详细探讨concrt140.dll丢失的原因、影响、解决方法以及预防措施,帮助用户更好地理解和应对这一问题。 一、什么是…...
年会工作会议会务报名签到小程序开源版开发
年会工作会议会务报名签到小程序开源版开发 会议管理微信小程序,对会议流程、开支、数量、标准、供应商提供一种标准化的管理方法。以达到量化成本节约,风险缓解和服务质量提升的目的。适用于大型论坛、峰会、学术会议、政府大会、合作伙伴大会、经销商…...
UE C++ 实时加载模型的总结
一.总体思路: 如果实时加载UE模型,需要先将之前的模型删除。再生成出来,放在根节点,保持相对位置,相对的俯仰角。 void AAirForce::LoadWeapon(int ID, int Type, double X, double Y, double Z) {//m_weaponMap.Emp…...
实施威胁暴露管理、降低网络风险暴露的最佳实践
随着传统漏洞管理的发展,TEM 解决了因攻击面扩大和安全工具分散而产生的巨大风险。 主动式 TEM 方法优先考虑风险并与现有安全工具无缝集成,使组织能够在威胁被有效利用之前缓解威胁。 为什么威胁暴露管理 (TEM) 在现代网络安全策略中变得至关重要&…...
51.哀家要长脑子了!
1.P1003 [NOIP2011 提高组] 铺地毯 重复 模拟 要求覆盖在最上面的地毯编号,用四个数组abgk分别记录地毯起点的左下角横纵坐标,地毯的长度宽度,输入的坐标x y 当它满足大于等于左下角坐标 并且 小于等于 地毯左下角横纵坐标的时候…...
Overleaf 无法显示图片
问题描述 在Overleaf中的代码为: \begin{figure}\centering\includegraphics[width0.98\linewidth]{figures/test.png}\caption{This is a test.}\label{fig:test} \end{figure}但无法正常显示图片: 解决方案 修改编译模式为正常Normal而非快速Fast …...
如何实现 C/C++ 与 Python 的通信?
在现代编程中,C/C与Python的通信已经成为一种趋势,尤其是在需要高性能和灵活性的场景中。本文将深入探讨如何实现这两者之间的互通,包括基础和高级方法,帮助大家在混合编程中游刃有余。 C/C 调用 Python(基础篇&#…...
音视频入门基础:FLV专题(13)——FFmpeg源码中,解析任意Type值的SCRIPTDATAVALUE类型的实现
一、SCRIPTDATAVALUE类型 从《音视频入门基础:FLV专题(9)——Script Tag简介》中可以知道,根据《video_file_format_spec_v10_1.pdf》第80到81页,SCRIPTDATAVALUE类型由一个8位(1字节)的Type和…...
jvm里的metaspace oom 排查问题思路-使用MAT
文章目录 metapace oom 问题排查点-1-duplicate class 数量排查点-2-classloader 数量一些可能迷惑人的方向 metapace oom 问题 metapace 问题都是由加载的class 太多,导致内存不够报出来的。 排查点-1-duplicate class 数量 首先看这里,通常一个clas…...
2025舜宇招聘【内推码】
【2025内推码】 DSwNQ9yu DSJXN8Mr 舜宇集团2025届全球校园招聘正式启动!!! 专业需求:机械、自动化、电子、电气、通信、控制、测控、计算机、软件、物理、光学等专业; 工作地点:宁波余姚、浙江杭州、广东…...
APP自动化搭建与应用
APP自动化环境搭建 用于做APP端UI自动化,adb连接手机设备。 需要的工具java编辑器:jdk、Android-sdk软件开发工具组、appium的python客户端、nodes.js、夜神模拟器、apk包、uiautomatorviewer 第一步:安装sdk,里面包含建立工具bu…...
kafka-windows集群部署
kafka-windows集群部署目录 文章目录 kafka-windows集群部署目录前言一、复制出来四个kafka文件夹二、修改集群每个kafka的配置文件四、启动zookeeper,kafka集群 前言 部署本文步骤可以先阅读这一篇博客,这篇是关于单机kafka部署测试的。本文用到的文件…...
4个顶级的大模型推理引擎
LLM 在文本生成应用中表现出色,例如具有高理解度和流畅度的聊天和代码完成模型。然而,它们的庞大规模也给推理带来了挑战。基本推理速度很慢,因为 LLM 会逐个生成文本标记,需要对每个下一个标记进行重复调用。随着输入序列的增长&…...
Oracle中ADD_MONTHS()函数详解
文章目录 前言一、ADD_MONTHS()的语法二、主要用途三、测试用例总结 前言 在Oracle数据库中,ADD_MONTHS()函数用于在日期中添加指定的月数。 一、ADD_MONTHS()的语法 ADD_MONTHS(date, n) 其中,date是一个日期值,n是一个整数值,…...
【SQL】掌握SQL查询技巧:高效数据整合与查询优化
目录 1. SQL 的基本构成2. SQL 联接(JOIN)2.1 内联接(INNER JOIN)2.2 外联接(OUTER JOIN)2.2.1 左外联接(LEFT JOIN)2.2.2 右外联接(RIGHT JOIN)2.2.3 全外联…...
一个月学会Java 第5天 控制结构
Day5 控制结构 这么叫可能有些就算有基础的人也看不懂,其实就是if-else、switch-case、for、while、do-while这几个,没基础的听到了这个也不要慌张,这几个是程序的基础,多多训练就好 第一章 顺序结构 这章其实没有什么好讲的&…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...
PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...
HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...
VisualXML全新升级 | 新增数据库编辑功能
VisualXML是一个功能强大的网络总线设计工具,专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑(如DBC、LDF、ARXML、HEX等),并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...
Win系统权限提升篇UAC绕过DLL劫持未引号路径可控服务全检项目
应用场景: 1、常规某个机器被钓鱼后门攻击后,我们需要做更高权限操作或权限维持等。 2、内网域中某个机器被钓鱼后门攻击后,我们需要对后续内网域做安全测试。 #Win10&11-BypassUAC自动提权-MSF&UACME 为了远程执行目标的exe或者b…...
