C++初阶-----对运算符重载的进一步理解(2)

news2024/11/24 5:20:17

目录

1.对于加加,减减运算符的重载理解

2.const修饰的一些事情

3.日期对象之间的减法实现逻辑


1.对于加加,减减运算符的重载理解

(1)在C语言里面,我们已经知道并且了解加加,减减的一些基本的用法,前置加加,后置加加,前置减减,后置减减的区别以及应用,我们已经接触的比较多了;

(2)在C++里面,对于类里面的对象,我们肯定是无法直接使用这些运算符的,因为这些类和对象都属于自定义类型,我们的加加减减针对的是内置类型,例如针对一个日期类,我们想要使用2024年4月28日的加加操作,这个肯定要使用加加运算符,但是编译器不认识啊,我们需要对这个运算符进行重载;

(3)首先我们要明确一点,出了作用域,如果存在的话,我们可以使用传引用返回,出了作用域,如果不存在的话,我们就要使用传值返回就可以;

(4)我们知道加加存在前置和后置,下面展示的是前置加加,我们这里的加等昨天已经实现了(可以去看我昨天的博客),我们在这里可以直接使用,否则我们是无法直接使用这个运算符的;

(5)在主函数里面,我们是调用的d1这个对象,使之进行加价的操作,我们使用相同的类创建的对象ret进行接收,最后打印就可以了;实现的过程中,我们是使用了this指针,这个指针在参数里面是隐式存在的,但是我们在函数里面可以使用,因为出了作用域,我们的this指针还是存在的,因此我们可以使用传引用返回的方式,最后的打印结果就是4月30号;

(6)接下来的是后置加加,我们的前置后置参数的差别不大,但是为了加以区分两者,我们的祖师爷在后置加加的运算符重载里面加入了一个参数,这个参数可以是任意的(这个参数就是为了加以区分,而且是规定的),这样我们使用拷贝函数把我们的日期拷贝给temp这个临时的变量,但是出了作用域,这个变量就销毁了,所以我们不能使用传引用返回,使用传值返回就可以了,因为是后置加加,所以我们的打印结果并不会变,但是实际上肯定是加一了的,我们可以使用调试进行观察变化的情况;

(7)前置减减和后置减减的逻辑基本相同:就是符号变了,这里的减等也是需要提前实现的,只有提前实现这里才可以进行使用,重载如下;相信理解加加的你不难理解减减的重载,其实本质都是一样的。

2.const修饰的一些事情

下面的这个现象可能你并没有尝试过,但是他是确实存在的,我们来介绍一个这个现象的原因和对应的解决策略:

(1)现象就是上面的图片里面展示的那样,我们如果在定义对象的时候在前面加上const,我们使用d1.print进行打印的时候就会报错,这个是为何呢?

(2)这个就和我们的print函数有关了,这个里面涉及权限的问题,我们定义d1时候是const类型,print函数里面的参数就是date类型的,这个里面就涉及到权限的放大,

我们想要解决这个问题,只需要在函数的后面加上const就可以了,虽然这个const在括号的后面,实际上他修饰的是里面的参数this指针,这样就相当于是权限的平移,就不会报错了;

就算我们定义d1的时候,没有加const,这个函数print后面的const也是可以写上去的,因为我们普通定义的d1到const修饰的参数相当于是权限的缩小,这个也是不会报错的。

3.日期对象之间的减法实现逻辑

我们这里是用两个日期进行相应的运算的,我们想要计算两个日期之间的差的天数,这个是后年直接进行减法显然是不行的,因为d1和d2都属于自定义的类型,编译器只认识内置的类型;

(2)我们这里只写了一个参数,但是实际上是有2个参数的,因为还有一个隐藏的this指针,this指针代表的就是第一个日期,temp接受的就是第二个日期,无论大小,我们进行对应的赋值(第一个赋值给max,第二个赋值给min),然后我们进行比较如果第一个大于第二个,我们直接设置一个n,让这个min不断地++,最后当min和max相等的时候,我们就得到了相差的天数;如果d1<d2那么相减之后的就是负数,我们需要重新赋值,然后把我们的flag设置为-1就可以了;

(3)实际上,为什么我们的这个min加到一个月的最后一天会自动走向下一个月,不知道你是否明白?

实际上,我们昨天实现的+=这个运算符的重载就已经进行定义了月份的天数的相关问题,

