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

文章目录

  • 运算符重载的概念
  • 运算符重载(函数)
    • 返回值类型:任意类型
    • 函数名: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.mzph.cn/web/6130.shtml

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

相关文章

嵌入式开发四:STM32 基础知识入门

为方便更好的学习STM32单片机&#xff0c;本篇博客主要总结STM32的入门基础知识&#xff0c;重点在于理解寄存器以及存储器映射和寄存器映射&#xff0c;深刻体会STM32是如何组织和管理庞大的寄存器&#xff0c;从而提高开发效率的&#xff0c;为后面的基于标准库的开发做好铺垫…

MySQL 8.4 版本(LTS) 发布,一睹为快

前言 Oracle 前几天发布了 MySQL 8.4 版本(LTS)&#xff0c; 该版本是创新版的第一个长期支持版本。详细规划&#xff0c;请移步 技术译文 | 一文了解 MySQL 全新版本模型 关于 MySQL 的版本发布规划 Oracle MySQL 官方开发团队推出的新版本将过渡到新的 MySQL 版本模型。MyS…

cefsharp实现资源替换如网页背景、移除替换标签、html标识、执行javascript脚本学习笔记(含源码说明)

(一)实现测试(仅供学习参考) 1.1 目标系统页面(登录页)和登录后首页面中2处(一个替换一个移除) 1.2 实现后效果(使用cefsharp自定义浏览器实现以上功能) 1.3 登录后页面替换和移除 系统名称和一个功能菜单li (二)通过分析代码实现脚本编写 2.1 分开处理,设置了…

IDEA 2022.1版本开始,可以直接运行Markdown里的命令行

参照这种格式&#xff1a; shell mvn clean install注意idea支持的版本&#xff1a;是从 2022.1版本开始的。 ps&#xff1a;之前有人写过了&#xff0c;感觉很实用但是蛮多开发者不一定会知道的功能。 参考资料&#xff1a; https://www.cnblogs.com/didispace/p/16144107.h…

pygame鼠标绘制

pygame鼠标绘制 Pygame鼠标绘制效果代码 Pygame Pygame是一个开源的Python库&#xff0c;专为电子游戏开发而设计。它建立在SDL&#xff08;Simple DirectMedia Layer&#xff09;的基础上&#xff0c;允许开发者使用Python这种高级语言来实时开发电子游戏&#xff0c;而无需被…

ES数据存储与查询基本原理

Elasticsearch&#xff08;ES&#xff09;简介 Elasticsearch&#xff08;ES&#xff09;是一个分布式、可扩展、近实时的搜索和分析引擎&#xff0c;它基于Lucene&#xff0c;设计用于云计算中&#xff0c;处理大规模文档检索和数据分析任务&#xff0c;常用于实现内部搜索引…

CMake:静态库链接其他动态库或静态库(九)

1、项目结构 对于下面这样一个项目 把calc模块做成静态或者动态库把sort模块做成静态库然后再sort模块中的*.cpp调用calc模块生成的库即可&#xff08;这样就制作了一个静态库引用动态或者静态库&#xff09;test模块用于测试sort模块中的内容 . ├── calc │ ├── ad…

Codeforces Round 943 (Div. 3) 题解 缺F和G2

A题&#xff1a; Maximize? 题目大意&#xff1a; 给你一个整数 x&#xff0c; 要求你找出任意一个 y &#xff0c;。使得最大。 思路一&#xff1a;暴力 数据范围小&#xff0c;直接暴力。 #include <bits/stdc.h> #define int long long #define endl \n using n…

MySQL —— 库的基本操作

一、数据库的增删查改 &#xff08;1&#xff09;创建 语句&#xff1a;create database db_name;&#xff08;db_name是自定义的数据库名字&#xff09; &#xff08;2&#xff09;删除 语句&#xff1a;drop database dp_name;&#xff08;dp_name是要被删除的数据库的名字…

