当前位置: 首页 > news >正文

C++ 多态性——运算符重载

**多态是指同样的消息被不同类型的对象接收时导致不同的行为。**所谓的消息是指对类的成员函数的调用,不同的行为是指不同的实现,也就是调用了不同的函数。

使用同样的“+”,就实现了整数之间、浮点数之间、双精度浮点数之间的加法,以及这几种数据类型混合的加法运算。在这里,同样的消息——相加,被不同类型的对象——变量接收后,不同类型的变量采用不同的方式进行加法运算。如果时不同类型的变量相加,例如浮点数和整型数相加,需先将整型数转换为浮点数,然后再进行加法运算,这就是典型的多态现象。

多态的类型

面向对象的多态性分为4类:重载多态、强制多态、包含多态和参数多态。重载多态和强制多态称为专用多态,包含多态和参数多态称为通用多态。
(1)普通函数及类的成员函数的重载属于重载多态,浮点数之间、整型数之间的加法运算也属于重载多态。
(2)强制多态是指将一个变元的类型加以变化,以符合一个函数或操作的要求,比如加法运算符在进行浮点数与整型数之间的相加时,首先进行类型强制转换,把整型数变为浮点数之后再相加的情况,就是强制多态。
(3)包含多态是类族中定义于不同类中的同名成员函数的多态行为,主要是通过虚函数来实现。
(4)参数多态与类模板相关联,在使用时,必须赋予实际的类型才可以实例化。这样由类模板实例化的各个类都具有相同的操作,而操作对象的类型却不同。

多态的实现

多态从实现的角度分为两类:编译时多态和运行时多态。

编译时的多态,是在编译过程中确定了同名操作的具体操作对象,而运行时的多态是在程序运行过程中才动态地确定操作所针对的具体对象。这种确定操作所针对的具体对象的过程就是绑定绑定是指计算机程序自身彼此关联的过程,也就是把一个标识符名和一个存储地址联系在一起的过程,就是把一条消息和一个对象的方法相结合的过程。

按照绑定进行的阶段的不同,绑定分为:静态绑定和动态绑定。这两种绑定分别对应着多态的两种实现方式编译时多态和运行时多态。

静态绑定:绑定工作在编译连接阶段完成的情况。
动态绑定:绑定工作在程序运行阶段完成的情况。

运算符重载

C++中预定义的运算符的操作对象只能是基本数据类型。实际上对于很多用户自定义类型(比如说类),也需要有类似的运算操作。

例如,下面的程序定义了一个复数类:

class Complex
{
public:Complex(double r = 0.0, double i = 0.0) :real(r), imag(i){}void show()const;
private:double real;double imag;
};

于是可以这样声明复数类对象:

Complex a(10,20),b(5,8);

接下来如果对a和b进行加法运算,写出表达式“a+b”,这时编译出错,因为编译器不知道如何完成这个加法运算。这时候就需要自己编写程序来说明“+”在作用于Complex对象时,该实现什么功能,这就是运算符重载。

运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据时导致的不同的行为。

1.运算符重载的实质就是函数重载

比如说整型类型的两个数相加:

int a=2,b=3;
int c;
c=a+b;

上述代码中的c=a+b;就相当于

c=a.+(b);

或者

c=+(a,b);

在实现过程中,先把指定的表达式转换为对运算符函数的调用,将运算对象转换成运算符函数的实参,然后根据实参类型来确定需要调用的函数,这个过程是在编译过程中完成的。

2.运算符重载的规则

(1)规则如下:
①C++中的运算符除了少数几个之外,全部可以重载,而且只能重载C++中已经有的运算符。
②重载之后运算符的优先级和结合性都不改变。
③运算符重载是针对新类型数据的实际需要,对原有运算符进行适当的改造。一般来讲,重载的功能应当与原有的功能相类似,不能改变原运算符的操作对象的个数,同时至少有一个操作对象是自定义。

C++标准规定,有些操作符不可以重载,它们是类属关系运算符“.”、成员指针运算符“.*”、作用域分辨符“::”和三目运算符“?:”。
类属关系运算符“.”和成员指针运算符“.*”保证了C++中访问成员功能的含义不被改变。作用域分辨符的操作数是类型,而不是普通的表达式,也不具备重载特征。

(2)运算符重载的形式:
①重载为类的非静态成员函数
②重载为非成员函数。

运算符重载为类的非静态成员函数的一般语法形式:

返回类型 operator运算符(形参表)
{函数体
}

运算符重载非成员函数的一般语法形式:

返回类型 operator运算符(形参表)
{函数体
}

