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++ 多态性——运算符重载
**多态是指同样的消息被不同类型的对象接收时导致不同的行为。**所谓的消息是指对类的成员函数的调用,不同的行为是指不同的实现,也就是调用了不同的函数。 使用同样的“”,就实现了整数之间、浮点数之间、双精度浮点数之间的加法࿰…...
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 数据库管理系统普遍应用于各种信息系统应用软件的开发之中,而角色与权限设计不仅关乎数据库中数据保密性的性能高低,也关系到用户使用数据库的最低要求。在对数据库的安全性进行设计时…...
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种图ÿ…...
【STM32零基础入门教程03】GPIO输入输出之GPIO框图分析
本章节主要讲解点亮LED的基本原理,以及GPIO框图的讲解。 如何点亮LED(输出) 首先我们查看原理图,观察电路图中LED的连接情况,如下图可以看出我们的板子中LED一端通过限流电阻连接的PB0另一端连接的是高电平VCC…...
高效管理,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 轻松地扩展到多个主机。 支持的工具包括但不限…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