【智能算法】冠豪猪优化算法(CPO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2024年&#xff0c;M Abdel-Basset等人受到冠豪猪防御行为启发&#xff0c;提出了冠豪猪优化算法&#xff08;Crested Porcupine Optimizer, CPO&#xff09;。 2.算法原理 2.1算法思想 …

【Cpp】类和对象#构造函数 析构函数

标题&#xff1a;【Cpp】类和对象#构造函数 析构函数 水墨不写bug &#xff08;图片来源于网络&#xff09; 正文开始&#xff1a; &#xff08;一&#xff09;构造函数 构造函数是特殊的成员函数&#xff0c;需要注意的是&#xff0c;构造函数虽然名称叫构造&#xff0c;但…

区块链 | IPFS:Merkle DAG(进阶版)

&#x1f98a;原文&#xff1a;Merkle DAGs: Structuring Data for the Distributed Web &#x1f98a;写在前面&#xff1a;本文属于搬运博客&#xff0c;自己留存学习。 1 Merkle DAG 当我们在计算机上表示图时&#xff0c;必须通过提供节点和边的具体表示来编码我们的数据…

常用SQL命令

应用经常需要处理用户的数据&#xff0c;并将用户的数据保存到指定位置&#xff0c;数据库是常用的数据存储工具&#xff0c;数据库是结构化信息或数据的有序集合&#xff0c;几乎所有的关系数据库都使用 SQL 编程语言来查询、操作和定义数据&#xff0c;进行数据访问控制&…

yudao-cloud微服务系统系统模块+后台管理系统成功运行

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 系列文章目录 第一章 芋…

C语言之位操作符:<<、>>、、|、^、~,以及原码反码补码和例题详解

目录 前言 一、原码、反码、补码 二、移位操作符 三、位操作符&#xff1a;&、|、^、~ 四、经典例题分析&#xff1a; 总结 前言 本文将详细介绍C语言中左移操作符<<&#xff0c;右移操作符>>&#xff0c;按位与&&#xff0c;按位或|&#xff0c;按位异或^…

【Spring AI】09. ETL 管道

文章目录 ETL PipelineAPI 概述入门指南ETL 接口和实现DocumentReaderJsonReaderTextReaderPagePdfDocumentReaderParagraphPdfDocumentReaderTikaDocumentReader DocumentTransformerTextSplitterTokenTextSplitterContentFormatTransformerKeywordMetadataEnricherSummaryMet…

【通信中间件】Fdbus HelloWorld实例

Fdbus实例教程 Fdbus简介 Fdbus 全称 Fast Distributed Bus&#xff08;高速分布式总线&#xff09;&#xff0c;提供IPCRPC功能。适用于多种OS&#xff1a; LinuxQNXAnroidOSWindow Fdbus本质是Socket&#xff0c;IPC基于Unix domain socket&#xff0c;RPC基于TCP。使用G…

MathType打开的窗口太多 MathType说打开窗口太多无法复制怎么解决

在数学文档编辑中&#xff0c;MathType作为一款常用的数学公式编辑工具&#xff0c;使用过程中&#xff0c;我们常常会遇到一些问题&#xff0c;比如MathType打开的窗口过多导致软件运行缓慢甚至崩溃&#xff0c;以及在复制过程中出现“打开窗口太多&#xff0c;无法复制”的提…

241 基于matlab的Dijkstra算法进行路径规划

基于matlab的Dijkstra算法进行路径规划。可根据实际情况输入障碍物和起止点坐标信息&#xff1b; 输出避碰最短路径&#xff1b; 能够利用切线图算法对障碍物区域进行环境建模&#xff0c;设置障碍物的位置和区域。利用Dijkstra算法进行路径规划。程序已调通&#xff0c;可直接…

细说SVPWM原理及软件实现原理,关联PWM实现

细说SVPWM原理及软件实现原理&#xff0c;关联PWM实现 文章目录 细说SVPWM原理及软件实现原理&#xff0c;关联PWM实现1. 前言2. 基础控制原理回顾2.1 FOC 原理回顾2.2 细说 SVPWM2.2.1 矢量扇区计算2.2.2 矢量作用时间计算 2.2.3 如何理解 U4 U6 2/3Udc?2.2.4 如何理解 U4m…