我们在实现这个日期之间的差值计算的时候,我们使用到了++(无论是前置还是后置),++函数里面都是用到了+=的,相当于我们+=实现了之后,在++里面进行了使用,++这个运算符重载就知道月份加到某一天走向下一个月份,我们的计算日期之间的差值-这个运算符有用到了++这个运算符,所以这个-运算符从在里面也是知道这个月份加到哪一天进行进位的;

(4)由此可见,我们只需要定义一次日期的月份之间的天数设置,在不同函数里面只有使用到对应的重载符号,这个月份天数是知道加到那一天的,都是通用的,不知道讲到这里你是否明白。

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

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

相关文章

STM32H7 HSE时钟的使用方法介绍

目录 概述 1 STM32H750 HSE时钟介绍 2 使用STM32Cube创建Project 3 认识HSE时钟 3.1 HSE时钟的特性 3.2 HSE的典型应用电路 4 STM32Cube中配置时钟 4.1 时钟需求 4.2 配置参数 4.2.1 使能外围资源 4.2.2 使用STM32Cube注意项 4.2.3 配置参数 5 总结 概述 本文主要…

超强鉴别 cdn 小工具

最近做一个攻防演习&#xff0c;使用了一些工具收集域名&#xff0c;子域名&#xff0c;但是在将这些域名解析成 IP 这个过程遇到了一些小问题&#xff0c;默认工具给出的 cdn 标志根本不准&#xff0c;所以被迫写了这么一个小工具&#xff1a;get_real_ip.py PS&#xff1a;下…

ThreeJS:项目搭建

介绍如何基于Vite、Vue、React构建ThreeJS项目。 Vite项目 1. 初始化项目&#xff0c;命令&#xff1a;npm init vitelatest&#xff0c; 2. 安装依赖&#xff0c;命令&#xff1a;npm install&#xff0c; 3. 启动项目&#xff0c;命令&#xff1a;npm run dev。 4. 样式初始…

神经网络中的优化方法

一、引入 在传统的梯度下降优化算法中&#xff0c;如果碰到平缓区域&#xff0c;梯度值较小&#xff0c;参数优化变慢 &#xff0c;遇到鞍点&#xff08;是指在某些方向上梯度为零而在其他方向上梯度非零的点。&#xff09;&#xff0c;梯度为 0&#xff0c;参数无法优化&…

基于Springboot的滑雪场管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的滑雪场管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&a…

【linuxC语言】守护进程

文章目录 前言一、守护进程的介绍二、开启守护进程总结 前言 在Linux系统中&#xff0c;守护进程是在后台运行的进程&#xff0c;通常以服务的形式提供某种功能&#xff0c;如网络服务、系统监控等。守护进程的特点是在启动时脱离终端并且在后台运行&#xff0c;它们通常不与用…

如何使用免费软件从Mac恢复音频文件?

要从Mac中删除任何文件&#xff0c;背后是有原因的。大多数Mac用户都希望增加Mac中的空间&#xff0c;这就是为什么他们更喜欢从驱动器中删除文件以便出现一些空间的原因。一些Mac用户错误地删除了该文件&#xff0c;无法识别这是一个重要文件。例如&#xff0c;他们错误地从Ma…

I/O体系结构和设备驱动程序

I/O体系结构 为了确保计算机能够正常工作&#xff0c;必须提供数据通路&#xff0c;让信息在连接到个人计算机的CPU、RAM和I/O设备之间流动。这些数据通路总称为总线&#xff0c;担当计算机内部主通信通道的作用。 所有计算机都拥有一条系统总线&#xff0c;它连接大部分内部…

ps科研常用操作,制作模式图 扣取想要的内容元素photoshop

复制想要copy的图片&#xff0c; 打开ps---file-----new &#xff0c;ctrolv粘贴图片进入ps 选择魔棒工具&#xff0c;点击想要去除的白色区域 然后&#xff0c;cotrol shift i&#xff0c;反选&#xff0c; ctrol shiftj复制&#xff0c;复制成功之后&#xff0c;一定要改…

【Java EE】Mybatis之XML详解

文章目录 &#x1f38d;配置数据库连接和MyBatis&#x1f340;写持久层代码&#x1f338;添加mapper接口&#x1f338;添加UserInfoXMLMapper.xml&#x1f338;单元测试 &#x1f332;CRUD&#x1f338;增(Insert)&#x1f338;删(Delete)&#x1f338;改(Update)&#x1f338;…

