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++多态性的理解,请持续关注我哦!!! 

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

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

相关文章

【SpringBoot】公共字段自动填充功能实现(枚举、自定义注解、AOP、反射)

1. 自定义注解 使用interface语法来定义注解&#xff08;Annotation&#xff09;。 注解的参数类似无参数方法&#xff0c;可以用default设定一个默认值&#xff0c;比如String value() default "";。 元注解&#xff1a;有一些注解可以修饰其他注解&#xff0c;这…

基础面试题整理2

1.抽象类与接口区别 语法&#xff1a; 抽象类用abstract定义&#xff1b;接口用interface定义抽象类被子类继承extends&#xff08;不可用final修饰&#xff09;&#xff1b;接口被类实现implements抽象类的属性访问无限制,方法不可用private修饰&#xff1b;接口中的方法只能…

【STM32】STM32学习笔记-DMA数据转运+AD多通道(24)

00. 目录 文章目录 00. 目录01. DMA简介02. DMA相关API2.1 DMA_Init2.2 DMA_InitTypeDef2.3 DMA_Cmd2.4 DMA_SetCurrDataCounter2.5 DMA_GetFlagStatus2.6 DMA_ClearFlag 03. DMA数据单通道接线图04. DMA数据单通道示例05. DMA数据多通道接线图06. DMA数据多通道示例一07. DMA数…

计算机网络(2)

计算机网络&#xff08;2&#xff09; 小程一言专栏链接: [link](http://t.csdnimg.cn/ZUTXU) 计算机网络和因特网&#xff08;2&#xff09;分组交换网中的时延、丢包和吞吐量时延丢包吞吐量总结 协议层次及其服务模型模型类型OSI模型分析TCP/IP模型分析 追溯历史 小程一言 我…

数据结构——堆排序

什么是堆排序 堆排序就是利用堆&#xff08;假设利用大堆&#xff09;进行排序的算法。他的基本思想是&#xff0c;将待排序的序列构造成一个大顶堆。此时&#xff0c;整个序列的最大值就是堆顶的根节点。将他移走&#xff08;其实就是将其与堆数组的末尾元素交换&#xff0c;…

简单 Web Server 程序的设计与实现 (2024)

1.题目描述 Web 服务是 Internet 最方便与受用户欢迎的服务类型&#xff0c;它的影响力也远远超出了专业技术范畴&#xff0c; 已广泛应用于电子商务、远程教育、远程医疗与信息服务等领域&#xff0c;并且有继续扩大的趋势。目前很多 的 Internet 应用都是基于 Web 技术的&…

Java快速排序希尔排序归并排序

快速排序算法 快速排序的原理&#xff1a;选择一个关键值作为基准值。比基准值小的都在左边序列&#xff08;一般是无序的&#xff09;&#xff0c;比基准值大的都在右边&#xff08;一般是无序的&#xff09;。一般选择序列的第一个元素。 一次循环&#xff1a;从后往前比较&…

VMware中删除虚拟机

虚拟机使用完成后&#xff0c;需要删除虚拟机如何操作呢&#xff1f; 1.首先进入VMware 2.选择需要删除的虚拟机&#xff0c;点击右键 3.直接选择“移除”&#xff1f; 当然不是&#xff0c;这只是从这么目录显示中去掉了&#xff0c;并非 “真正” 删除该虚拟机 注意&#x…

使用sentinel作为熔断器

什么是sentinel Sentinel&#xff0c;中文翻译为哨兵&#xff0c;是为微服务提供流量控制、熔断降级的功能&#xff0c;它和Hystrix提供的功能一样&#xff0c;可以有效的解决微服务调用产生的“雪崩”效应&#xff0c;为微服务系统提供了稳定性的解决方案。随着Hytrxi进入了维…

labelme的json转mask,实测有效

1、创建一个conda的虚拟环境 conda creat -n labelme python3.82、转到你的标注文件夹&#xff08;包括json和图片&#xff09; cd C:/Users/Administrator/Desktop/json3、你需要在标注文件夹下用txt写下以下代码&#xff0c;并保存bat文件。 放在最后一个就可以了 echo of…

