【c++】简单了解运算符重载

引例

class Integer{
public:Integer(int num):_num(num){}int& getValue(){return _num;}
private:int _num;
};

现在有两个Integer对象a,b。想让a和b相加得到的结果给对象c,现在可以肯定的是c=a+b编译后肯定会报错
在这里插入图片描述

请注意这条信息no match for 'operator+' (operand types are 'Integer' and 'Integer')
现有的加法运算符无法对两个Integer对象进行操作,那么有什么方法可以让加法运算符可以对两个Integer对象进行操作?实现的方法就是运算符重载。

运算符重载

我们平常常见的算术运算符、逻辑运算符等运算符都是系统库函数里面已经存在的,所以运算符可以直接用于我们常用的数据类型。然而对于我们自定义的类实例化的对象,系统没有与之相关的运算符可以操作,但是为了使我们编写程序时更加便捷,C++提供了一种方式——运算符重载,来满足我们对于类对象进行的操作。

但是需要注意并不是所有的运算符都可以重载。

可以重载的运算符

  • 算术运算符:+ - * / %
  • 自增、自减运算符:++ –
  • 位运算符:| & ~ ^ << >>
  • 逻辑运算符:|| && !
  • 关系运算符:== != < > <= >=
  • 赋值运算符:= += -= /= %= &= |= ^= <<= >>=
  • 单目运算符:+ - * &
  • 动态内存分配:new delete new[] delete[]
  • 其他运算符:() -> , []

不能重载的运算符

  • . 成员访问运算符
  • :: 域运算符
  • .* ->* 成员指针访问运算符
  • szieof 长度运算符
  • ?: 条件运算符

运算符重载的语法形式

在这里插入图片描述

对于前面的Integer类,重载加法运算符

Integer operator +(Integer&other){return Integer(this->_num+other._num);
}

重载好了之后,c=a+b这个语句就不会报错了。

对于类的运算符重载的方式有3种

  1. 重载为类的非静态成员函数
  2. 重载为类的有元函数
  3. 重载为普通函数

上面的那一种就是重载为类的非静态成员函数

重载为类的有元函数

Integer operator+(const Integer&left,const Integer&right){return Integer(left._num+right._num);
}

类的非静态成员函数方式重载的这个函数还是有点点问题的

Integer operator +(const Integer&other){return Integer(this->_num+other._num);
}

考虑这样的情况

const i1=Integer(1);
const i2=Integer(2);
auto i3=i1+i2

那么则个时候就会报错在这里插入图片描述

其实这个错误很好理解,i1和i2都是常对象,常对象只能访问常成员,那i1就根本访问不了operator +()这个函数,当然会报错。改正的方法也很简单,operator +()加上一个const就可以了

Integer operator +(const Integer&other)const{return Integer(this->_num+other._num);
}

上面是在讨论对象+对象,除了这种情况是不是还会有 对象+数 数+对象
Integer count1=a+1 Integer count2=2+b

对于这种形式的Integer count1=a+1通过非静态成员函数进行重载就可以了

Intger operator+(int v)
{return Intger(this->number_ + v);
}

但是对于这个Integer count2=2+b,如果还通过非静态成员函数进行重载,那么就会出错

Integer operator+(int v,const Integer& right)
{return Integer(this->number_ + v);
}

在这里插入图片描述

因为加法运算符有左右两个操作数,那么重载加法运算符也要有两参数,声明为非静态成员函数,那么隐含的this指针算一个,那么函数的参数列表里写一个就可以了。上面那个加上隐含的this就三个参数了。解决的方法就是重载为类的有元函数

这篇文章就到这里了,希望你能对运算符重载有一个初步的了解。下面的代码是用到的例子