CMake:静态库链接其他动态库或静态库(九)

1、项目结构 对于下面这样一个项目 把calc模块做成静态或者动态库把sort模块做成静态库然后再sort模块中的*.cpp调用calc模块生成的库即可&#xff08;这样就制作了一个静态库引用动态或者静态库&#xff09;test模块用于测试sort模块中的内容 . ├── calc │ ├── ad…

ThreeJS:本地部署官网文档与案例

部署方式 部署之前请确保已经配置好node.js环境。 1. 下载ThreeJS源码 ThreeJS的GitHub地址&#xff1a;GitHub - mrdoob/three.js: JavaScript 3D Library.&#xff0c;可以简单查看ThreeJS当前版本&#xff1a;r164&#xff0c; 我们可以选择对应的版本&#xff08;此处为r1…

【跟马少平老师学AI】-【神经网络是怎么实现的】(七-2)word2vec模型

一句话归纳&#xff1a; 1&#xff09;CBOW模型&#xff1a; 2c个向量是相加&#xff0c;而不是拼接。 2&#xff09;CBOW模型中的哈夫曼树&#xff1a; 从root开始&#xff0c;向左为1&#xff0c;向右为0。叶子结点对应词有中的一个词。每个词对应唯一的编码。词编码不等长。…

计算机等级考试2级(Python)知识点整理

计算机等级考试2级&#xff08;Python&#xff09;知识点整理 1.基础知识点&#xff08;记忆、理解&#xff09; 第1讲Python概述 01. 源代码 02. 目标代码 03. 编译和解释 04. 程序的基本编写方法 第2讲 Python语言基础&#xff08;一&#xff09; 01. 用缩进表示代码…

深入理解网络原理1

文章目录 前言一、网络初识1.1 IP地址1.2 端口号1.3 协议1.4 五元组1.5 协议分层 二、TCP/IP五层协议三、封装和分用四、客户端vs服务端4.1 交互模式4.2 常见的客户端服务端模型4.3 TCP和UDP差别 前言 随着时代的发展&#xff0c;越来越需要计算机之间互相通信&#xff0c;共享…

前端基础学习html(1)

1.标题标签.h1,h2...h6 2.段落标签p 换行标签br 3.加粗strong(b) /倾斜em(i) /删除 del(s) /下划线ins(u) 4.盒子&#xff1a;div //一行一个 span//一行多个 5.img :src alt title width height border 图片src引用&#xff1a;相对路径 上级/同级/中级 绝对路径&#xff…

地图产业的困局与破局:高精地图“上车”难 轻量化渐成主流方案 | 最新快讯

《科创板日报》5月3日讯&#xff08;编辑 邱思雨&#xff09; 近期&#xff0c;特斯拉与百度的“绯闻”成为智驾、地图行业的焦点。 有媒体消息称&#xff0c;特斯拉将与百度地图独家深度定制车道级高辅地图。《科创板日报》记者也获悉&#xff0c;自5月1日起&#xff0c;百度…

【C语言实现贪吃蛇】(内含源码)

前言&#xff1a;首先在实现贪吃蛇小游戏之前&#xff0c;我们要先了解Win32 API的有关知识 1.Win32 API Windows这个多作业系统除了协调应用程序的执行、分配内存、管理资源之外&#xff0c;它同时也是一个很大的服务中心&#xff0c;调佣这个中心的各种服务&#xff08;每一…

前端面试和一些建议

最近公司在招前端&#xff0c;我有跟着一起参与面试。我们主要负责面试的人&#xff0c;不会问那些什么闭包&#xff0c;原型链&#xff0c;他觉得那些东西在我们日常开发中用不到&#xff0c;问的基本都是一些工作中的问题。这些问题不是每次都问&#xff0c;但也就问这些了。…

基于Unity+Vue通信交互的WebGL项目实践

unity-webgl 是无法直接向vue项目进行通信的&#xff0c;需要一个中间者 jslib 文件 jslib当作中间者&#xff0c;unity与它通信&#xff0c;前端也与它通信&#xff0c;在此基础上三者之间进行了通信对接 看过很多例子&#xff1a;介绍的都不是很详细&#xff0c;不如自己写&…