【C++】运算符重载

news2025/7/22 0:57:21

 前言:本教程使用到的工具是vs2010;

目录

为什么要重载运算符? 

运算符重载

重载++就一定要++吗?

重载后的运算符和普通运算符有什么区别?

总结


为什么要重载运算符? 

先看代码:

#include <stdio.h>
#include <windows.h>

class Number
{
public:
    int x;
    int y;
    Number(int x,int y)
    {
        this->x = x;
        this->y = y;
    }
};

int main()
{

    return 0;
}

我们定义了一个Number类,有两个成员;和一个构造函数,为两个成员赋值;

然后我们定义一个函数,来返回两个数值中的最大值,如下:

然后我们定义两个变量进行比较,并输出最大值,如下:

我们的目的达到了,成功的返回了两个int类型的最大值

如果我们想要比较double类型、char类型,都很简单,直接>号<号比较就行了;

但是如果我们想要比较两个Number类型的对象呢?

仔细想一下,我们该怎么办?

首先,第一种方法,直接在类中写一个这样的函数:

定义两个对象,并初始化如下:

调用者n1,传入实参对象n2,如果n1>n2会返回1(true),如果不大于(<=)就返回0(false):

定义一个bool类型接收,int也行:

打印输出:

n1的x和y都小于了n2,所以为0,没有问题;

但是这样通过函数的调用来完成类对象的比较,看起来也不是很舒服 

那么有没有办法,能让类的对象像普通变量一样进行比较呢?

有的

就是我们下面要讲的运算符重载;

我们现在可以说一下为什么要重载运算符了,就是为了我们的对象使用起来能像普通变量那么方便;

运算符重载

运算符重载语法如下:

返回值类型 operator待重载运算符(参数列表)

{

        

}

运算符重载一般定义在类中,因为一般我们重载运算符就是为了类的对象能够使用该运算符

我们首先来重载一下大于号 (>);

如下:

这里只能传递一个参数,因为>号是双目运算符,只能有左操作数和右操作数,然而类的成员函数已经有this指针(左操作数)了

我们定义两个对象,进行比较,如下:

我们有两种比较方式,第一种:

还是和我们刚刚那样进行函数调用,但是如果这样写,那么重载也就毫无意义了

所以我们还可以,这样写:

只要我们在类中重载了>号,那么我们类的对象就可以直接使用>号进行比较,当然没有重载的符号依旧不可以使用,如下:

没重载的是不行的;

重载++就一定要++吗?

再举例: 

正常情况下我们普通变量都是可以直接++的,如下:

那么类的对象能不能++呢?

当然可以,重载嘛,如下:

再次注意这里,我们的++是单目运算符,因为类的成员函数有this指针这个参数,所以不能再添加参数了;

我们加一下试试:

没有问题

但是我有一个问题,我们重载的++运算符就一定要是++吗?

当然不是

如下:

我们完全可以这样写,我们只是重载了++操作符,但是他也只是个函数啊,函数的内容我们想怎么写就怎么写

我们运行一下: 

没问题

谁说++就一定要加了?谁说++就一定要加1?

这也就是为什么计算机中1+1不一定等于2,因为这个操作符是别人自己按照他的思维来重载的,我们当然也可以按照自己的思维来写,++我们写个减1,但是没必要,一般情况下我们还是遵守计算机的算法来写,不要乱写,没什么好处;

重载后的运算符和普通运算符有什么区别?

最后我们来看一下,我们使用的++他难道真的就是一个符号吗?重载++操作符后的++和普通变量的++又有什么区别呢?

我们先来看普通变量,如下:

像我这样写代码,在这条没用的汇编这里打个断点,然后编译、调试,最后alt+8转到反汇编,如下:

普通变量的++分为三步骤:

        1、将临时变量t从内存中取出来,放到eax寄存器里;

        2、使用add命令将eax寄存器中的值+1;

        3、将+1后的值放回临时变量t的那块内存;

再看重载的++(对象++);

我们先把operator++这个函数改回来,然后像我这样写代码下断点:

编译、调试、alt+8:

两个步骤:

        1、将对象n这个地址放到ecx寄存器里,前面的课我有说过,ecx一般就是存放this指针的,那么这一步的意思就是,将n的地址看成是this指针,放到ecx里(寄存器传参);

        2、调用Number::operator++函数;

可以看到,我们自己重载的++,编译器最终还是调用的函数,并没有像我们普通变量那样,将值取出来+1再放回去; 

思考一下这是为什么呢?

