C++ 运算符重载为非成员函数
运算符也可与重载为非成员函数。这时运算所需要的操作数都需要通过函数的形参表来传递,在形参表中形参从左到右的顺序就是运算符操作数的顺序。如果需要访问运算符参数对象的私有成员,可以将该函数声明为友元函数。
【提示】不用机械地将重载运算符的非成员函数声明为类的友元函数,仅在需要访问类的私有成员或保护成员时再这样做。如果不将其声明为友元函数,该函数仅依赖于类的接口,只要类的接口不变化,该函数的实现就无须变化;如果将其声明为友元函数,该函数会依赖于类的实现,即使类的接口不变化,只要类的私有数据成员的设置发生了变化,该函数的实现就需要变化。
对于双目运算符B,如果要实现b1 B b2,其中b1和b2中只要有一个具有自定义类型,就可以将B重载为非成员函数,函数的形参为b1和b2。 经过重载后,表达式b1 B b2相当于函数调用operator B(b1,b2)。
对于前置单目运算符U,如“-”负号等,如果要实现表达式U b,其中b具有自定义类型,就可以将U重载为非成员函数,函数的形参为b。 经过重载后,表达式U b相当于函数调用operator U(b)。
对于后置单目运算符++和–,如果要实现表达式b++或b–,其中b为自定义类型,那么运算符就可以重载为非成员函数。这时函数的形参有两个,一个是b,另一个是int型形参。 第二个参数是用于与前置运算符重载函数相区别的。重载之后,表达式b++和b--就相当于函数调用operator++(b,0)和operator--(b,0)
【例】以非成员函数形式重载Complex的加减法运算和“<<”运算符
将运算符“+”,“-”重载为非成员函数,并将其声明为友元函数,使之实现复数的加减法。重载运算符“<<”可以对cout使用“<<”操作符来输出一个Complex对象,使输出变得更加方便和直观。
//将加减运算符重载为非成员函数
class Complex
{
public:Complex(double r = 0.0, double i = 0.0) :real(r), imag(i) {}friend Complex operator+(const Complex& c1, const Complex& c2);friend Complex operator-(const Complex& c3, const Complex& c4);friend ostream& operator<<(ostream& out, const Complex& c);void display() const;
private:double real;double imag;
};Complex operator+(const Complex& c1, const Complex& c2)
{return Complex(c1.real + c2.real, c1.imag + c2.imag);
}Complex operator-(const Complex& c1, const Complex& c2)
{return Complex(c1.real - c2.real, c1.imag - c2.imag);
}ostream& operator<<(ostream& out, const Complex& c)
{out << "(" << c.real << "," << c.imag << ")" << endl;return out;
}int main()
{Complex c1(5, 4);Complex c2(2, 10);Complex c3;cout << "c1=" << c1 << endl; cout << "c2=" << c2 << endl;c3 = c1 + c2;cout << "c3=c1+c2=" << c3 << endl;Complex c4;c4 = operator-(c2,c1);cout << "c4=c2-c1=" << c4 << endl;Complex c5;c5 = 5.0 + c1;cout << "c5=5.0+c1=" << c5 << endl;return 0;
}
运行结果:

