重载运算与类型转换

基本概念:

运算符的重载是具有特殊名字的函数;他们的名字由关键字operator和其后要定义的运算符号共同组成。和其他函数一样,重载的匀速阿福也含有返回类型、参数列表以及函数体。重载运算符函数的参数数量和该运算符作用的运算对象数量一样多。,对于二元运算符来说,左侧运算对象传递给第一个参数,右侧运算对象传递给第二个参数。除了重载的函数调用运算符operat()之外,其他重载运算符不能含有默认实参。如果一个运算符函数是成员函数则它的第一个(左侧)运算对象绑定到隐式的this上指针上,因此,成员运算符函数的(显示)参数数量比运算符的运算对象总数少一个。对于一个重载的运算符函数来说,它或者是类的成员或者至少含有一个类类型的参数,这一约定意味着当运算符作用于内置类型的运算对象时,我们无法改变该运算符的含义。

重载运算符的运算对象数量、结合律、优先级、与对应的用于内置类型的运算符完全一致。

我们只能重载已有的运算符,而无权发明新的运算符号。大多数运算符(不是全部)都可以重载。

通常情况下不应该重载逗号、取地址、逻辑与、逻辑或运算符。

输入与输出运算符:

输出运算符应该尽量减少格式化操作,留给使用者更多可能性。

重载函数是定义在同一个类中的,如果在不同类中定义了同名函数,那么他们只是同名函数而不是重载函数。

输入运算符必须处理可能失败的情况,而输出运算符不需要。

算数与关系运算符:

如果类同时定义了算术运算符和相关的复合赋值运算符,则通常情况下应该使用复合赋值运算符来实现算术运算符,可读性更好。

赋值运算符:

我们可以重载赋值运算符,无论形参的类型是什么,赋值运算符都必须定义为成员函数,复合赋值运算符通常情况下也应该这样做,这两类运算符都应该返回左侧运算对象的引用。

下标运算符:

operator[ ]下标运算符必须是成员函数。

对于一个类包含下标运算符,它通常会定义两个版本:一个返回普通引用,另一个是类的常量成员并且返回常量引用。

递增与递减运算符:

定义递增和递减运算符的类应该同时定义前置和后置版本,这些运算符通常应该被定义成类的成员,为了与内置版本保持一致,前置运算符应该返回递增或者递减后对象的引用

想要同时定义前置和后置运算符,首先必须解决一个问题:即普通的重载形式无法区分这两种情况。前置和后置版本使用的是同一个符号,意味着其重载版本所用的名字将是相同的,并且运算对象的数量和类型也相同。为了解决这个问题,后置版本接受一个额外的(不被使用)int类型的形参。当我们使用后置运算符时,编译器为这个形参提供一个值为0的实参。尽管从语法上来说后置函数可以使用这个额外的形参,但是在实际过程中通常不会这么做。这个形参的唯一作用就是区分前置和后置版本的函数,而不是真的要在实现后置版本时参与运算。因为我们不是用到int,所以不需要为它命名。

同样,为了与内置版本的后置运算符保持一致,其应该返回对象的原值(递增或递减之前的值),返回的形式是一个值,而非引用,因为此对象的真实值已经发生变化。

成员访问运算符:

(->)箭头运算符必须是类的成员,解引用运算符通常也是类的成员,尽管并非必须如此。

对箭头运算符返回值的限定:和大多数运算符一样,我们能令operator*完成任何我们指定的操作,箭头运算符则不是这样,它永远不能丢掉成员访问这个最基本的含义。当我们重载箭头时,可以改变的是箭头从哪个对象中获取成员,而箭头箭头获取成员这一事实测永远不变。重载的箭头运算符必须返回类的指针或者自定义了箭头运算符的某个类的对象。

函数调用运算符:

如果类重载了函数调用运算符,则我们可以像使用函数一样使用该类的对象。因为这样的类同时也能存储状态,所以与普通函数相比他们更加灵活。函数调用运算符必须是成员函数。一个类可以定义多个不同版本的调用运算符,相互之间应该在参数数量或类型上有所区别。如果类定义了调用运算符,则该类的对象称作函数对象(function object)。因为也可以调用这种对象。

lambda是函数对象,当我们编写一个lambda后,编译器将该表达式翻译成一个未命名类的未命名对象。在lambda表达式产生的类中含有一个重载的函数调用运算符。

lambda在编译器方面:当一个lambda表达式通过引用捕获变量时,将由程序负责确保lambda执行时所引用的对象确实存在,因此编译器可以直接使用该引用而无需再lambda产生的类中将其存储为数据成员;相反,通过值捕获的变量被拷贝到lambda中,因此,这种lambda产生的类必须为每个值捕获的变量建立对应的数据成员,同时创建构造函数,令其使用捕获的变量的值来初始化数据成员。lambda表达式产生的类不含默认构造函数、赋值运算符、默认析构函数;他是否含有默认的拷贝/移动构造函数则通常要视捕获的数据成员类型而定。

