C++多态性——(5)运算符重载(第二节)
归纳编程学习的感悟,
记录奋斗路上的点滴,
希望能帮到一样刻苦的你!
如有不足欢迎指正!
共同学习交流!
🌎欢迎各位→点赞 👍+ 收藏⭐ + 留言📝
身先才能率人,律己才能服人!
一起加油!
目录
一、运算符重载规则:
二、运算符重载为成员函数:
例:复数类乘法运算重载为类的成员函数 。
说明:
三、运算符重载为友元函数:
例:运算符重载为类的友元函数,实数与复数的加减运算。
一、运算符重载规则:
运算符重载规则说明如下。
- (1)运算符重载的实质是函数重载,可以对大部分的运算符进行重载,这是 C++的重要特C++编译器根据参数个数和类型来决定调用哪个函数重载,同一个运算符可以定义几个运算符重载函数来进行不同的操作。运算符重载返回类型可以是任意的,通常与操作数类型相同。
- (2)重载后的运算符所做的操作要尽量保持原来的意义,否则会降低程序的可读性。
- (3)C++中,用户不能定义新的运算符,只能对已有的运算符进行重载。有六个运算符不能重载:成员访问运算符“.”,成员指针运算符“->”和“*”,作用域运算符“::”,sizeof运算符和三目运算符“?:”
- (4)重载运算符与预定义运算符的使用方法完全相同,它不能改变原来运算符的参数个数也不能改变其优先级。
实现运算符重载是通过 operator 关键字实现的,运算符重载一般可以通过类的成员函数和类的友元函数来实现。
二、运算符重载为成员函数:
运算符重载为类的成员函数后,作为类的成员函数它可以任意访间类中的私有成员。在实际使用时,类中的成员函数总是通过该类的对象来访问的,如果是双目运算符,左操作数一定是访问成员函数的对象本身,另一个操作数通过运算符重载函数的参数表来传递;如果是单目运算符,操作数就是访问成员函数的对象本身,不需要再传递任何参数。
例:复数类乘法运算重载为类的成员函数 。
#include<iostream>
using namespace std;
class complex{private://私有接口 double real,image;public://公有接口 complex(double r=0.0,double i=0.0):real(r),image(i){ }~complex(){ }complex operator*(const complex& c)const;//定义两个复数乘法运算 complex operator*(const double& c)const;//定义复数与实数的乘法运算 void print()const;
};
void complex::print()const
{cout<<"("<<real<<","<<image<<")"<<endl;
}
complex complex::operator*(const complex& c)const
{return complex(real*c.real-image*c.image,real*c.image+image*c.real);
}
complex complex::operator*(const double& c)const
{return complex(real*c,image*c);
}
int main()
{complex c1(3,4),c2(7,8),c3;c3=c2*c1;cout<<"c2:";c2.print();cout<<"c1";c1.print();cout<<"c2*c1";c3.print();c3=c2*5.0;cout<<"c2*5.0";c3.print();return 0;
}
说明:
在本例中将复数的乘法重载为复数类的成员函数,由于复数可以与另一个复数进行乘法运算,也可以和另一个实数进行乘法运算,因此这里重载了两种形式。运算符重载为成员函数,除函数名称必须使用 operator<运算符>之外,其他与普通成员函数没有什么区别。在使用时可以采用成员函数调用的方式,也可以采用直接通过运算符对复杂操作数操作的方式。重载后的运算符原有的功能不受影响。因此,相同的运算符作用于不同的对象,就会导致不同的操作行为,从而体现了C++的多态性。
三、运算符重载为友元函数:
友元函数是类的“朋友”,它可以自由地访问类的所有成员。与重载为类的成员函数不同当运算符重载为类的友元函数时,由于友元是外部函数,不存在对象调用它,因此运算符所需要的操作数都需要通过函数的形参来传递,形参参数表中参数从左至右的顺序就是运算符操作数的顺序。
例:运算符重载为类的友元函数,实数与复数的加减运算。
#include<iostream>
using namespace std;
class complex{
private:double real,image;
public:complex(double r=0.0,double i=0.0):real(r),image(i){ }~complex(){ };friend complex operator+ (double c1, const complex & c2);friend complex operator-(double c1,const complex & c2);void print()const;
};
void complex::print()const
{cout<<"("<<real<<","<<image<<")"<<endl;
}
complex operator+ (double c1,const complex & c2)
{return complex(c1+c2.real, c2.image);
}complex operator- (double cl,const complex & c2)
{return complex(cl-c2.real,-c2.image);
}
int main()
{complex c1(3,4),c2;c2=4+c1;cout<<"4+";c1.print();cout<<"结果为:"; c2.print();c2=4-c1;cout<<"4-";c1.print();cout<<"结果为:";c2.print();return 0;
}
运算符重载的一般规律有如下几点。
- (1)运算符既可以重载为类的成员函数,也可以重载为类的友元函数。
- (2)对于双目运算符,重载为类的成员运算符函数,有一个参数,重载为类的友元运算符函数带有两个参数;对于单目运算符,重载为成员运算符函数不带参数,重载为类的友元运算符数带有一个参数。
- (3)目运算符一般可以被重载为友元运算符函数或成员运算符函数,如果第一个操作数是基本数据类型则必须使用友元:=、( )、[ ],只能重载为类的成员函数;+=、-+、/=、!=、~=、%=、>=、<= 建议重载为成员函数;其他双目运算符建议重载为友元函数。
以上就是我对C++多态性——(5)运算符重载(第二节)的理解,希望本篇文章对你有所帮助,也希望可以支持支持博主,后续博主也会定期更新学习记录,记录学习过程中的点点滴滴。如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对C++多态性的理解,请持续关注我哦!!!
相关文章:

C++多态性——(5)运算符重载(第二节)
归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言📝 身先才能率人,律己才能服人…...

ES -极客学习
Elasticsearch 简介及其发展历史 起源 Lucene 于 Java 语言开发的搜索引擎库类创建于 1999 年,2005 年成为 Apache 顶级开源项目Lucene 具有高性能、易扩展的优点Lucene 的局限性 只能基于 Java 语言开发类库的接口学习曲线陡峭原生并不支持水平扩展原生并不支持水…...

【大厂秘籍】系列 - Java多线程面试题
Java多线程面试题 友情提示,看完此文,在Java多线程这块,基本上可以吊打面试官了 线程和进程的区别 进程是资源分配的最小单位,线程是CPU调度的最小单位 线程是进程的子集,一个进程可以有很多线程,每条线…...
vue实现画笔回放,canvas转视频播放功能
示例图: 一、vue2版本 <template><div class"canvas-video"><canvasref"myCanvasByVideo"class"myCanvas"id"myCanvasByVideo":width"width":height"height"></canvas><d…...

Docker中镜像的相关操作
1.辅助操作 docker version:用查看docker客户端引擎和server端引擎版本信息。 docker info:用来查看docker引擎的详细信息。 docker --help:用来查看帮助信息。 2.镜像Image docker images:查看当前本地仓库中存在哪些镜像。 …...

[python]python利用pyaudio录制系统声音没有立体声混音怎么录制系统音频
当电脑没有立体声混音导致Python写代码无法使用pyaudio进行录制系统声音怎么办?查阅资料和安装驱动等方法都不行,难道没办法了吗?那为什么电脑其他软件可以做到呢?因此研究了一下pyaudio在没有立体声混音情况下确实无法录制声音&a…...

使用echarts的bmap配置项绘制区域轮廓遮罩
示例图 代码 <template><div id"map" style"width: 100%; height: 100vh"></div> </template><script> import * as echarts from "echarts"; import "echarts/extension/bmap/bmap"; export default…...
第3章 【课后习题】(完整版)
【3.18】写出下面程序的运行结果 //3.18写出下面程序的运行结果 #include <iostream> using namespace std; class test{public:test();~test() {};private:int i; }; test::test() {i25;for(int ctr0;ctr<10;ctr){cout<<"Counting at "<<ctr…...

