C++——类和对象(3)
作者:几冬雪来
时间:2023年5月6日
内容:C++类和对象内容讲解
目录
前言:
1.运算符重载(续):
2.赋值重载:
结尾:
前言:
在上一篇博客中我们再一次讲解了类和对象的内容,并且引入了一个新的重载模式——运算符重载,那么今天我们就接着对其进行说明。

1.运算符重载(续):
在上一篇博客中我们讲解了一个日期类运算符重载的实现,也得知了运算符重载的话,如果是内置类型的话我们可以不进行书写,如果是自定义类型的话,我们就要对其进行书写。
我们也进行了日期的比较。
但是并不是所以运算符都是有意义的。
还是以我们的日期类函数为例:
比如:日期减日期可以算出我们两个日期间隔的天数,它是有意义的;但是在这里日期加日期就是没有意义的行为了。
而是否要重载运算符,取决于这个这个运算符对类有无意义。

类似我们这个代码,这两种写法从底层来讲是一样的。
因此在编译器来看,我们的第一个代码等价与第二个代码,在过程中我们的第一个代码就转换为第二个代码的指令。
但是这个代码是在类的外面的,因此我们无法去访问私有和保护。
在这里我们有两种方案,一种是友元这是我们后面才需要学习的知识,另一种方法则是将其放进类中。

但是在这里我们将代码放入类中的时候,代码报错了,这是因为在运算符重载的时候我们C++中有所规定。
在类中,作为类成员函数重载的时候,其形参看起来比操作数数目少1,因为在类中成员函数的第一个参数为隐藏的this。
且必须有一个参数为类类型,也就是自定义类型。
像这种两个都是内置类型的就会发生报错,因此至少要有一个自定义类型的。
操作符有几个操作数,重载就有几个参数。
因此我们的代码要进行修改。

而在我们学到现在的所有的运算符中,有五个运算符不能进行重载操作。

这个知识点一般会出现在选择题当中。
2.赋值重载:
接下来我们来讲解赋值重载。

首先在这里我们就要区分一下这两种情况,一种是两个对象都存在,一种是对另一个对象进行初始化的操作。

在这里我们也可以轻而易举的写出我们的代码,但是像这种代码的话有一个不足的点。

在我们的编译器中,我们可以在C语言和C++中写出这种赋值的代码。
这里的赋值顺序是从右到左进行赋值。
但是在我们上面的赋值重载中,因为我们并没有返回值为void。
因此在进行了第一次重载之后,我们就没有办法顺利的进行第二次重载了。

因此我们的代码要修改成这个样子,返回的是this指针,又因为节省空间因此在这里我们还要对其进行引用的操作。
这样我们就是返回的就是d4的一个别名了,同时也不用担心出作用域销毁的事情。

因为我们的赋值重载和拷贝构造一样,所以我们可以让编译器自己帮我们创建。
如果是栈的话,就需要我们自己去创建。
这里还要了解的一个点是:
赋值运算符只能重载类型成员不能重载全局函数。
默认成员函数不能写到全局。
同时我们的声明和定义也可以进行分离。

这里就是我们的日期类小于形的代码的声明和定义的分离。
但是我们的日期类可用的操作符远不止小于这一个操作符。
类似大于,减号,等于等操作符都可以用在日期类中。
我们这里可以像上面的代码一样各自书写一个大于,等于的代码出来。但是这样做的话就增加了代码的数量,减少了可读性。在这里我们还有什么其他的方法吗?

像这里我们先写一个==类型的重载,然后下来的代码就进行一个另一种方法的书写,如我们上面的代码一样。
这样就能简单的写出我们日期类的各种比较。
同时日期加天数和日期减日期也可以通过这种方式来完成。

要执行上面操作的话,我们首先就要算出每个月的天数。
这个操作我们写过很多次,这里就不再重复了。

再下来我们就只需要书写它的代码即可。
在这里我们如果使用的是引用的话,最后会提防因为销毁的原因出现问题,因此在这里我们采用的是这一种写法。
构造函数也是为了防止其销毁。
而且我们也可以由我们的+来引入+=的代码。