因为编译器根本不知道我们的operator++(重载++运算符的函数)里边写的是什么,我们刚刚也说了,我们可以随便写,想写什么写什么;既然编译器不能确定我们写的是什么,他当然不能将我们的值取出来+1再放回去啊,如果编译器这样做的话,我们的重载还有什么意义呢?

所以我们看到的对象++,并不是真正的++,他最终还是调用的函数(operator++函数);

总结

        1、我们之所以要重载运算符,就是为了类的对象使用运算符也能和普通变量一样方便;

        2、运算符重载的语法是: 返回值类型 operator 待重载运算符(参数列表) { }

        3、重载的运算符不一定非要是我们认知里的操作,比如重载的++不一定非要++,也可以--;

        4、重载后的运算符和普通运算符的区别在于,重载后的运算符使用的时候还是调用operator运算符重载函数,但是普通运算符就是按照正常逻辑去操作内存;

结语:感谢大家观看,如果有错误请指正;讲的不好的地方也请提出来,谢谢大家!

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

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

相关文章

腾讯实时股票数据接口怎么获取行情?

腾讯实时股票数据接口怎么获取行情&#xff1f;以五粮液为例&#xff0c;要获取最新行情&#xff0c;访问数据接口&#xff1a; 返回数据&#xff1a;v_sz000858"51~五 粮 液~000858~27.78~27.60~27.70~417909~190109~227800~27.78~492~27.77~332~27.76~202~27.75~334~27.…

做SEO为什么有的网站收录很难做?

刚开始做网站的时候&#xff0c;经常遇到网站收录难的问题。有时候一个月都没收录&#xff0c;急得还是忍不住。我困惑了很久。每天都在想是什么原因导致我的网站没有被收录&#xff0c;很无奈也很难过。那时候我还不知道搜索引擎的工作原理&#xff0c;也不知道从何入手。我像…

为什么我抓不到baidu的数据包

最近&#xff0c;有位读者问起一个奇怪的事情&#xff0c;他说他想抓一个baidu.com的数据包&#xff0c;体验下看包的乐趣。 但却发现“抓不到”&#xff0c;这就有些奇怪了。 我来还原下他的操作步骤。 首先&#xff0c;通过ping命令&#xff0c;获得访问百度时会请求哪个I…

[TypeScript]Vue/React子组件实例暴露方法

最近几个月都在用TS开发各种项目&#xff0c;框架有涉及到Vue3,React18等&#xff1b; 记录一下Vue/React组件暴露出变量/函数的方法的写法&#xff1b; Vue2 回顾一下Vue2 组件暴露出去方法&#xff0c;它并没有约束&#xff0c;写在methods里的方法都能被调用&#xff0c;da…

UNIAPP实战项目笔记38 购物车的添加商品到购物车功能

UNIAPP实战项目笔记38 购物车的加入购物车功能 通过mapGetters实现此功能 在 shopcart.vue中 使用mapGetters中的 addShopCart方法实现商品数量的增加 核心代码 detail.vue <template><view class"details"><!-- 商品图 --><swiper :indicator…

如何在 JavaScript 中使用三元运算符

随着 React 的版本更新&#xff0c;内置 Hooks 越来越多了。很多 Hook 可能你压根都没听说过。但是 useEffect 这个老牌 Hook&#xff0c;相信每个用 React 的同学应该熟悉。 不优雅的 useEffect 不过对很多刚接触 React 的人来说&#xff0c;使用 useEffect 非常容易出现无限…

figma对比sketch有什么优势和不足?

设计行业的工具层出不穷。在我看来&#xff0c;sketch它在一定程度上被颠覆了PS&#xff0c;如今sketch已成为许多设计团队的设计工具。 那么Figma相对于Sketch有哪些优点&#xff1f;有哪些不便&#xff1f;让我们从几个方面来了解一下。 两款软件非常适合创建UI和组件库。Ske…

【LeetCode】数组系列-双指针

一、双指针算法基本介绍 算法思想&#xff1a;在遍历对象的过程中&#xff0c;不是普通的使用单个指针进行访问&#xff0c;而是使用两个相同方向&#xff08;快慢指针&#xff09;或者相反方向&#xff08;对撞指针&#xff09;的指针进行扫描&#xff0c;从而达到相应的目的…

现代 React Web 开发实战——kanban实现卡片拖拽

