重新C++系列之运算符重载
一、什么是运算符重载
简单来讲就是对运算符赋予新的意义,但是又不能改变原有的含义,它本身也就是一个函数。运算符重载的本质是以函数的方式来体现。
二、运算符重载有几种
1、按照作用域来划分,有全局操作符重载函数和成员函数操作符重载函数。
2、按照操作数个数来划分,有单目运算符重载和双目运算符重载。
通常来讲,往往把输入流和输出流运算符改写为全局操作符重载函数,普通的运算符改写为成员函数操作符重载函数。如果想要使用成员函数来重载输出流《 和 输入流》,必须在C++库中对应的类加入这个重载的成员函数,不建议使用。
三、运算符重载的特性
1、不能新增运算符,只能对已有的C++运算符进行重载。
2、不能改变操作数的个数,运算符重载后仍是原有操作数个数。
3、尽量不改变语义,应当使重载运算符功能是类似相同。
4、并不是所有的运算符都可以重载,以下5个运算符不能重载作用域运算符::,成员访问运算符.,类型长度运算符sizeof(),成员指针运算符.*,条件运算符?:。
四、怎么实现运算符重载
采用普通函数的调用方式来调用运算符重载函数,基本语法如下:
// 关键字operator不能省略 // 函数名:operator 运算符 // 参数列表:操作数的个数受原有运算符的操作数个数限定返回值 operator 运算符(参数列表) {// 重载函数体 }
五、案例
1、运算符重载的简单使用
#include <iostream>using namespace std;// 复数类 class Complex { private:int a; // 实部int b; // 虚部 public:Complex(int a = 0, int b = 0){this->a = a;this->b = b;}void show(){if(b < 0){cout << a << b << "i" << endl;}else{cout << a << "+" << b << "i" << endl;}}// 重载运算符+Complex& operator + (const Complex& op){static Complex temp;temp.a = this->a + op.a;temp.b = this->b + op.b;return temp;}// 重载运算符-Complex& operator - (const Complex& op){static Complex temp;temp.a = this->a - op.a;temp.b = this->b - op.b;return temp;}// 重载运算符*Complex& operator * (const Complex& op){static Complex temp;temp.a = this->a*op.a - this->b*op.b;temp.b = this->a*op.b + this->b*op.a;return temp;}// 重载运算符 / Complex& operator / (const Complex& op){static Complex temp;int x = op.a*op.a + op.b*op.b;temp.a = (this->a*op.a + this->b*op.b)/x;temp.b = (this->b*op.a - this->a*op.b)/x;return temp;}bool operator == (const Complex& op){return (this->a == op.a && this->b == op.b);}};int main() {Complex A(1, 2);Complex B(1, 2);if(A == B){cout << "A == B" << endl;}Complex C = A + B;cout << "C = ";C.show();Complex D = A - B;cout << "D = ";D.show();Complex E = A * B;cout << "E = ";E.show();Complex F = A / B;cout << "F = ";F.show();return 0; }
2、全局操作符重载示例
#include <iostream>using namespace std;// 复数类 class Complex { private:int a; // 实部int b; // 虚部 public:Complex(int a = 0, int b = 0){this->a = a;this->b = b;}void show(){if(b < 0){cout << a << b << "i" << endl;}else{cout << a << "+" << b << "i" << endl;}}// 全局操作符重载,重载输入流和输出流,为了方便通常声明friend友元函数friend ostream& operator << (ostream & output, const Complex & other);friend istream& operator >> (istream & input, Complex & other);}; // 可以改为以下定义,但是后面不能连续输入对象,即cout<< A << endl;是非法的,只能cout << A; // void operator << (ostream & output, const Complex & other)ostream& operator << (ostream & output, const Complex & other) {if(other.b < 0){output << other.a << other.b << "i";}else{cout << other.a << "+" << other.b << "i";}return output;}// 可以改为以下定义,但是后面不能连续输入对象,即cin>>A>>B;是非法的,只能cin>>A; cin>>B; // void operator >> (istream & output, const Complex & other) istream& operator >> (istream & input, Complex & other) {input >> other.a >> other.b;return input; }int main() {Complex A;Complex B;cin >> A >> B; // 可以连续输入类对象cout << "A = ";A.show();cout << "B = " << B << endl;return 0; }
3、[]运算符和()运算符
#include <iostream>using namespace std;class Test { private:int *a;int len; public:Test(int len = 1){this->len = len;if(len <= 0){cout << "len is less than 0" << endl;return;}a = new int[len];}~Test(){if(a != nullptr){delete [] a;a = nullptr;}}// 重载[]运算符函数int& operator[](int index){return a[index];}// 重载()运算符函数,变成所谓的仿函数,可以用类对象来作为函数名void operator()(int len){for(int i = 0; i < len; i++){cout << a[i] << " "; }cout << endl;}};int main() {Test temp(5);for(int i = 0; i < 5; i++){temp[i] = i+1; // 像数组那样来操作}temp(5); // 像调用函数那样来操作return 0; }
六、总结
运算符重载通常是为了更加方便的操作类对象,但是并不是所有的运算符都可以重载,重载的运算符应该尽量跟原来运算符的含义相似,同时不能创造新的不属于C++的运算符。
相关文章:
重新C++系列之运算符重载
一、什么是运算符重载 简单来讲就是对运算符赋予新的意义,但是又不能改变原有的含义,它本身也就是一个函数。运算符重载的本质是以函数的方式来体现。 二、运算符重载有几种 1、按照作用域来划分,有全局操作符重载函数和成员函数操作符重载函…...
kotlin异常处理try-catch-finally
kotlin异常处理try-catch-finally fun main(args: Array<String>) {try {println("a")} catch (e: Exception) {//异常捕获println("a-catch: $e")} finally {//善后,无论是否异常,都会执行println("a-finally")}t…...
Pytorch在cuda、AMD DirectML和AMD CPU下性能比较
一、测试环境 CUDA环境: i7-8550u 16G DDR4 2133MHz nVidia MX150 2GB AMD DirectML环境: Ryzen 5 5600G 32G DDR4 3200MHz Vega7 4GB AMD 纯CPU环境:Ryzen 5 5600G 32G DDR4 3200MHz 其他硬件配置的硬盘、电源均一致。Pytorch版本为2.0.0,Pyt…...
哈工大计算机网络课程局域网详解之:交换机概念
哈工大计算机网络课程局域网详解之:交换机概念 文章目录 哈工大计算机网络课程局域网详解之:交换机概念以太网交换机(switch)交换机:多端口间同时传输交换机转发表:交换表交换机:自学习交换机互…...
Jenkins Pipeline的hasProperty函数
函数的作用 用于判断某个参数或者字段是否存在。 用法 例子一 def projectStr "P1,P2,P3" pipeline {agent anyparameters {extendedChoice(defaultValue: "${projectStr}",description: 选择要发布的项目,multiSelectDelimiter: ,,name: SELECT_PROJ…...
芯片制造详解.净洁室的秘密.学习笔记(三)
这是芯片制造系列的第三期跟学up主三圈,这里对其视频内容做了一下整理和归纳,喜欢的可以看原视频。 芯片制造详解03: 洁净室的秘密|为何芯片厂缺人? 芯片制造详解.净洁室的秘密.学习笔记 三 简介一、干净的级别二、芯片…...
可解释的 AI:在transformer中可视化注意力
Visualizing Attention in Transformers | Generative AI (medium.com) 一、说明 在本文中,我们将探讨可视化变压器架构核心区别特征的最流行的工具之一:注意力机制。继续阅读以了解有关BertViz的更多信息,以及如何将此注意力可视化工具整合到…...
k8s Webhook 使用java springboot实现webhook 学习总结
k8s Webhook 使用java springboot实现webhook 学习总结 大纲 基础概念准入控制器(Admission Controllers)ValidatingWebhookConfiguration 与 MutatingWebhookConfiguration准入检查(AdmissionReview)使用Springboot实现k8s-Web…...
JS逆向之猿人学爬虫第20题-wasm
文章目录 题目地址sign参数分析python算法还原往期逆向文章推荐题目地址 https://match.yuanrenxue.cn/match/20第20题被置顶到了第1页,题目难度 写的是中等 算法很简单,就一个标准的md5算法,主要是盐值不确定, 而盐值就在wasm里面,可以说难点就在于wasm分析 sign参数分…...
【双指针优化DP】The 2022 Hangzhou Normal U Summer Trials H
Problem - H - Codeforces 题意: 思路: 首先很明显是DP 因为只有1e6个站点,因此可以以站点作为阶段 注意到K很小,因此可以尝试把这个当作第二维 设dp[i][j]为到达第i个站点,已经花了j元钱的最小步数 然后就想了一…...
[论文笔记] LLM数据集——金融数据集
一、chatglm_金融 ModelScope 魔搭社区 请将modelscope sdk升级到v1.7.2rc0,执行: pip3 install "modelscope1.7.2rc0" -f https://modelscope.oss-cn-beijing.aliyuncs.com/releases/repo.html # 方式1 git clone http://www.modelscope…...
在亚马逊平台,如何有效举报违规行为?
众所周知,在每个行业都有一些违规现象,甚至这些违规现象还会给自己带来利益方面的损失,一旦触犯到自己的利益的话,那自己是需要想办法解决的,想办法规避。 就拿开亚马逊店铺来说,比较容易遇到的就是产品侵…...
深度学习入门教学——神经网络
深度学习就是训练神经网络。 1、神经网络 举个最简单的例子,以下是一个使用线性回归来预测房屋价格的函数。这样一个用于预测房屋价格的函数被称作是一单个神经元。大一点的神经网络,就是将这些单个神经元叠加起来。例如:神经网络根据多个相…...
阿里Java开发手册~OOP 规约
1. 【强制】避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成 本,直接用 类名 来访问即可。 2. 【强制】所有的覆写方法,必须加 Override 注解。 说明: getObject() 与 get 0 bject() 的问题。…...
【Mysql数据库面试01】内连接 左连接 右连接 全连接
【Mysql数据库】内连接 左连接 右连接 全连接 0.准备1.内连接1.1 SQL(不带where)1.2 SQL(带where)1.3总结 2.左连接2.1SQL(不带where)2.2SQL(带where)2.3总结 3.右连接3.1 SQL(不带where&#x…...
事务隔离:为什么你改了我还看不见
前提概要 你肯定不陌生,和数据库打交道的时候,我们总是会用到事务。最经典的例子就 是转账,你要给朋友小王转 100 块钱,而此时你的银行卡只有 100 块钱。 转账过程具体到程序里会有一系列的操作,比如查询余额、做加减法…...
吴恩达ChatGPT《LangChain Chat with Your Data》笔记
文章目录 1. Introduction2. Document Loading2.1 Retrieval Augmented Generation(RAG)2.2 Load PDFs2.3 Load YouTube2.4 Load URLs2.5 Load Notion 3. Document Splitting3.1 Splitter Flow3.2 Character Splitter3.3 Token Splitter3.4 Markdown Spl…...
https和http有什么区别
https和http有什么区别 简要 区别如下: https的端口是443.而http的端口是80,且二者连接方式不同;http传输时明文,而https是用ssl进行加密的,https的安全性更高;https是需要申请证书的,而h…...
振弦采集仪及在线监测系统完整链条的岩土工程隧道安全监测
振弦采集仪及在线监测系统完整链条的岩土工程隧道安全监测 近年来,随着城市化的不断推进和基础设施建设的不断发展,隧道建设也日益成为城市交通发展的必需品。然而,隧道建设中存在着一定的安全隐患,如地质灾害、地下水涌流等&…...
linux基础学习
1.day1 2.day2 1、VIM配置; 2、安装SSH,调用putty接入终端; 3、shell命令; *:匹配任意长度的字符 ?:匹配一个长度的字符 [...]:匹配其中指定的一个字符 [-]:匹配指定…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...