像上面左右的代码都是正确的,不过二者相对比左边的代码要更优一点。
这是因为左边的代码只需要创建两个对象,而右边的这种却要四个,+=的有一些亏。
同时我们的日期类还是其他的操作符可以对其使用。
类似我们的日期可以进行++操作。
只不过我们的++是单运算符。

但是众所周知在C语言中我们的++操作符分为了前置和后置。
因此在这里我们的代码到底是调用的哪一个?

用我们以前的知识来讲解。
前置++是返回++后的值,后置++是返回++前的值。
虽然它们的内部都要进行++操作,所以不能用同一个运算符重载替代。

为此,我们为后置++中的参数提供了int。
增加这个int并不是为了接收具体的值,这仅仅是为了占位,根前置++构成重载。
因为后置++需要进行创建对象,我们就将其牺牲掉了。

同时,前置++和后置++,在底层所代表的也不相同。
在这里我们可以看见,后置++我们的括号能没有任何东西,而前置++中则有加入一个随机的数来对其进行一个区分。
结尾:
到这里我们的又增加了对类和对象的了解,并且这几篇博客的内容都有关联,如果在哪里没有学好的话,可能会导致后序课程的乏力,因此有空的时候要对其进行复习。最后希望这篇博客能有所帮助。
相关文章:
C++——类和对象(3)
作者:几冬雪来 时间:2023年5月6日 内容:C类和对象内容讲解 目录 前言: 1.运算符重载(续): 2.赋值重载: 结尾: 前言: 在上一篇博客中我们再一次讲解了…...
itop-3568开发板驱动学习笔记(24)设备树(三)时钟实例分析
《【北京迅为】itop-3568开发板驱动开发指南.pdf》 学习笔记 文章目录 生产者属性#clock-cells 属性clock-output-namesclock-frequencyassigned-clockclock-indicesassigned-clock-parents 消费者属性 设备树中的时钟信息以时钟树形式体现,时钟树包括时钟的属性和结…...
linux中使用docker部署微服务
目录 一、制作jar包(如果看一眼很简单,可以直接使用结尾的jar) 1.首先创建一个微服务 demo2 2.启动微服务(在DemoApplication上右键执行启动就行) 注意:其他操作导致的 可能遇到的报错 3.修改端口 4.新…...
操作系统考试复习—第三章 优先级倒置 死锁问题
当前OS广泛采用优先级调度算法和抢占方式,然而在系统中存在着影响进程运行的资源从而可能产生"优先级倒置"现象 具体解释为:在原本的调度算法设计中,高优先级进程可以抢占低优先级的CPU资源,先执行高优先级任务。但是存…...
OpenHarmony送显流程分析
OpenHarmony送显流程分析 引言 本文档主要记录OpenHarmony在渲染完成之后如何进行合成和送显流程的。这个过程牵涉的代码很多,而且流程也是比较繁琐的。所以我一定要坚持下来。千万不能半途而废,也不要想着一口气吃出一个胖子,路漫漫其修远兮…...
Java面试题字节流字符流
String 编码UTF-8 和GBK的区别 GBK编码:是指中国的中文字符,其实它包含了简体中文与繁体中文字符,另外还有一种字符 “gb2312”,这种字符仅能存储简体中文字符。 UTF-8编码:它是一种全国家通过的一种编码&#x…...
Self-Attention结构细节及计算过程
一、结构 上面那个图其实不是那么重要,只要知道将输入的x矩阵转换成三个矩阵进行计算即可。自注意力结构的输入为 输入矩阵的三个变形 Q(query矩阵)、K(key矩阵)、V(value矩阵)构成,…...
在Ubuntu18.04中安装uWebSockets库
目录 1.下载uWebSockets库2.下载uSockets3.安装openssl开发包4.编译首先说明这里使用的Ubuntu版本为18.04。 1.下载uWebSockets库 下载uWebSockets库有两种方式,一是终端,从Github中克隆uWebSockets库到Ubuntu本地文件夹,二是打开uWebSockets库下载链接自己下载到Windows,然…...
【Fluent】接着上一次计算的结果继续计算,利用计算过程中得到的物理场(温度、速度、压力等)插值Interpolate文件初始化模型的方法
一、问题背景 因为fluent中支持的初始化无非三种类型。 1、Standard initialization 标准初始化 2、Hybridinitialization 混合初始化 3、FMG initialization FMG初始化 另外,还可以用UDF通过坐标判断的方式予以初始化。 但是这些初始化方法都没办法利用以前计算过…...
第二十九章 使用消息订阅发布实现组件通信
PubSubJS库介绍 如果你想在React中使用第三方库来实现Pub/Sub机制,PubSubJS是一个不错的选择。它是一个轻量级的库,可以在浏览器和Node.js环境中使用。 PubSubJS提供了一个简单的API,可以让你在应用程序中订阅和发布消息。你可以使用npm来安…...
Transformer的位置编码
1. 什么是位置编码,为什么要使用位置编码 简单来说位置编码就是给一个句子中的每个token一个位置信息,通过位置编码可以明确token的前后顺序关系。 对任何语言来说,句子中词汇的顺序和位置都是非常重要的。它们定义了语法,从而定…...
Python学习简记
做题时遇到的不知道的知识点会更新在此: python中的int()函数可以用于进制转换 该函数最为常见的使用是用于强制类型转换,实际上,它可以有两个参数 值得强调的是当传入两个参数时第一个参数一定要是字符串类型 字符串方法: lower(…...
windows搭建一个FTP服务器超详细
一.场景: 在开发过程中需要FTP文件上传下载功能,需要在本地或者服务器上搭建一个FTP服务器。 二.详细步骤: 1. 安装FTP服务器支持和配置IIS web服务器 打卡“启动关闭Window功能” 控制面板>程序>启动或关闭Windows功能 或者选择快…...
u01使用率100%报错归档满的问题
今天下午客户报数据库无法连接了,我也立刻登录查看 因为显示orcl1归档满了,我就登录查看磁盘组的空间,发现空间空余很多 就sqlpus登录了,发现u01使用率满了 [oracledb1 ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 …...
Packet Tracer - 配置扩展 ACL - 场景 2
Packet Tracer - 配置扩展 ACL - 场景 2 拓扑图 地址分配表 设备 接口 IP 地址 子网掩码 默认网关 RTA G0/0 10.101.117.49 255.255.255.248 不适用 G0/1 10.101.117.33 255.255.255.240 不适用 G0/2 10.101.117.1 255.255.255.224 不适用 PCA NIC 10.101…...
最近面了12个人,发现这个测试基础题都答不上来...
一般面试我都会问一两道很基础的题目,来考察候选人的“地基”是否扎实,有些是操作系统层面的,有些是 python语言方面的,还有些… 深耕IT行业多年,我们发现,对于一个程序员而言,能去到一线互联网…...
JAVA基于Springboot框架的停车场管理系统开发实践和实现【附源码】
运行环境: jdk1.8idea/eclipsemaven3mysql5.6 项目技术: Java,Springboot,mybatis,mysql,jquery,html 该系统为停车场管理人员提供了对停车场中车辆,车位和财务的管理。操作员可以灵活地使用相关权限开展工作。在车位管理,车辆的停放和驶离、缴费&a…...
[230501] 4月29日考试真题第一篇|Temporary Pools
题目来源:http://t.csdn.cn/goCDT 正确率:6/10 目录 Temporary Pools 题目 Temporary Pools Paragraph 1: Temporary pools are freshwater habitats that retain water for only three to four months of the year or even shorter pe…...
Qt中QString, int等数据转换以及Qt与Halcon联编程序打包
一、Qt中QString, int等数据转换 在QT中,数值类型转为字符串类型,一般是可以使用 QString::number(); 示例: int num = 65; QString ab = QString::number(num); 其实还可以转为不同的进制字符串,比如 int num = 65; QString ab = QString::number(num,10); //十进…...
Android FlexboxLayout布局
FlexboxLayout 布局 一、简介二、使用三、功能详解FlexboxLayout属性flexWrapflexDirectionalignItemsjustifyContentalignContentdividerDrawableHorizontal、showDividerHorizontaldividerDrawableVertical、showDividerVerticaldividerDrawable、showDividermaxLine Flexbox…...
毫米波雷达DOA估计:从基础FFT到超分辨MUSIC,核心算法演进与实战选型指南
1. 毫米波雷达DOA估计基础入门 第一次接触毫米波雷达DOA估计时,我被各种专业术语搞得晕头转向。经过几个实际项目的打磨,我发现理解这个概念其实可以从一个生活场景开始:想象你在一个嘈杂的餐厅里,闭着眼睛也能判断出朋友在哪个方…...
163MusicLyrics:免费高效的网易云QQ音乐歌词下载与格式转换工具
163MusicLyrics:免费高效的网易云QQ音乐歌词下载与格式转换工具 【免费下载链接】163MusicLyrics 云音乐歌词获取处理工具【网易云、QQ音乐】 项目地址: https://gitcode.com/GitHub_Trending/16/163MusicLyrics 还在为本地音乐库缺少歌词而烦恼吗࿱…...
如何在绝地求生中配置罗技鼠标宏实现精准压枪:3分钟快速上手指南
如何在绝地求生中配置罗技鼠标宏实现精准压枪:3分钟快速上手指南 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 你是否在《绝地求生…...
Kandinsky-5.0-I2V-Lite-5s开源镜像教程:supervisor日志定位与故障排查方法
Kandinsky-5.0-I2V-Lite-5s开源镜像教程:supervisor日志定位与故障排查方法 1. 环境准备与快速部署 Kandinsky-5.0-I2V-Lite-5s是一款轻量级图生视频模型,只需上传一张首帧图片并补充运动或镜头描述,就能生成约5秒、24fps的短视频。本次镜像…...
VibeVoice镜像使用心得:25种音色实战,找到你的专属语音
VibeVoice镜像使用心得:25种音色实战,找到你的专属语音 1. 为什么你需要关注VibeVoice? 想象一下,你正在制作一个英文教学视频,需要一位发音标准的旁白;或者开发一个多语言客服系统,希望用自然…...
用例建模实战:从需求分析到系统设计的完整指南
1. 用例建模基础:从需求到设计的桥梁 我第一次接触用例建模是在一个电商系统重构项目中。当时团队花了大量时间讨论功能需求,却总是陷入"这个功能该不该做"的争论。直到我们引入用例建模技术,整个需求分析过程突然变得清晰有序。 用…...
MySQL 事务隔离级别与并发控制
MySQL事务隔离级别与并发控制是数据库系统中确保数据一致性与性能平衡的核心机制。在多用户并发访问的场景下,如何避免脏读、不可重复读、幻读等问题,同时保证系统吞吐量,是每个开发者必须掌握的技能。本文将深入探讨MySQL的四种隔离级别及其…...
006-分布式训练技术:DeepSeek的超大规模模型训练实践
006-分布式训练技术:DeepSeek的超大规模模型训练实践 那个凌晨三点半的OOM异常 上个月团队里新来的小伙子跑过来问我:“哥,我把batch_size调到32就OOM了,这卡可是80G显存啊!”我看了眼他的训练脚本,单卡训练,数据加载方式还是最原始的DataLoader。这场景太熟悉了——三…...
Frameworks 常规问题关键定位
点击电源亮屏关键定位 亮屏电源按下流程 熄屏电源按下流程 熄屏电源按下流程 通知FW流程 通知打盹模式Snoozed(通知上滑,一段时间不会在出通知) 上滑进入打盹...
向上管理核心三招(极简版)
不是拼命干活就行,而是要让领导 “看见你、认可你、愿意为你投入”。我帮你把核心逻辑和可直接用的话术整理成一份更精炼的职场向上管理手册,方便直接记、直接用:向上管理核心三招(极简版)一、适度麻烦领导・富兰克林效…...