前提摘要&#xff1a; 学习宋一玮 React 新版本 函数组件 &Hooks 优先 开篇就是函数组件Hooks 实现的效果如下&#xff1a; 学到第11篇了 照葫芦画瓢&#xff0c;不过老师在讲解的过程中没有考虑拖拽目标项边界问题&#xff0c;我稍微处理了下这样就实现拖拽流畅了 下面就…

Flink基础原理

一、Flink的概述 我感觉就是一个实时的流处理程序,可以实时的从数据源读取数据,然后根据设置好的一系列算法, 对数据进行处理,最终输出到目的存储介质&#xff08;数据库、缓存等&#xff09;中去,和jdk1.8里面的数据流处理很像, 也有并行流、map、fifter等处理。二、Flink的基…

实验八 数据处理与多项式处理(matlab)

实验八 数据处理与多项式处理 1.1实验目的 1.2实验内容 1.3流程图 1.4程序清单 1.5运行结果及分析 1.6实验的收获与体会 1.1实验目的 1&#xff0c;掌握数据统计和分析的方法&#xff1b; 2&#xff0c;掌握数值插值与曲线拟合的方法&#xff1b; 3&#xff0…

如何使用 .Net Core 实现数据库迁移 (Database Migration)

当我们在编写基于数据库的应用程序时&#xff0c;随着需求的增加和改变&#xff0c;我们需要升级我们的数据库&#xff0c;变更数据库表的字段&#xff0c;当我们的系统的不同版本被部署到了不同的客户那里&#xff0c;在需要给客户升级时&#xff0c;我们如何实现数据库模式 (…

注解和反射

注解和反射注解元注解反射注解 注解和注释的区别 注解 annotation写在程序之中&#xff0c;程序可以识别&#xff0c;做出相应的动作处理&#xff0c;具有检查和约束程序的作用 注释 comment 写在程序之中&#xff0c;供人参考&#xff0c;提示使用&#xff0c;程序会自动忽…

云原生系统学习[Kubernetes]——02 Pod、Deployment、Service

云原生系统学习[Kubernetes]——02 Pod、Deployment、Service [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t9RomXCf-1668486830453)(./assets/image-20221103113345300.png)] 参考资料 什么是YAMLk8s官网文档k8s中文社区k8s-book 学多少&#…

Java:继承和多态

文章目录前言一、继承1.继承概念1.1 继承的语法1.2 父类成员方法1.2.1 子类访问父类的成员变量1.2.2 子类访问父类的成员方法1.3 super、this 关键字1.4 子类构造方法1.5 继承的方式1.6 final 关键字1.7 继承与组合二、多态2.1 多态的概念2.2 多态实现的条件2.3 对重写的认识2.…

Canvas 基础使用

一、基本的画布功能 创建 <canvas>元素时至少要设置 width 和 height 属性&#xff0c;这样才能告诉浏览器在多大面积上绘图。出现在标签包裹里的内容会在浏览器不支持 <canvas>元素时显示。比如&#xff1a; <canvas id"drawing" width"200&q…

PumpkinBook Reading(一)

绪论 基本术语 “算法”是指从数据中学得“模型”的具体方法&#xff0c;“算法”产出的结果称为“模型”&#xff0c;通常是具体的函数或者可抽象地看作为函数。 样本&#xff1a;也称为“示例”&#xff0c;是关于一个事件或对象的描述。因为要想让计算机能对现实生活中的事…

【Python开发】Flask开发实战:个人博客(三)

Flask开发实战&#xff1a;个人博客&#xff08;三&#xff09;在【Python开发】Flask开发实战&#xff1a;个人博客&#xff08;一&#xff09; 中&#xff0c;我们已经完成了 数据库设计、数据准备、模板架构、表单设计、视图函数设计、电子邮件支持 等总体设计的内容。 在【…

公众号裂变拉新,以婴儿辅食为诱饵,实现低成本获客!

大家好~我是娜娜 今天来给大家拆解一个关于食品行业精选公众号增长案例&#xff0c;通过公众号裂变拉新&#xff0c;任务拉新人数5000&#xff0c;留存率达到85%&#xff0c;活动裂变率达到1100.86%。活动数据也还在持续的上升当中。 该公众号的目标人群是新手爸妈&#xff0…

【Java】SpringBoot应用简单示例

SpringBoot应用简单示例SpringBoot应用简单示例HelloWorld搭建项目ResponseBody的作用ComponentScan排除扫描beanSpringBoot集成日志SpringBoot日志初始化原理消息转换器拦截器过滤器操作数据库Spring Data JpaDruid数据源Mybatis-Plus事务处理操作缓存AOP相关概念栗子定时任务…