返回类型指定了重载运算符的返回值类型,也就是运算结果类型;operator是定义运算符重载函数的关键字;运算符是要重载的运算符名称,必须是C++中可重载的运算符,比如要重载加法运算符,这里就写“+”;形参表中给出重载运算符所需要的参数和类型。

【注意】当以非成员函数形式进行重载运算符时,有时需要访问运算符参数所涉及类的私有成员,这时可以把该函数声明为类的友元函数。

当运算符重载为类的成员函数时,函数的参数个数比原来的操作数个数要少一个(后置“++”,“–”除外);当重载为非成员函数时,参数个数与原操作数个数相同。这两种情况的参数个数有所差异的原因是,重载为类的成员函数时,第一个操作数会被作为函数调用的目的对象,因此无须出现在参数表中,在函数体中可以直接访问第一个操作数的成员;而重载非成员函数时,运算符的所有操作数必须显式通过参数传递。

(3)运算符重载的优点
可以改变现有运算符的操作方式,以用于类类型,使得程序看起来更加直观

相关文章:

C++ 多态性——运算符重载

**多态是指同样的消息被不同类型的对象接收时导致不同的行为。**所谓的消息是指对类的成员函数的调用,不同的行为是指不同的实现,也就是调用了不同的函数。 使用同样的“”,就实现了整数之间、浮点数之间、双精度浮点数之间的加法&#xff0…...

Java设计模式---工厂方法(Factory Method)模式

说明 工厂方法(Factory Method)模式是一种工厂模式,也叫多态性工厂(Poloymorphic Factory)模式。 工厂方法模式涉及如下角色: 抽象工厂角色:给出具体工厂角色必须实现的接口。具体工厂角色&a…...

MySQL的关键指标及采集方法

MySQL 是个服务,所以我们可以借用 Google 四个黄金指标的思路来解决问题。 1、延迟 应用程序会向 MySQL 发起 SELECT、UPDATE 等操作,处理这些请求花费了多久,是非常关键的,甚至我们还想知道具体是哪个 SQL 最慢,这样…...

协程怎么解释?Python 中的协程如何实现?Celery 的协程并发引擎如何实现?

文章目录 1. 协程怎么解释?2. 为什么叫协程?3. coroutine 怎么读?4. asyncio 和 gevent 怎么实现协程?4. celery 并发引擎是什么?如何改为协程?5. 一个 celery 服务是否可以同时使用多个不同的引擎? 1. 协…...

Linux:shell脚本:基础使用(2)

test命令 格式1:test 条件表达式 格式2:[ 条件表达式 ] (前后至少应有一个空格) 常用的测试操作符 -d:测试是否为目录(Directory) -e:测试目录或文件是否存在(Exist) -f:测试是否…...

Mir 2.14 正式发布,Ubuntu 使用的 Linux 显示服务器

Canonical 公司最近发布了 Mir 2.14,这是该项目的最新版本。 Mir 2.14 在 Wayland 方面通过 ext-session-lock-v1 协议增加了对屏幕锁定器 (screen lockers) 的支持,并最终支持 Wayland 拖放。此外还整合了渲染平台的实现,放弃了之前在 Raspb…...

合规管理,企业生存之本!这4大方法,助你规避风险

当下,合规管理已成为企业必修的一门学问。无论是上市公司还是民营企业,都面临着日益严苛的监管合规要求。然而,许多企业在在应对频繁更新的合规要求时,仍然手忙脚乱,合规工作参差不齐。 专家分析认为,企业合规困境的主要症结在于,业务运转过程中产生了大量证明文件,但企业对其…...

码云 Gitee + Jenkins 配置教程

安装jdk 安装maven 安装Jenkins https://blog.csdn.net/minihuabei/article/details/132151292?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22132151292%22%2C%22source%22%3A%22minihuabei%22%7D 插件安装 前往 Manage Jen…...

Java重启

Java启动! 前言祖师爷高斯林老爷子冯诺依曼 注释单行注释多行注释文档注释 标识符***【硬性规则】******【软性建议】*** 关键字结尾 前言 其实我在写这篇文章的时候已经完整地学过一遍Java校招需要掌握的大部分知识了,但是在最近找实习的过程中,我发现自己对于一些只是还是模…...

ReactNative 学习笔记

学习使用的开发工具 编译器 VSCode 开发语言工具 TypeScript 重要程度分类 一般 这个程度的知识点主要是达到熟练掌握即可,不用太深入研究和学习。 重要 这个程度的知识点主要是达到熟练掌握,并且内部的原理切要熟记,因为会关联到其他的知…...