分析:
将运算符重载为类的非成员函数,就必须把操作数都通过形参的方式传递给运算符重载函数。因为将运算符重载为类的非成员函数,使它不能访问类的私有成员,所以将非成员运算符重载函数声明为类的友元函数,使它可以访问类中的私有成员,从而对其进行操作。“<<”操作符的左操作数为operator类型的引用,ostream是cout类型的一个基类,右操作数是Complex类型的引用,这样在执行cout<<c1时,就会调用operator<<(cout,c1)。该函数把通过第一个参数传入的ostream对象以引用形式返回,是为了支持形如“cout<<c1<<c2”的连续输出,因为第二个“<<”运算符的左操作数是第一个“<<”运算符的返回结果。
【总结】
使用非成员函数的重载方式的情况:
(1)要重载的操作符的第一个操作数不是可以更改的类型,例如上例中的“<<”运算符的第一个操作数的类型为ostream,是标准库的类型,无法像其中添加成员函数。
(2)以非成员函数形式重载,支持更灵活的类型转换。例如,上述代码中,可以直接使用5.0+c1,因为Complex的构造函数使得实数可以被隐含转换为Complex类型。这样5.0+c1就会以operator+(Complex(5.0),c1)的方式来执行,c1+5.0也一样,从而支持了实数和复数的相加,既方便又直观;而以成员函数重载时,左操作数必须具有Complex类型,不能是实数,因为调用成员函数的目的对象不会被隐含转换,只有右操作数可以为实数,因为有操作数是函数的形参,可以隐含转换。
相关文章:
C++ 运算符重载为非成员函数
运算符也可与重载为非成员函数。这时运算所需要的操作数都需要通过函数的形参表来传递,在形参表中形参从左到右的顺序就是运算符操作数的顺序。如果需要访问运算符参数对象的私有成员,可以将该函数声明为友元函数。 【提示】不用机械地将重载运算符的非…...
[国产MCU]-BL602开发实例-定时器
定时器 文章目录 定时器1、BL602定时器介绍2、定时器驱动API介绍3、定时器使用实例3.1 单次计时3.2 持续计时通用定时器,用于定时,当时间到达我们所设置的定时时间会产生定时中断,可以用来完成定时任务。本文将详细介绍如何使用BL602的定时器功能。 1、BL602定时器介绍 BL6…...
re学习(29)攻防世界-CatFly(复原反汇编)
因为这是一个.dll文件,在Linux上运行一下: 找到主要函数:(以及由上面三部分对应的代码部分) __int64 __fastcall main(int a1, char **a2, char **a3) {size_t v3; // rbx__int16 v5[4]; // [rsp10h] [rbp-4B0h] B…...
Android WIFI-概率性不能自连
1.连上wifi时同步保存wifi密码,避免连上wifi后马上断电重启由于密码没保存导致不能自动重连wifi packages/modules/Wifi/service/java/com/android/server/wifi/SupplicantStaIfaceHal.java @@ -66,6 +66,7 @@ import com.android.server.wifi.WifiNative.SupplicantDeathEve…...
用Python批量复制文件,方法有9种,方便快捷
前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 当我们复制一个文件时用复制粘贴就可以了,如果是多个文件呢? 就会很麻烦了! 今天给大家介绍一下用Python批量复制文件,方法有九种!希望对你有帮助 1. Shutil Copy…...
《凤凰架构》第一章——服务架构演进史
前言 刚开始决定弄懂文中所提到的所有东西,就像我写ByteByteGo呢几篇文章一样,把每一句话都弄懂。但是对于《凤凰架构》来说,这有点太费时间了,并且没有必要,有些东西可能永远都不会用到,但文章为了全面的…...
【iPhone】手机还有容量,拍视频却提示 iPhone 储存空间已满
文章目录 前言解决方案 结语 前言 今天在用 iPhone 录像的时候突然提醒我 iPhone储存空间已满 你没有足够的储存空间来录制视频” 可我明明还有 20G 的容量 我非常疑惑,因为我之前还剩1个G都能录像,现在20G反而不行了,于是重启了手机&#…...
pycharm中opencv库导入 cv2. 无函数提示跳出解决方法
pycharm中opencv库导入 cv2. 无函数提示跳出解决方法 1、找到当前解释器安装目录 例如: 2、进入D:\Python37\Lib\site-packages\cv2文件,进入cv2文件夹: 找到cv2.pyd, 把cv2.pyd复制一份,放到上层文件夹下,即site-p…...
week3
题解: 前序遍历性质: 节点按照 [ 根节点 | 左子树 | 右子树 ] 排序。 中序遍历性质: 节点按照 [ 左子树 | 根节点 | 右子树 ] 排序。 通过以上三步,可确定 三个节点 :1.树的根节点、2.左子树根节点、3.右子树根节点。 之后进行…...
LeetCode28.找出字符串中第一个匹配项的下标
28.找出字符串中第一个匹配项的下标 目录 28.找出字符串中第一个匹配项的下标题目描述解法一:朴素的模式匹配解法二:KMP算法KMP解决的问题类型最长公共前后缀KMP算法过程next数组的构建代码实现 题目描述 给你两个字符串haystack和needle,请…...
爬虫009_字符串高级_替换_去空格_分割_取长度_统计字符_间隔插入---python工作笔记028
然后再来看字符串的高级操作 取长度 查找字符串下标位置 判断是否以某个字符,开头结尾 计算字符出现次数 替换...
Windows 安装Tensorflow2.1、Pycharm开发环境
文章目录 1、安装anaconda2、安装Tensoflow2.1、创建虚拟环境2.2、安装Tensorflow依赖2.3、验证Tensorflow是否成功 3、配置pycharm环境4、错误记录 1、安装anaconda https://www.anaconda.com/download 打开命令行工具,出现base就表示安装成功了,表示当…...
【javaScript】数组的常用方法(自用记忆版)
目录 一、操作方法 增 push() unshift() splice() concat() 删 pop() shift() splice() slice() 改 splice() 查 indexOf() includes() find() 二、排序方法 reverse() sort() 三、转换方法 join() 四、迭代方法 some() every() forEach…...
全新二开美化版UI好看的社区源码下载/反编译版
2023全新二开美化版UI精美的社区源码下载/反编译版 之前我分享过Rule原版,相信大家已经有很多人搭建好了。这次我要分享的是RuleAPP的二开美化版(请尊重每个作者的版权),这个版本没有加密,可以进行反编译,…...
Docker 发布一个springboot项目
文章目录 1、新建SpringBootDemo项目并打包2、使用Dockerfile打包(基础用法)进一步maven源码打包法 3、更进一步(maven插件打包)docker-maven-pluginspring-boot-maven-plugin前提条件本地环境配置项目环境配置maven插件打包运行校…...
办公信息系统安全基本技术要求
范围 本标准规定了办公信息系统的安全基本技术要求。 本标准适用于指导党政部门的办公信息系统建设,包括在系统设计、产品采购、系统集成等方面应遵循的基本原则,以及应满足的基本技术要求。涉密办公信息系统的建设管理应依据相关国家保密法规和标准要…...
有效管理IT问题的5个原则
问题管理就是发现未知的、隐藏的问题,这是根本原因, 这是您 IT 帮助台无穷无尽的工单来源。当您实施有效的 问题管理,您的 IT 团队可以超越消防模式,专注于战略 IT 目标。以下是可以帮助您实现一流问题管理的五个原则:…...
【MongoDB】解决ProxmoxVE下CentOS7虚拟机安装MongoDB6后启动失败的问题
目录 安装步骤: 2.1 配置yum源 2.2 安装MongoDB 2.3 启 动MongoDB ProxmoxVE上新装的CentOS7.4虚拟机,安装MongoDB6。 安装步骤: 2.1 配置yum源 # 创建mongodb yum源(https://www.mongodb.co...
MySQL 事务原理:事务概述、隔离级别、MVCC
文章目录 一、事务1.1 事务概述1.2 事务控制语句1.3 ACID特性 二、隔离级别2.1 隔离级别的分类2.1.1 读未提交(RU)2.1.2 读已提交(RC)2.1.3 可重复读(RR)2.1.4 串行化 2.2 命令2.3 并发读异常2.3.1 脏读2.3…...
useEffect从入门到入土
副作用是相对于纯函数概念来说的, 除事件回调处理副作用,其他副作用尽量放在useEffect中; 组件首次渲染、有依赖项更新(Object.is方法判断)时,该useEffect触发 jsx渲染完成后立马触发useEffectÿ…...
FOWFP封装技术:移动设备半导体的尺寸与性能突破
1. 移动设备半导体封装的演进与挑战在智能手机和平板电脑的电路板上,PMIC电源管理芯片的封装尺寸往往决定了主板布局的极限。2016年我在参与某旗舰手机项目时,主板工程师指着BOM表上那个44mm的QFN封装芯片说:"如果能再缩小1mm࿰…...
深度解析DS4Windows:让PS4手柄在Windows平台重获新生
深度解析DS4Windows:让PS4手柄在Windows平台重获新生 【免费下载链接】DS4Windows Like those other ds4tools, but sexier 项目地址: https://gitcode.com/gh_mirrors/ds/DS4Windows 你是否曾经为PS4手柄在PC上的兼容性问题而烦恼?游戏无法识别、…...
Smithbox终极指南:如何免费创建魂系游戏MOD的完整教程
Smithbox终极指南:如何免费创建魂系游戏MOD的完整教程 【免费下载链接】Smithbox Smithbox is a modding tool for Elden Ring, Armored Core VI, Sekiro, Dark Souls 3, Dark Souls 2, Dark Souls, Bloodborne and Demons Souls. 项目地址: https://gitcode.com/…...
保姆级教程:用PennyLane和泰坦尼克号数据集,5分钟上手你的第一个量子分类器(VQC)
量子机器学习实战:用PennyLane构建泰坦尼克号生存预测模型 量子计算正从实验室走向实际应用,而量子机器学习作为交叉领域的前沿方向,为传统算法提供了新的可能性。本文将带您用PennyLane框架,在经典数据集上完成一次完整的量子分类…...
基于Docker与MCP协议构建AI智能体安全扩展工具箱
1. 项目概述:一个为AI应用量身打造的“服务管家”最近在折腾AI应用开发,特别是那些基于大语言模型(LLM)的智能体(Agent)时,我遇到了一个挺普遍但很棘手的问题:我的AI助手能力很强&am…...
纺织行业智能化升级进入深水区:AI验布机从“可选项”变为“必选项”
过去三年,走访过数十家纺织服装企业的行业观察者会发现一个明显的变化:2023年时,AI验布机还是展会上引人驻足的新奇设备;到了2025年,它已经成为越来越多工厂标准配置的一部分。这一转变背后,折射出整个纺织…...
从换电博弈到芯片浪潮:新能源汽车与半导体产业交叉机遇解析
1. 行业动态深度解析:从换电博弈到芯片浪潮最近行业里几件事儿挺有意思,放在一起看,能品出不少门道。一边是造车新势力在补能路线上开始“左右互搏”,小鹏汽车悄悄注册了一家经营范围包含“新能源汽车换电设施销售”的子公司&…...
QT6.5项目实战:用HidApi库搞定USB HID设备读写(附完整配置流程)
QT6.5实战:HidApi库深度集成与USB HID设备高效通信指南 USB HID设备作为人机交互的基础协议,在工业控制、医疗设备、游戏外设等领域广泛应用。当开发者需要在QT6.5环境中实现与这类设备的稳定通信时,HidApi库因其轻量级和跨平台特性成为理想选…...
2026年实战指南:Jrebel本地与远程热加载的配置、排错与进阶场景
1. 热加载技术的前世今生 第一次接触热加载是在2016年,当时还在用Eclipse开发Spring项目。每次改完代码都要经历漫长的重启等待,直到同事推荐了JRebel这个神器。十年过去,热加载已经成为现代Java开发的标配,特别是在2026年的今天&…...
三步搞定Switch破解:大气层系统完整安装与配置指南
三步搞定Switch破解:大气层系统完整安装与配置指南 【免费下载链接】Atmosphere-stable 大气层整合包系统稳定版 项目地址: https://gitcode.com/gh_mirrors/at/Atmosphere-stable 大气层(Atmosphere)系统是当前最稳定、最安全的Ninte…...