Python的核心知识点整理大全66(已完结撒花)

目录 D.3 忽略文件 .gitignore 注意 D.4 初始化仓库 D.5 检查状态 D.6 将文件加入到仓库中 D.7 执行提交 D.8 查看提交历史 D.9 第二次提交 hello_world.py D.10 撤销修改 hello_world.py 注意 D.11 检出以前的提交 往期快速传送门&#x1f446;&#xff08;在文…

微服务实战系列之Filter

前言 Filter&#xff0c;又名过滤器&#xff0c;当然不是我们日常中见到的&#xff0c;诸如此类构件&#xff1a; 而应该是微服务中常使用的&#xff0c;诸如此类&#xff08;图片来自官网&#xff0c;点击可查看原图&#xff09;&#xff1a; 一般用于字符编码转换&#xf…

MySQL--基础篇

这里写目录标题 总览MySQl各个阶段基础篇总览 MySQL概述数据库相关概念查看本机MySQL版本号启停mysql打开windows服务管理windows命令行启停 连接mysql客户端mysql运行逻辑数据模型关系型数据库 总结 SQL总览SQL通用语法SQL语句分类DDL数据库操作表操作查询表创建表结构数据类型…

【Web开发】会话管理与无 Cookie 环境下的实现策略

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; Web开发 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 问题&#xff1a; 思路&#xff1a; 方法&#xff1a; 结语 我的其他博客 前言 在当今Web应用程序中&#xff0c;会话…

C语言-第十八周做题总结-数组3

id:454 A.字符串逆序 题目描述 输入一个字符串&#xff0c;对该字符串进行逆序&#xff0c;输出逆序后的字符串。 输入 输入在一行中给出一个不超过80个字符长度的、以回车结束的非空字符串。 输出 在一行中输出逆序后的字符串。 输入样例 输出样例 题解 先用一个while…

gRCP - 面向未来的第二代 RPC 技术,解析 HTTP2.0 和 Protobuf

目录 一、gRCP - 面向未来的第二代 RPC 技术 1.1、gRPC 简介 1.1.1、gRPC 是个啥&#xff1f; 1.1.2、gRPC 核心设计思路 1.1.3、gRPC 和 ThriftRPC 区别 1.1.4、为什么使用 gRPC&#xff1f;&#xff08;好处&#xff09; 1.2、HTTP2.0 协议 1.2.1、回顾 HTTP1.0 和 H…

C# Entity Framework 中不同的数据的加载方式

延迟加载 延迟加载是指在访问导航属性时&#xff0c;Entity Framework 会自动查询数据库并加载相关数据。这种方式在我们需要访问导航属性时比较方便&#xff0c;因为我们无需手动加载相关数据&#xff0c;而且只会在需要时才会进行查询&#xff0c;从而减少了不必要的开销。但…

基于商品列表的拖拽排序后端实现

目录 一&#xff1a;实现思路 二&#xff1a;实现步骤 二&#xff1a;实现代码 三&#xff1a;注意点 一&#xff1a;实现思路 后台实现拖拽排序通常需要与前端进行配合&#xff0c;对商品的列表拖拽排序&#xff0c;前端需要告诉后端拖拽的元素和拖动的位置。 这里我们假…

【远程计算机,这可能是由于 Credssp 加客数据库修正】解决方案

1、winR打开运行窗口 输入gpedit.msc命令&#xff0c;若找不到&#xff0c;可以进行如下文件编辑格式为cmd echo offpushd "%~dp0"dir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtensions-Package~3*.mum >List.txtdir /b C:\Win…

Linux stm32串口下载程序

一、工具 使用stm32flash进行串口下载 二、stm32flash安装 sudo apt-get install stm32flash 三、查看串口设备名称 先拔掉串口运行下面指令&#xff0c;获得所有设备名称,插上串口再运行一次&#xff0c;新增的就是串口设备名称&#xff0c;记住串口设备名称&#xff0c;以…