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

1.对于运算符重载的进一步理解

(1)运算符重载就是运算符重新定义的意思,我们如果想要比较两个整形数据的大小,这个是很容易的,但是当我们定义一个类之后,使用这个类创建对象,想要直接比较这两个对象的大小,编译器是无法实现的;

(2)在这个里面我们使用的是日期进行创建两个对象d1和d2,我们想要比较这两个对象的大小,我们对于这个比较的标准,肯定是非常明确的,就是先比较年,再比较月份,再比较具体的某一天;但是对于编译器而言,他是不知道或者说是无法实现我们想要的功能的;

(3)要将解决这个问题,我们首先想到的就是定义一个函数,我们刚开始是定义了一个dateless函数,使用分支语句对于年月日分别进行对应的比较,我们的返回值是布尔类型的,如果符合条件就会返回true,否则就会返回false,这样就解决了比较的问题;

(4)但是,我们自己明白自己定义的函数的意思,其他的读者未必明白,我们的运算符重载存在的意义就是可以增加代码的可读性,我们使用operator<这个函数用来表示比较大小的函数,我们在主函数里面进行函数的调用的时候,我们就可以直接写作(d1<d2),这样就会更方便读者的理解,但是实际上代码的含义是operator(d1,d2),我们只需要写作d1<d2就可以了,这样的话更方便阅读代码的人进行理解;

(5)因此我们可以知道:运算符重载是增强代码的可读性,但是我们需要注意的是对于运算符重载,我们不能乱用,我们不能改变操作数的个数,比如一个运算符只有2个操作数,经过你的重载变成了3个操作数,这样显然是不可取的;

(6)运算符重载是针对的自定义类型而言,我们的内置类型的含义不可以改变;

(7)到这里,我们还没有完去解决问题,因为在我们的operator<函数里面,我们直接调用了类里面的成员变量,我们定义的成员变量一般都是私有的,但是我们想要使用,因此我们变成了公有的,但是我们一般不会这样做;我们可以把这个函数放到类的里面,但是我们都放进去之后就会发现运行报错,报错的原因就是运算符重载的参数过多;

(8)我们原来是有2个参数,const date&x1和const date& x2,这里说明我们的两个参数过多了,我们要知道的是实际上进行函数的调用的时候,我们的参数是比写出来的多一个this指针的,因此我们应该进行下面的修改:

类里面的函数应该这样修改:

相当于是this指针代表d1,x2代表的是d2,这样的话就可以实现两者的比较,相当于是x2的数据和我们的成员变量进行比较,成员变量里面的值就是d1的数据;

主函数应该这样修改:

这里是相当于d1调用这个重载函数,d1得知就可以直接使用成员函数,d2的值就需要使用x2.yaer,x2.month这样的方式表示出来;

(9)并不是所有的运算符都可以重载,下面的几个运算符是不可以进行重载的:三目操作符(?:),域作用限定符(::),sizeof,.*(点星),  .(点,结构体里面使用的),这几个运算符是不可以进行重载的;

(10)我们实现了小于的重载之后,就可以使用这个函数进行“借用”来完成其他的符号的重载,当然我们也可以在原来的基础上进行改动,例如我们想要实现小于等于的重载,我们可以把小于的函数主体复制粘贴,把小于里面的小于号修改为小于等于即可,但是我们已经定义了小于的重载,我们可以直接在小于等于里面进行使用,怎么用呢,就是借助this指针;this指针代表我们定义的d1的地址,我们只需要解引用就可以拿到d1,*this<x或者*this==x就找全了所有的情况,这样就会非常简便,但是可以这样做的前提就是需要有一个已经实现的函数可以供我们使用,我们这里是手动实现了小于,其他的符号实现重载只需要调用这个就可以了。

(11)日期加天数的实现重载:

就是意思是我们给定一个日期,2024/4/28,我们想加上50计算加上之后的日期是哪一天;

我们的思路就是先要获取这个月份的天数,然后进行加上,超出30之后就进行month++,month超过12之后year++;依次进行,最后我们的返回值就是数组里面的天数;

我们的重载实际上实现的是加等;因为函数实现完成之后,d1的值也跟着变化了,最后的返回值就是*this(就是我们传递的是加上的天数,day1接收了这个天数,this指针存储的是d1的地址,返回值*this就是变化之后的d1的具体日期;

(12)利用加等实现加

这里我们要想实现加,保证原来的数值不变,需要定义一个临时的变量存储数值,这里调用拷贝构造函数就可以把this的指向的内容拷贝给temp,利用加等最后返回temp就可以了;

(13)加等的实现时候,我们的最后返回是指针,出了作用于之后不会销毁,就会调用拷贝构造函数,因此我们使用传引用返回,第二种返回temp,出了作用域temp会销毁,我们不能调用传引用返回,只能使用传值返回的方式。

  • 21
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值