类和对象【四】运算符重载

文章目录

  • 运算符重载的概念
  • 运算符重载(函数)
    • 返回值类型:任意类型
    • 函数名:operator已有操作符
  • 运算符重载(函数)的特点和注意点
  • 3个比较特殊的运算符重载
    • 赋值运算符(=)重载
      • 返回值类型和返回值
      • 参数
      • 函数体
    • ++运算符重载(- -运算符重载类似)
      • 前置++
        • 前置++的返回值:
        • 前置++的函数体
      • 后置++
        • 后置++的返回值:
        • 参数表:
        • 后置++的函数体
    • <<运算符重载(>>运算符重载类似)
      • <<运算符重载函数的返回值
      • <<运算符重载函数的参数表
      • <<运算符重载函数的函数体

运算符重载的概念

运算符重载,就是对已有的运算符重新进行定义,增加其另一种功能,以适应不同的数据类型
C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有返回值类型,函数名以及参数列表
其返回值类型与参数列表与普通的函数类似。

运算符重载(函数)

通过 运算符重载(函数)即可让已有的运算符增加一种运算方式(规则)

运算符重载函数的函数体中的代码,就是运算方式(规则)

返回值就是运算算的结果

【例:自定义的日期类,如果想计算某一个日期之后n天是什么日期,就可以重载已有的+运算符,让它增加一种日期+天数的运算方式(规则)】


返回值类型:任意类型

根据运算符重载(函数)的作用,自定义返回值类型和返回值


函数名:operator已有操作符


在这里插入图片描述


运算符重载(函数)的特点和注意点

  1. 运算符重载(函数)的参数的相对位置【左,右】,就是操作符的左操作数和右操作数

  2. 不能创建新的运算符,只能重载已有的运算符

    在这里插入图片描述

  3. 运算符重载不会也不能改变原运算符的优先级结合性
    例:重载运算符+之后,+的优先级不变,还是在乘除之后。结合性也没变,还是左结合

  4. 运算符重载函数的参数表中至少有一个参数是自定义类型
    因为运算符重载不允许修改原内置的运算符的运算规则,而如果参数都是内置类型就是在修改原内置的运算符的运算规则,而并非增加运算规则

    在这里插入图片描述

  5. 运算符重载函数可以是全局函数,也可以是成员函数
    作为类成员函数重载时,其形参看起来比操作数数目少1,因为成员函数的第一个参数是隐藏的this

  6. :: sizeof 条件运算符?: 点运算符. .* 这5个运算符不能重载


3个比较特殊的运算符重载

赋值运算符(=)重载

赋值运算符重载其实也是类的默认成员函数,它的作用就是给对象赋值

也就是说如果程序员没有显式地实现赋值运算符重载,编译器也会自动生成一个默认的赋值运算符重载

这个默认的赋值运算符重载函数只实现了浅拷贝


返回值类型和返回值

