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

文章目录

  • 运算符重载的概念
  • 运算符重载(函数)
    • 返回值类型:任意类型
    • 函数名: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实例化的对象的引用


在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux CentOS7部署ASP.NET Core应用程序,并配置Nginx反向代理服务器和Supervisor守护服务

前言&#xff1a; 本篇文章主要讲解的是如何在Linux CentOS7操作系统搭建.NET Core运行环境并发布ASP.NET Core应用程序&#xff0c;以及配置Nginx反向代理服务器。因为公司的项目一直都是托管在Window服务器IIS上&#xff0c;对于Linux服务器上托管.NET Core项目十分好奇。因为…

简单学生信息管理系统

简单&#xff0c;单表&#xff1b; https://download.csdn.net/download/bcbobo21cn/89251742

【QT学习】12.UDP协议,广播,组播

一。Udp详细解释 UDP&#xff08;User Datagram Protocol&#xff09;是一种无连接的传输层协议&#xff0c;它提供了一种简单的、不可靠的数据传输服务。与TCP相比&#xff0c;UDP不提供可靠性、流量控制、拥塞控制和错误恢复等功能&#xff0c;但由于其简单性和低开销&#x…

Java | Leetcode Java题解之第64题最小路径和

题目&#xff1a; 题解&#xff1a; class Solution {public int minPathSum(int[][] grid) {if (grid null || grid.length 0 || grid[0].length 0) {return 0;}int rows grid.length, columns grid[0].length;int[][] dp new int[rows][columns];dp[0][0] grid[0][0]…

《罪与罚》读后感

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

LabVIEW换智能仿真三相电能表研制

LabVIEW换智能仿真三相电能表研制 在当前电力工业飞速发展的背景下&#xff0c;确保电能计量的准确性与公正性变得尤为重要。本文提出了一种基于LabVIEW和单片机技术&#xff0c;具有灵活状态切换功能的智能仿真三相电能表&#xff0c;旨在通过技术创新提高电能计量人员的培训…

Flutter笔记:谈Material状态属性-为什么FlatButton等旧版按钮就废弃了

Flutter笔记 谈Material状态属性-为什么FlatButton等旧版按钮就废弃了 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this artic…

MySQL-逻辑架构

1、MySQL服务器处理客户端请求 MySQL是典型的C/S架构&#xff0c;服务端程序使用 mysqld。实现效果&#xff1a;客户端进程像服务端发送&#xff08;SQL语句&#xff09;&#xff0c;服务器进程处理后再像客户端进程发送 处理结果。 2、connectors 指不同语言中与SQL的交互…

Vue3+ts(day05:ref、props、生命周期、hook)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/frontlearningNotes 觉得有帮助的同学&#xff0c;可以点心心支持一下哈&#xff08;笔记是根据b站上学习的尚硅谷的前端视频【张天禹老师】&#xff0c;记录一下学习笔记&#xff0c;用于自己复盘&#xff0c;有需要学…

OpenMLDB v0.9.0 发布:SQL 能力大升级覆盖特征上线全流程

发布日期 25 April 2024 Release note https://github.com/4paradigm/OpenMLDB/releases/tag/v0.9.0 亮点特性 增加最新版 SQLAlchemy 2 的支持&#xff0c;无缝集成 Pandas 和 Numpy 等常用 Python 框架。支持更多数据后端&#xff0c;融合 TiDB 的分布式文件存储能力以及…

【Redis】Redis安装、配置、卸载使用可视化工具连接Redis

文章目录 1.前置条件2.安装Redis2.1下载Redis安装包并解压2.2在redis目录下执行make命令2.3修改Redis配置文件2.4启动Redis服务2.5连接redis服务 3.Redis卸载4.使用可视化工具连接Redis 1.前置条件 Linux操作系统需要要是64位.如果不清楚自己Linux上是多少位的,可以使用以下命…

详解 Go 程序的启动流程,你知道 g0,m0 是什么吗?

自古应用程序均从 Hello World 开始&#xff0c;你我所写的 Go 语言亦然&#xff1a; import "fmt"func main() {fmt.Println("hello world.") }这段程序的输出结果为 hello world.&#xff0c;就是这么的简单又直接。但这时候又不禁思考了起来&#xff0…

vue3 ——笔记 (表单输入,监听器)

表单输入 在Vue 3中&#xff0c;v-model指令的用法稍有不同于Vue 2。在Vue 3中&#xff0c;v-model指令实际上是一个语法糖&#xff0c;它会自动将value属性和input事件绑定到组件或元素上&#xff0c;以实现双向数据绑定。 在自定义组件中使用v-model时&#xff0c;需要在组…

SQL注入漏洞--报错/union/布尔盲注/时间盲注

之前介绍了数据库的基本操作&#xff0c;今天这篇文章就来实操SQL注入。 阅读本文前可以先看一下基本操作&#xff0c;有助于更好理解本文。。。 https://blog.csdn.net/weixin_60885144/article/details/138356410?spm1001.2014.3001.5502 what SQL---结构化查询语言---S…

Codeforces Round 943 (Div. 3) (A-G1) C++题解

目录 比赛链接 : A. Maximize? B. Prefiquence C. Assembly via Remainders D. Permutation Game E. Cells Arrangement F. Equal XOR Segments G1. Division LCP (easy version) G2. Division LCP (hard version) 比赛链接 : Dashboard - Codeforces Round 943 (…

用vim或gvim编辑程序

vim其实不难使用&#xff0c;学习一下就好了。简单功能很快学会。它有三种模式&#xff1a;命令模式&#xff0c;编辑模式&#xff0c;视模式。打开时在命令模式。在命令模式下按 i 进入编辑模式&#xff0c;在编辑模式下按<Esc>键退出编辑模式。在命令模式按 :wq 保存文…

Python-100-Days: Day08 Object-oriented programming(OOP) basics

OOP definition 把一组数据结构和处理它们的方法组成对象&#xff08;object&#xff09;&#xff0c;把相同行为的对象归纳为类&#xff08;class&#xff09;&#xff0c;通过类的封装&#xff08;encapsulation&#xff09;隐藏内部细节&#xff0c;通过继承&#xff08;in…

C/C++开发环境配置

配置C/C开发环境 1.下载和配置MinGW-w64 编译器套件 下载地址&#xff1a;https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release/ 下载后解压并放至你容易管理的路径下&#xff08;我是将其放在了D盘的一个software的文件中管理&#xff09; 2.…

古典密码学简介

目录 C. D. Shannon: 一、置换密码 二、单表代替密码 ① 加法密码 ② 乘法密码 ③密钥词组代替密码 三、多表代替密码 代数密码 四、古典密码的穷举分析 1、单表代替密码分析 五、古典密码的统计分析 1、密钥词组单表代替密码的统计分析 2、英语的统计规…

魔方阵(C语言)

一、魔方阵规律&#xff1b; 8 1 6 3 5 7 4 9 2 魔方阵中各数的排列规律如下&#xff1a; (1)将1放在第1行中间一列。 (2)从2开始直到nn止&#xff0c;各数依次按此规则存放&#xff1a;每一个数存放的行比前一个数的行数减1&#xff0c;列数加1(例如上…