C++语言有几种可调用的对象:函数、函数指针、lambda表达式、bind创建的对象以及重载了函数调用运算符的类。不同类型的可调用对象可能具有相同的调用对象。我们可以使用function标准库来存储相同调用形式的可调用对象。function有对应的一系列操作。我们不能直接将重载函数的名字存入function类型的对象中,会具有二义性,解决方法的途径有:存储函数指针而非函数的名字,使用lambda表达式。

重载。类型转换与运算符:

我们同样能定义对于类类型的类型转换,通过定义类型转换运算符可以做到这一点。转换构造函数和类型转换运算符共同定义了类类型转换(class-type conversions)这样的转换有时也被称作用户定义的类型转换。

如果定义了显示的类型转换运算符,编译器通常不会将一个显示的类型转换运算符用于隐式类型转换,该规定存在一个例外:即如果表达式被用作条件,则编译器会将现实的类型自动转换应用与它,即显示的类型转换将被隐式地执行。

当我们使用两个用户定义的类型转换时,如果转换函数之前或之后存在标准类型转换,则标准类型转换将决定最佳匹到底是哪个。

在调用重载函数时,如果需要额外的标准类型转换,则该转换的级别只有当所有可行函数都请求同一个用户定义的类型转换时才有用。如果所需的用户定义的类型转换不止一个,则该调用具有二义性。因为无法确定调用哪个类型转换。只有当仅存在一个类型转换时,我们才能进行下一步,根据标准类型转换的级别确定调用哪一个函数。

如果我们对同一个类既提供了转换目标是算数类型的类型转换,也提供了重载的运算符,则将会遇到重载运算符与内置运算符的二义性问题。因为在一条有该类对象和算数类型的表达式中,无法确定是将该类对象转换成算数类型函数还是将算数类型转换成该类类型的对象。

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

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

相关文章

PUBG绝地求生更新后无法启动/更新后卡顿?3个解决方法分享

在绝地求生中,团队协作也是非常重要的一点。咱们可以运用strong标签来着重“团队协作”。与队友紧密配合、彼此援助,一起拟定战术和战略,将会大大提高在游戏中获得成功的几率。在绝地求生中获得成功并不简单,但只需咱们把握了一些…

linux的io的知识大全

C语言的io操作 写文件 #include<stdio.h> #include<string.h>#define FILE_NAME "log.txt" int main() {FILE * fp fopen(FILE_NAME, "w");if(fpNULL){printf("fopen error!\n");}const char* msg "hello zk\n";int c…

JS rgb,hex颜色值转换

颜色值转化 rgb颜色值转换为hex颜色值&#xff08;rgb>hex&#xff09; hex颜色值转换为rgb颜色值&#xff08;hex>rgb&#xff09; 代码&#xff1a; const hex2Rgb (hex) > {return rgb(${parseInt(hex.slice(1, 3), 16)},${parseInt(hex.slice(3, 5), 16)},${p…

北邮通报学生联名举报导师事件,导师PUA学生,学生只有压榨它

诸葛亮为激司马懿出战&#xff0c;派使者送给他女人的衣服&#xff0c;司马懿欣然接受后问使者&#xff1a;“你们家丞相都管些什么呀&#xff1f;” 使者回答道&#xff1a;“我们丞相从行军布阵到饮食起居&#xff0c;无一不亲自过问。” 司马懿听到心中大喜&#xff0c;心想…

【ARM Coresight SOC-600 -- ETF Flushin无法接收到 CTI 发出 triggerout 信号问题分析】