返回值类型是自定义类型(类)的引用,返回值为*this
原因:

  1. 返回引用就不用调用拷贝构造,可以提高效率
  2. 可以链式编程
    (即连续赋值 例:a=b=c,因为赋值运算符右结合,所以c先赋值给b,并返回b的引用,返回的b的引用再赋值,相当于a=b

参数

显式的参数只有一个,一般为该类的对象的引用
因为赋值运算符只能重载为成员函数,所以还有一个隐式的参数是每个成员函数都有的this指针

在这里插入图片描述


函数体

一般为两部分:

  1. 判断显式传入的那个参数是不是this指向的
    如果是就是this指向的对象赋值给this指向的对象,也就是自己赋值给自己,没有必有,所以直接返回

  2. 执行拷贝
    如果成员没有申请资源,就直接浅拷贝此时不显式实现赋值运算符(=)重载,直接使用编译器给的默认的也可以
    如果有成员申请了资源,就必须显式地实现深拷贝


在这里插入图片描述


++运算符重载(- -运算符重载类似)

++运算符既可以重载为成员函数,又能重载成全局函数


前置++

其实我们常念的口诀:前置++,先++后使用
中的使用,使用的是前置++运算的结果,也就是返回值


前置++的返回值:

必须是++后的参数的引用

原因:

  1. 保证一直对同一个对象进行运算,我们常常使用++之后的结果直接作为另一个操作符的操作数
    (++a)+=3,++a返回了a的引用,才能把后面的+=3加等到a上
    而直接返回对象的值,返回的是它拷贝构造后的一个东西,并非++之前的对象【地址不一样

  2. 返回引用可以不用调用拷贝构造,可以提高效率


前置++的函数体

一般分为两部分

  1. 执行对象+=1的操作
  2. 返回对象的引用


在这里插入图片描述


后置++

常念的口诀:后置++,先使用,后++
中的使用,使用的是后置++运算的结果,也就是返回值


后置++的返回值:

返回值:传入的参数的临时拷贝

原因:

先使用后++,所以后置++的返回值要是参数刚传入函数时的值但是后置++函数也要完成++的操作所以需要一个临时的对象存储参数刚传入的值,最后再返回这个对象
又因为是在函数中创建的对象,函数结束就销毁,所以不能返回它的引用


参数表:

重载为成员函数时:operator++(int)
重载为全局函数时:operator++(要++的对象的引用,int)

为什么要有int这个占位类型?
因为后置++是前置++的重载,=如果参数表相同,就没法重载
所以规定后置++运算符重载时
用int占位参数区分它和前置++的重载函数


后置++的函数体

一般分为三部分

  1. 拷贝构造出返回的对象
  2. 执行++的操作
  3. 返回拷贝构造出的对象


在这里插入图片描述


<<运算符重载(>>运算符重载类似)

<<运算符重载,主要实现把对象输出到屏幕/文件等,一般用cout指执行输出

<<运算符只能重载成全局函数

为什么呢?
因为如果把<<运算符重载为成员函数,因为this是所有成员函数隐式的第一个参数
那么cout就只能是第二个参数
此时函数参数的相对位置是this在左,cout在右,而运算符重载函数的参数的相对位置,决定左右操作数是谁
所以把<<运算符重载为成员函数时,this(对象)左操作数cout右操作数
也就是重载之后,我们要这样输出对象: a<<cout
不符合我们的习惯


<<运算符重载函数的返回值

返回值类型:ostream&ostream是C++标准库中的输出流类,我们常用的cout就是它实例化的对象】

返回值:ostream实例化的对象的引用

原因:

  1. 返回ostream实例化的对象的引用可以达成链式编程【即 这样就可以:cout<<a<<b<<c了】
  2. 返回引用不需要调用拷贝构造,可以提高效率

<<运算符重载函数的参数表

operator<<(ostream& out, 要输出的对象的引用)


<<运算符重载函数的函数体

一般分为两部分

  1. 执行对象的数据输出
  2. 返回ostream实例化的对象的引用


在这里插入图片描述

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

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

相关文章

未来科技的前沿:深入探讨人工智能的进展、机器学习技术和未来趋势

文章目录 一、人工智能的定义和概述1. 人工智能的基本概念2. 人工智能的发展历史 二、技术深入&#xff1a;机器学习、深度学习和神经网络1. 机器学习2. 深度学习3. 神经网络 三、人工智能的主要目标和功能1. 自动化和效率提升2. 决策支持和风险管理3. 个性化服务和预测未来 本…

vulnhub靶场之FunBox-2

一.环境搭建 1.靶场描述 Boot2Root ! This can be a real life scenario if rockies becomes admins. Easy going in round about 15 mins. Bit more, if you are find and stuck in the rabbit-hole first. This VM is created/tested with Virtualbox. Maybe it works with…

【tcl脚本实践Demo 1】文本生成、匹配、修改、读写

引言 在芯片设计的流程中,各种EDA工具在设计、综合、布局布线、验证、时序分析等等环节都会产出大量的文件信息。这些信息是海量的,如果单纯靠程序员自己查看信息效率很低并且很容易纰漏。所以脚本语言可以很好的解决这个问题,可以利用脚本语言匹配到敏感的信息,完成对信息…

WindowSurfaceController method call stacktrace

WindowSurfaceController: prepareToShowInTransaction showRobustly

python判断大图中包含小图并输出位置总结

python判断大图中包含小图并输出位置总结 没啥可说的&#xff0c;项目遇到了就直接上代码&#xff0c;可以减轻劳动力&#xff0c;花最少得时间实现应用功能。 import cv2 # 读取大图片和小图片的路径 img_big cv2.imread(big_image.png) img_small cv2.imread(small_image…

华为手机 鸿蒙系统-android studio识别调试设备,开启adb调试权限

1.进入设置-关于手机-版本号&#xff0c;连续点击7次 认证&#xff1a;有锁屏密码需要输入密码&#xff0c; 开启开发者配置功能ok 进入开发者配置界面 打开调试功能 重新在androd studio查看可运行running devices显示了&#xff0c; 不行的话&#xff0c;重启一下android …

AI诗歌创作

诗歌作为一种文学形式&#xff0c;能够通过优美的语言和深刻的意境表达情感和思想&#xff0c;触动人心&#xff0c;引发共鸣。然而&#xff0c;如今随着生活节奏的加快和人们对实用性的追求&#xff0c;写诗这一传统艺术渐渐被人们所忽略。幸运的是&#xff0c;随着人工智能技…

一本通-1225:金银岛

【题目描述】 某天KID利用飞行器飞到了一个金银岛上&#xff0c;上面有许多珍贵的金属&#xff0c;KID虽然更喜欢各种宝石的艺术品&#xff0c;可是也不拒绝这样珍贵的金属。但是他只带着一个口袋&#xff0c;口袋至多只能装重量为w的物品。岛上金属有s个种类, 每种金属重量不同…

Spring Cloud Feign

序言 本文给大家介绍一下 Spring Cloud Feign 的基础概念以及使用方式。 一、远程调用 在传统的单体系统中&#xff0c;我们通常是客户端去请求服务端的接口。但是在分布式的系统中&#xff0c;常常需要一个服务去调用另外一个服务的接口。在服务端如何去调用另外一个服务端…

搭建MongoDB副本集

文章目录 一、什么是MongoDB的副本集二、副本集的架构三、副本集的成员四、部署副本集1、节点划分2、安装MongoDB2.1、下载解压安装包 3、创建主节点3.1、创建存储数据和日志的目录3.2、新建配置文件3.3、启动节点服务 4、创建副本节点4.1、创建存储数据和日志的目录4.2、新建配…

普通电机与变频电机区别

普通电机和变频电机之间的区别&#xff1a; 1. 设计和构造&#xff1a; - 普通电机&#xff1a;设计用于在恒定的电源频率和电压下工作&#xff0c;通常具有固定的转速和功率。 - 变频电机&#xff1a;专门设计用于与变频器配合使用&#xff0c;能够在变化的频率和电压下运行&…

大模型公开可用的模型检查点或 API

文章目录 公开可用的模型检查点或 APILLaMA 变体系列大语言模型的公共 API 公开可用的模型检查点或 API 众所周知&#xff0c;大模型预训练是一项对计算资源要求极高的任务。因此&#xff0c;经过预训练的公开模型检查点&#xff08;Model Checkpoint&#xff09;对于推动大语言…

精简函数栈帧:优化创建和销毁过程的完全解析(建议收藏,提升内功)

&#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;C笔记专栏&#xff1a; C笔记 &#x1f308;喜欢的诗句:无人扶我青云志 我自踏雪至山巅 文章目录 【前文】一、函数栈帧的概念&#xff08;stack frame&#xff…

win10部署本地大模型langchain+ollama

一、环境 windows10、Python 3.9.18、langchain0.1.9 二、ollama下载 Download Ollama on Windows 0.1.33版本链接https://objects.githubusercontent.com/github-production-release-asset-2e65be/658928958/35e38c8d-b7f6-48ed-8a9c-f053d04b01a9?X-Amz-AlgorithmAWS4-H…

一键切换ip地址的软件哪个好用

随着互联网的快速发展&#xff0c;IP地址的重要性日益凸显。它不仅代表着每台设备在网络上的唯一标识&#xff0c;还关乎到我们的网络隐私、访问权限以及工作效率。一键切换IP地址的软件应运而生&#xff0c;为我们提供了极大的便利。那么&#xff0c;在众多选择中&#xff0c;…

前端 JS 异常那些事

前言 人无完人&#xff0c;所以代码总会出异常的&#xff0c;异常并不可怕&#xff0c;关键是怎么处理 什么是异常 程序发生了意想不到的情况&#xff0c;影响到了程序的正确运行 从根本上来说&#xff0c;异常就是一个普通的对象&#xff0c;其保存了异常发生的相关信息&a…

《罪与罚》读后感

陀思妥耶夫斯基和列夫托尔斯泰是公认的俄国文学黄金时代的两座高峰&#xff0c;分别代表着俄国文学的“深度”和“广度”。列夫托尔斯泰的鸿篇巨著《复活》《安娜卡列尼娜》等等都已经拜读过&#xff0c;但陀思妥耶夫斯基的作品却一本也没有看过&#xff0c;实在是有点遗憾。这…

JUC并发-共享模型-工具-线程池

1、自定义线程池 每创建一个线程资源&#xff0c;就要占用一定的内存&#xff1b; ①如果是高并发场景&#xff0c;一下子来了很多任务&#xff0c;如果为每个任务都创建一个线程&#xff0c;对内存占用较大&#xff0c;甚至可能出现OOM。 ②大量任务来了&#xff0c;创建了很…

中国人自己编的百科全书,百科知识全书10册(外国卷)

一、电子书描述 中国人自己编的与国际接轨的百科全书&#xff0c;也是真正意义上的现代百科全书&#xff0c;在坚持全面反映了人类知识的同时&#xff0c;也突出了中国特色&#xff0c;充分显示世界科学文化的新成就和新发展。本套电子书&#xff0c;大小367.39M&#xff0c;共…

每日一题:两地调度

公司计划面试 2n 人。给你一个数组 costs &#xff0c;其中 costs[i] [, ] 。第 i 人飞往 a 市的费用为 &#xff0c;飞往 b 市的费用为 。 返回将每个人都飞到 a 、b 中某座城市的最低费用&#xff0c;要求每个城市都有 n 人抵达。 示例 1&#xff1a; 输入&#xff1a;c…