#include <iostream>
class Integer{friend Integer operator+(int v, const Integer& right);
public:Integer(int num):_num(num){}int& getValue(){return _num;}Integer operator +(const Integer&other)const {return Integer(this->_num+other._num);}//friend Integer operator+(const Integer&left,const Integer&right);Integer& operator =(const Integer&other){this->_num=other._num;return *this;}Integer operator+(int v){return Integer(this->_num + v);}/* Integer operator+(int v,const Integer& right){return Integer(this->number_ + v);} */
private:int _num;
};
/* Integer operator+(const Integer&left,const Integer&right){return Integer(left._num+right._num);
} */
Integer operator+(int v, const Integer& right)
{return Integer(right._num + v);
}
int main(){Integer a(1),b(2);Integer c=a+b;const Integer i1(1);const Integer i2(2);auto i3=i1+i2;Integer count1=a+1;Integer count2=2+b;
}

ger a(1),b(2);
Integer c=a+b;
const Integer i1(1);
const Integer i2(2);
auto i3=i1+i2;
Integer count1=a+1;
Integer count2=2+b;
}


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

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

相关文章

利用TreeMap来达成离散化的目的

假如有一些奶牛&#xff0c;他们有种类的区别&#xff0c;我们设黑色奶牛的id为1000010000&#xff0c;白色为1&#xff0c;诸如此类以此类推还有红色等各种颜色&#xff0c;接下来给你一群奶牛的颜色id让你统计每种颜色的奶牛有几头。 如过我们使用数组显然1000010000会爆空间…

uniapp 打包小程序体积优化思路、优先排查优化项参考

uni_modules 也采用分包 虽然 uniapp 官方说了 uni_modules 会根据使用用到而决定是否要打包过滤&#xff0c;但分包前后还是有区别的&#xff0c;所以我估计此前是理解错了虽然会过滤没用到的&#xff0c;但用到了的也会打包到主包里去&#xff0c;就导致了主包偏大无法上传的…

【Spring Boot 源码学习】HttpEncodingAutoConfiguration 详解

Spring Boot 源码学习系列 HttpEncodingAutoConfiguration 详解 引言往期内容主要内容1. CharacterEncodingFilter2. HttpEncodingAutoConfiguration2.1 加载自动配置组件2.2 过滤自动配置组件2.2.1 涉及注解2.2.2 characterEncodingFilter 方法2.2.3 localeCharsetMappingsCus…

会声会影2024有哪些新功能?好不好用

比如会声会影视频编辑软件&#xff0c;既加入光影、动态特效的滤镜效果&#xff0c;也提供了与色彩调整相关的LUT配置文件滤镜&#xff0c;可选择性大&#xff0c;运用起来更显灵活。会声会影在用户的陪伴下走过20余载&#xff0c;经过上百个版本的优化迭代&#xff0c;已将操作…

html列表

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>列表名称</title> </head> <body> <!--有序列表--> <ol><li>java</li><li>python</li><li…

centos 7.9 源码安装htop

1.下载源码 wget http://sourceforge.net/projects/htop/files/latest/download 2.上传到tmp目录&#xff0c;并解压 tar xvzf htop-1.0.2.tar.gz mv htop-1.0.2 /opt/ 进入到 cd /opt/htop-1.0.2/ 3.编译并安装 ./configure && make && make install 4.…

Ubuntu docker安装mysql

本文介绍如何在docker中安装mysql&#xff0c;之前有尝试过先在docker中安装一个ubuntu到镜像&#xff0c;然后进去再去安装mysql相关的东西&#xff0c;发现不行&#xff0c;这边整理一下一个可行的方式。 在下载镜像的时候&#xff0c;直接下载mysql镜像。 1.搜索镜像 doc…

解决Kafka新消费者组导致重复消费的问题

问题描述&#xff1a;在使用Kafka时&#xff0c;当我们向新的消费者组中添加消费者时&#xff0c;可能会遇到重复消费的问题。本文将介绍一些解决这个问题的方法&#xff0c;帮助开发者更好地处理Kafka中的消费者组和消费偏移量。 Kafka是一个强大的分布式消息队列系统&#xf…

redis怎么设计一个高性能hash表

问题 redis 怎么解决的hash冲突问题 &#xff1f;redis 对于扩容rehash有什么优秀的设计&#xff1f; hash 目标是解决hash冲突&#xff0c;那什么是hash冲突呢&#xff1f; 实际上&#xff0c;一个最简单的 Hash 表就是一个数组&#xff0c;数组里的每个元素是一个哈希桶&…