请阅读【嵌入式开发必备专栏 】 文章目录 问题背景波形分析问题背景 在做验证的时候,准备通过 CTI2 给 SOC 上的 ETF 触发一个 flushin 动作,然后stop住 formatter,结果一致发现没有成功,接下来就是分析的过程了。 首先检查了代码,没有发现代码有什么问题(一般自己写的代…

学习大数据,所需要的java(Maven)基础(1)

文章目录 使用Maven的优势第三方jar包添加第三方jar包获取jar包之间的依赖关系jar包之间的冲突处理将项目拆分成多个工程模块 实现项目的分布式部署Maven是什么自动化构建工具构建的概念构建环节自动化构建 Maven如何使用安装Maven核心程序maven联网问题Maven中的settings配置在…

Linux下批量的批量操作

批量删除docker 镜像 docker images | grep ent-form-web |awk ‘{print $3}’ | xargs docker rmi docker images: 列出所有的docker 镜像 docker images | grep ent-form-web : 选取出结果带 ent-form-web的信息 docker images | grep ent-form-web |awk ‘{print $3}’ 选取…

为什么在学校很难真正学好嵌入式?

10几年前,我是读电气工程专业,学了很多东西,结构,电机、绘图,plc等等.. 其实,都没什么鸟用,出来还是像个废物。 后面我自学转了单片机开发,说句难听点,自己买个开发板都比在学校学得深。 可能是这个专业的问题,主攻不是嵌入式方向,老师用汇编点个流水灯,这门课就…

SpringBoot集成JWT

一、 背景 项目需要&#xff0c;自己编写登录和身份校验&#xff0c;于是采用了JWT的方式。 二、实现步骤 2.1 引入JWT组件 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version&…

CMake学习笔记(三)区分macro与function

目录 共同点--形式类似 macro的形式 function的形式 不同点 1 输入参数的替换阶段不同 macro function 2 输入参数作用域不同 macro function 共同点--形式类似 macro的形式 macro(宏名 输入参数名).... endmacro() function的形式 function(函数名 输入参数名).…

积分学<3>——定积分的详细定义与可积条件

索引 定积分的详细定义与可积条件Riemann可积定义3.1 Riemann和定义3.2 Riemann可积 定积分定义定义3.3 定积分 定积分定义的扩展定义3.4 Darboux上(下)和引理3.1引理3.2定理3.1 Darboux定理定理3.2 定积分的详细定义与可积条件 Riemann可积 定义3.1 Riemann和 若函数 f ( x…

20232831 2023-2024-2 《网络攻防实践》第5次作业

目录 20232831 2023-2024-2 《网络攻防实践》第5次作业1.实验内容&#xff08;1&#xff09;防火墙配置&#xff08;具体IP配置参考自己的IP设置&#xff09;&#xff08;2&#xff09;动手实践&#xff1a;Snort&#xff08;3&#xff09;分析配置规则 2.实验过程3.学习中遇到…

基于小程序实现的校园失物招领系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

渗透测试概述

渗透测试概述 渗透测试&#xff0c;又称入侵测试或黑盒测试&#xff0c;是一种通过模拟黑客攻击行为来评估计算机系统安全性的方法。其目的在于发现系统中的潜在漏洞&#xff0c;并评估这些漏洞可能带来的风险&#xff0c;从而为系统管理员和安全团队提供改进建议。渗透测试通…

第十二天--二维数组的彻底解刨--地址

1.二维数组我们用父子的地址来称呼二维数组的地址 比如arr[3][4] 这里的arr是二维数组的首地址&#xff0c;也是父数组的首地址&#xff0c;也是子数组的首地址 arr1父数组的地址偏移1&#xff0c;实际上是偏移了4*416个字节 arr[0]是子数组的首地址&#xff0c;arr[0]1是子数…

langchain txt 文档加载,分割

stuff 策略 加载 arXiv 论文&#xff0c;让模型总结前 2000 字 这里采用的是 stuff 策略&#xff0c;也就是将一大段文本。按字数分割成 N 个文本块&#xff0c;又合并成一个大的文本块。 对超大规模不友好&#xff0c;没有区分文档重要性&#xff0c;适合文档量较少场景 i…

安卓刷机fastboot分段传输

win10 fastboot 无法识别&#xff0c;驱动下载地址GitHub - xushuan/google_latest_usb_driver_windows 把inf文件更新到设备管理器驱动更新即可 问题 archive does not contain super_empty.img Sending vbmeta_a (4 KB) OKAY [ 0.117s] Writing …

Springboot项目的测试类书写(速通)

目录 前言1. 单元测试的测试类2. 框架测试的测试类 前言 在实际开发中&#xff0c;如果只是做一个简单的单元测试&#xff08;不涉及端到端、数据库交互、API调用、消息队列处理等&#xff09;&#xff0c;我为了方便一般都是找块儿地方写一个main方法来跑一下就行了&#xff…

Redis中的集群(六)

集群 ASK错误 在进行重新分片期间&#xff0c;源节点向目标节点迁移一个槽的过程中&#xff0c;可能会出现这样一种情况:属于被迁移槽的一部分键值对保存在源节点里面&#xff0c;而另一部分键值对则保存在目标节点里面。当客户端向源节点发送一个与数据库有关的命令&#xf…

std::vector的核心框架接口的模拟实现bit::vector

std::vector的核心框架接口的模拟实现bit::vector #pragma once #include<iostream> #include<assert.h> #include<string> #include<algorithm> #include<vector>using std::cout; using std::endl;namespace bit {template<class T>cla…