小研究 - MySQL 数据库下存储过程的综合运用研究

信息系统工程领域对数据安全的要求比较高,MySQL 数据库管理系统普遍应用于各种信息系统应用软件的开发之中,而角色与权限设计不仅关乎数据库中数据保密性的性能高低,也关系到用户使用数据库的最低要求。在对数据库的安全性进行设计时&#xf…...

CentOS 7 构建 LVS-DR 群集 nginx负载均衡

1、基于 CentOS 7 构建 LVS-DR 群集。 DS(Director Server):DIP 192.168.231.132 & VIP 192.168.231.200 [root132 ~]# nmcli c show NAME UUID TYPE DEVICE ens33 c89f4a1a-d61b-4f24-a260…...

ESP32学习笔记(52)————三轴加速度ADXL345使用(SPI方式)

一、简介 ADXL345 是一款 ADI 公司推出的基于 iMEMS 技术的超低功耗3轴加速度计,分辨率高(13位),测量范围达 16g。数字输出数据为 16 位二进制补码格式,可通过 SPI(3线或4线) 或 I2C 数字接口访问。ADXL345 非常适合移动设备应用。它可以在倾…...

Camunda 7.x 系列【4】 Camunda Modeler 功能介绍

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 2.7.9 本系列Camunda 版本 7.19.0 源码地址:https://gitee.com/pearl-organization/camunda-study-demo 文章目录 1. 下载安装2. 功能介绍2.1 欢迎界面2.2 工具栏2.3 小地图2.4 流程配置2.5 小工具栏2.6 启动…...

呼叫中心系统管理和优化的关键指标

呼叫中心系统是企业客户服务的重要组成部分,通过电话、邮件、社交媒体等渠道与客户进行沟通和交互。如何管理和优化呼叫中心系统,提高客户满意度和工作效率,是每个企业都需要关注和解决的问题。以下是呼叫中心系统管理和优化的关键指标。 1. …...

UML箭头汇总

参考:http://www.cnblogs.com/damsoft/archive/2016/10/24/5993602.html 1.UML简介 Unified Modeling Language (UML)又称统一建模语言或标准建模语言。 简单说就是以图形方式表现模型,根据不同模型进行分类,在UML 2.0中有13种图&#xff…...

【STM32零基础入门教程03】GPIO输入输出之GPIO框图分析

本章节主要讲解点亮LED的基本原理,以及GPIO框图的讲解。 如何点亮LED(输出) 首先我们查看原理图,观察电路图中LED的连接情况,如下图可以看出我们的板子中LED一端通过限流电阻连接的PB0另一端连接的是高电平VCC&#xf…...

高效管理,PDM系统与BOM系统携手合作

在现代制造业中,PDM系统(Product Data Management,产品数据管理)和BOM系统(Bill of Materials,物料清单管理)都扮演着关键的角色。PDM系统负责产品数据的统一管理,而BOM系统则专注于…...

Elasticsearch 使用scroll滚动技术实现大数据量搜索、深度分页问题 和 search

基于scroll滚动技术实现大数据量搜索 如果一次性要查出来比如10万条数据,那么性能会很差,此时一般会采取用scroll滚动查询,一批一批的查,直到所有数据都查询完为止。 scroll搜索会在第一次搜索的时候,保存一个当时的视…...

了解Swarm 集群管理

Swarm 集群管理 简介 Docker Swarm 是 Docker 的集群管理工具。它将 Docker 主机池转变为单个虚拟 Docker 主机。 Docker Swarm 提供了标准的 Docker API,所有任何已经与 Docker 守护程序通信的工具都可以使用 Swarm 轻松地扩展到多个主机。 支持的工具包括但不限…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...

ios苹果系统,js 滑动屏幕、锚定无效

现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...

C# winform教程(二)----checkbox

一、作用 提供一个用户选择或者不选的状态,这是一个可以多选的控件。 二、属性 其实功能大差不差,除了特殊的几个外,与button基本相同,所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...

UE5 音效系统

一.音效管理 音乐一般都是WAV,创建一个背景音乐类SoudClass,一个音效类SoundClass。所有的音乐都分为这两个类。再创建一个总音乐类,将上述两个作为它的子类。 接着我们创建一个音乐混合类SoundMix,将上述三个类翻入其中,通过它管理每个音乐…...

Linux入门课的思维导图

耗时两周,终于把慕课网上的Linux的基础入门课实操、总结完了! 第一次以Blog的形式做学习记录,过程很有意思,但也很耗时。 课程时长5h,涉及到很多专有名词,要去逐个查找,以前接触过的概念因为时…...