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

C++——类和对象(3)

作者:几冬雪来

时间:2023年5月6日

内容:C++类和对象内容讲解

目录

前言: 

1.运算符重载(续): 

2.赋值重载:

结尾: 


前言: 

在上一篇博客中我们再一次讲解了类和对象的内容,并且引入了一个新的重载模式——运算符重载,那么今天我们就接着对其进行说明。 

1.运算符重载(续): 

在上一篇博客中我们讲解了一个日期类运算符重载的实现,也得知了运算符重载的话,如果是内置类型的话我们可以不进行书写,如果是自定义类型的话,我们就要对其进行书写。

我们也进行了日期的比较。 

但是并不是所以运算符都是有意义的。 

还是以我们的日期类函数为例:

比如:日期减日期可以算出我们两个日期间隔的天数,它是有意义的;但是在这里日期加日期就是没有意义的行为了。 

而是否要重载运算符,取决于这个这个运算符对类有无意义

 

类似我们这个代码,这两种写法从底层来讲是一样的。

因此在编译器来看,我们的第一个代码等价与第二个代码,在过程中我们的第一个代码就转换为第二个代码的指令。 

但是这个代码是在类的外面的,因此我们无法去访问私有和保护

在这里我们有两种方案,一种是友元这是我们后面才需要学习的知识,另一种方法则是将其放进类中。 

但是在这里我们将代码放入类中的时候,代码报错了,这是因为在运算符重载的时候我们C++中有所规定

在类中,作为类成员函数重载的时候,其形参看起来比操作数数目少1,因为在类中成员函数的第一个参数为隐藏的this

且必须有一个参数为类类型,也就是自定义类型

 

像这种两个都是内置类型的就会发生报错,因此至少要有一个自定义类型的。 

操作符有几个操作数,重载就有几个参数

因此我们的代码要进行修改。

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

这个知识点一般会出现在选择题当中。 

2.赋值重载:

接下来我们来讲解赋值重载。

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

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

在我们的编译器中,我们可以在C语言和C++中写出这种赋值的代码。

这里的赋值顺序是从右到左进行赋值。 

但是在我们上面的赋值重载中,因为我们并没有返回值为void

因此在进行了第一次重载之后,我们就没有办法顺利的进行第二次重载了。

因此我们的代码要修改成这个样子,返回的是this指针,又因为节省空间因此在这里我们还要对其进行引用的操作

这样我们就是返回的就是d4的一个别名了,同时也不用担心出作用域销毁的事情。 

因为我们的赋值重载和拷贝构造一样,所以我们可以让编译器自己帮我们创建。

如果是栈的话,就需要我们自己去创建。 

这里还要了解的一个点是:

赋值运算符只能重载类型成员不能重载全局函数

默认成员函数不能写到全局。

同时我们的声明和定义也可以进行分离

这里就是我们的日期类小于形的代码的声明和定义的分离

但是我们的日期类可用的操作符远不止小于这一个操作符。

类似大于,减号,等于等操作符都可以用在日期类中

我们这里可以像上面的代码一样各自书写一个大于,等于的代码出来。但是这样做的话就增加了代码的数量,减少了可读性。在这里我们还有什么其他的方法吗?

像这里我们先写一个==类型的重载,然后下来的代码就进行一个另一种方法的书写,如我们上面的代码一样

这样就能简单的写出我们日期类的各种比较。

同时日期加天数和日期减日期也可以通过这种方式来完成

要执行上面操作的话,我们首先就要算出每个月的天数

这个操作我们写过很多次,这里就不再重复了。 

再下来我们就只需要书写它的代码即可。

在这里我们如果使用的是引用的话,最后会提防因为销毁的原因出现问题,因此在这里我们采用的是这一种写法。 

构造函数也是为了防止其销毁。 

而且我们也可以由我们的+来引入+=的代码。 

像上面左右的代码都是正确的,不过二者相对比左边的代码要更优一点。 

这是因为左边的代码只需要创建两个对象,而右边的这种却要四个,+=的有一些亏

同时我们的日期类还是其他的操作符可以对其使用。

类似我们的日期可以进行++操作

只不过我们的++是单运算符。 

但是众所周知在C语言中我们的++操作符分为了前置和后置

因此在这里我们的代码到底是调用的哪一个?

用我们以前的知识来讲解。

前置++是返回++后的值,后置++是返回++前的值

虽然它们的内部都要进行++操作,所以不能用同一个运算符重载替代

为此,我们为后置++中的参数提供了int。

增加这个int并不是为了接收具体的值,这仅仅是为了占位,根前置++构成重载

因为后置++需要进行创建对象,我们就将其牺牲掉了。

同时,前置++和后置++,在底层所代表的也不相同

在这里我们可以看见,后置++我们的括号能没有任何东西,而前置++中则有加入一个随机的数来对其进行一个区分。 

结尾: 

到这里我们的又增加了对类和对象的了解,并且这几篇博客的内容都有关联,如果在哪里没有学好的话,可能会导致后序课程的乏力,因此有空的时候要对其进行复习。最后希望这篇博客能有所帮助。


http://www.kler.cn/news/17391.html

相关文章:

  • 初识 OPC
  • 05_Uboot源码目录分析
  • Java 版 spring cloud 工程系统管理 工程项目管理系统源码 工程项目各模块及其功能点清单
  • 2.压力测试+优化(Jmeter)
  • ChatGPT提示词工程(四):Inferring推断
  • MySQL基础
  • vim编辑器
  • Build生成器模式
  • (二)【平衡小车制作】电机驱动(超详解)
  • 内存越界是否一定会导致程序崩溃吗?详解内存越界
  • CUDA下载,以及下载GPU版本的pytorch
  • JAVA基于Springboot框架的停车场管理系统开发实践和实现【附源码】
  • DP动态规划
  • 1.rabbitMQ介绍
  • JavaScript闭包的基本原理和应用场景
  • 人的全面发展评价指标体系—基于相关-主成分分析构建
  • 2000-2019年30省研发资本存量(含计算过程和原始数据)
  • 大数据Doris(八):Broker部署和集群启停脚本
  • 高效学习方法和工具推荐,让你事半功倍!
  • clickhouse里的数组数据类型与相关使用介绍
  • 【C++复习1】程序结构和C++的工作原理
  • Java程序设计入门教程--数组
  • 小球下落(dropping balls)uva679
  • go 打包文件夹成zip文件
  • Envoy控制面实践
  • 漫画 | Linux之父:财务自由以后,我失眠了!
  • 华为OD机试 - 整理扑克牌(Python)
  • [计算机图形学]光场,颜色与感知(前瞻预习/复习回顾)
  • 对比 LVS 负载均衡群集的 NAT 模式和 DR 模式,基于 CentOS 7 构建 LVS-DR 群集
  • springboot 集成 shardingSphere 加mybatisplus 自带增加 分页查询 和源代码包 分库分表 单库 分表 使用雪花算法id