redis安装与配置
目录 1. 切换到 root 用户 2. 搜索安装包 3. 安装 redis 4. 查看 redis 是否正常存在 5. 修改ip 6. 重新启动服务器 7. 连接服务器 1. 切换到 root 用户 通过 su 命令切换到 root 用户。 2. 搜索安装包 apt search redis 这里安装的是下面的版本: 3. 安装 …...
kotlin first/last/indexOf/elementAt
kotlin 中 first 是取集合元素中第一个元素 last 是取集合元素中最后一个元素 indexOf 根据元素寻找下标,默认是第一个 elementAt 根据下标找元素 下面写一个demo 说明下他们几个的使用 val list listOf("A", "D", "A", "…...
计算机网络——网络中要解决的问题
1. 从网络管理的角度看 1.1 配置管理 追踪所有部署的硬件和软件资源,包括设备配置和软件版本。 1.2 故障管理 监控设备的运行状态,以确保所有组件都正常工作,以及快速响应和修复任何故障。 1.3 计费管理 监控资源消耗并进行计费…...

初识STL
目录 💡STL 💡STL六大组件 💡三大组件介绍 💡容器 💡算法 💡迭代器 💡示例 💡STL C STL(标准模板库)是一套功能强大的 C 模板类,提供了…...

程序员副业之无人直播助眠
介绍和概览 大家好,我是小黑,本文给大家介绍一个比较轻松简单的副业,无人直播助眠副业。 这个项目的核心就是通过直播一些助眠素材来赚钱。比如你可以放一些舒缓的雨声之类的,吸引观众进来。然后,咱们可以挂个小程序…...

imazing破解版百度云2.17.3(附激活许可证下载)
iMazing是一款强大的 iOS 设备管理软件,不管是 iPhone、iPad 或 iPod Touch 设备,只要将 iOS 设备连接到计算机,就可以处理不同类型的数据。 iPhone 和 iPad 备份 借助 iMazing 的独有 iOS 备份技术(无线、隐私和自动)…...

VS+QT五子棋游戏开发
1、首先安装好VS软件和QT库,将其配置好,具体不在此展开说明。 2、文件结构如下图: 3、绘制棋盘代码,如下: void Qwzq::paintEvent(QPaintEvent* event) {QPainter painter(this);painter.setRenderHint(QPainter::An…...

SpringBoot中动态注册接口
1. 说明 接口注册,使用RequestMappingHandlerMapping来实现mybatis中动态执行sql使用github上的SqlMapper工具类实现 2. 核心代码片段 以下代码为spring动态注册接口代码示例 Autowired private RequestMappingHandlerMapping requestMappingHandlerMapping;publ…...

CSS 实现两个圆圈重叠部分颜色不同
这是期望实现的效果,由图可知,圆圈底图透明度是0.4,左侧要求重叠部分透明度是0.7,所以不能通过简单的透明度叠加来实现最右侧的效果。 这就需要另外新建一个图层来叠加在两个圆圈重叠上方。 直接看代码 .circle_hight {width: 1…...

【数据库系统概念】第7-14章集合
文章目录 第七章 数据库设计和E-R模型(重点!!!)~~7.1 设计过程概览(了解)~~7.1.1 设计阶段7.1.2 设计选择 7.2 实体-联系模型(重点掌握)7.2.1 实体集7.2.2 联系集联系集的…...

Kibana
Kibana是一个针对Elastic Search的开源分析及可视化的平台,使用kibana可以查询、查看并与存储在ES索引的数据进行交互操作,可以理解为一个客户端的工具,比如mysql和navicat。 使用kibana能执行高级的数据分析,并能以图表、表格和地…...

C#使用 OpenHardwareMonitor获取CPU或显卡温度、使用率、时钟频率相关方式
C# 去获取电脑相关的基础信息,还是需要借助 外部的库,我这边尝试了自己去实现它 网上有一些信息,但不太完整,都比较零碎,这边尽量将代码完整的去展示出来 OpenHardwareMonitor获取CPU的温度和频率需要管理员权限 在没…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...