实现Linux下Word转PDF、Java调用命令方式

使用 LibreOffice 实现 Word 转 PDF 和 Java 调用命令 1、 安装 LibreOffice 外网安装 # 一键安装 yum install -y libreoffice # 验证版本 libreoffice --version # Warning: -version is deprecated. Use --version instead. # LibreOffice 7.5.6.2 f654817fb68d6d4600d7…

蓝桥杯 (年号字串 C++)

思路&#xff1a; 1、看成10进制转化成26进制 。 2、A表示1、B表示2。以此类推&#xff0c;Z表示26. 代码&#xff1a; #include <iostream> using namespace std; int main() {char str[10]; int sum 2019, n, i 0; while (sum > 0) {str[i] sum % 26 64;sum / …

Java面试——RPC协议

涉及到分布式方面知识的话&#xff0c;RPC协议是逃不开的&#xff0c;所以在此记录一下RPC协议。 什么是RPC协议 RPC协议&#xff08;Remote Procedure Call&#xff09;远程过程调用&#xff0c;简单的来说&#xff1a;RPC协议是一种通过网络从远程计算机程序获取服务的协议…

【Qt】消息机制和事件

文章目录 事件event()事件过滤器案例&#xff1a;检测鼠标事件案例&#xff1a;定时器 事件 事件&#xff08;event&#xff09;是由系统或者 Qt 本身在不同的时刻发出的。当用户按下鼠标、敲下键盘&#xff0c;或者是窗口需要重新绘制的时候&#xff0c;都会发出一个相应的事…

序列解包和生成器表达式

序列解包 可以使用序列解包功能对多个变量同时赋值 (1) x, y, z 1, 2, 3 print(x, y, z)必须一一对应 x, y, z 1, 2 会抛出异常 (2) 括号可加可不加 v_tuple (False, 3.5, abc) (x, y, z) v_tuple # 等价于x, y, z v_tuple print(x, y, z)可以对range对象进行解包 …

联邦学习的梯度重构

梯度泄露的攻击方法&#xff1a;深度泄露梯度&#xff08;DLG&#xff09;——>在高度压缩的场景下是失效的 原因&#xff1a;梯度压缩&#xff08;可减小通信开销&#xff09;——>存在信息损失<——从而DLG方法效果有限 但是这本身存在的信息损失怎么解决呢&#x…

Go语言的sync.Once()函数

sync.Once 是 Go 语言标准库 sync 包提供的一个类型&#xff0c;它用于确保一个函数只会被执行一次&#xff0c;即使在多个 goroutine 中同时调用。 sync.Once 包含一个 Do 方法&#xff0c;其签名如下&#xff1a; func (o *Once) Do(f func()) Do 方法接受一个函数作为参数…

科普长文--网络安全拟态防御技术概念及应用

网络安全拟态防御技术概念 什么是网络安全拟态防御? 网络安全拟态防御技术是一种基于生物拟态原理,利用动态异构冗余构造、拟态伪装机制、测不准效应等手段,实现网络空间的主动防御和内生安全的技术。它是由中国工程院院士邬江兴首创的,旨在应对网络空间中的各种未知威胁…

深入解析docker内核网桥

今天做虚拟桌面&#xff0c;朋友问我&#xff0c;为什么vnc 连接另一个docker 容器一直超时&#xff0c;原因是在docker 启动的时候没有组网&#xff0c;那么接下来我就要解析下docker的内核网络。 我们思考几个问题&#xff0c;带你了解linux 中docker 网络实现的基本原理。 文…

Leetcode 第 366 场周赛题解

Leetcode 第 366 场周赛题解 Leetcode 第 366 场周赛题解题目1&#xff1a;2894. 分类求和并作差思路代码复杂度分析 题目2&#xff1a;2895. 最小处理时间思路代码复杂度分析 题目3&#xff1a;2896. 执行操作使两个字符串相等思路代码复杂度分析 题目4&#xff1a;2897. 对数…

【Java基础面试四十六】、 List<? super T>和List<? extends T>有什么区别?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;问题 参考答案&#x…