优秀的编程知识分享平台

网站首页 > 技术文章 正文

C++_类和对象_C++运算符重载_递增运算符重载_重载++运算符

nanyue 2024-07-30 03:20:59 技术文章 10 ℃

然后我们再来看这个递增运算符的重载.

?

我们知道,递增运算符,有前置++,和后置++,可以看到,上面写了

然后我们这次就自己定义一个int的类型,MyInteger,然后实现,递增,递减的操作.

?

首先我们去写个MyInteger类,我们给他个

private私有的m_Num变量.

?

然后我们写一个MyInteger的构造方法,给他一个0,这个初始化变量.

?

然后我们写个test01,去创建一个MyInteger的对象myint,然后输出

可以看到报错了.

?

我们去重载一下<<左移输出运算符.

可以看到myint用m_Num的时候报错,因为m_Num是MyInteger的私有变量.

?

我们把这个<<左移运算符的重载函数,写到MyInteger中,做为MyInteger的友元函数.cout<<的时候,就不会报错了.

?

我们可以看到现在已经可以输出myint对象了.

?

然后,如果我们在myint前面加上++ 呢,我们也想让我们的MyInteger可以++操作

可以看到上面报错了.

?

这个时候,需要我们去重载递增运算符,++,

要注意这个时候,++运算符,是区分前置++和后置++的,

我们先去写前置++运算符.

?

可以看到上面,这个前置++运算符的重载函数,这样就写好了,可以看到没有参数对吧,不需要参数,因为就是对自身进行的++操作

void operator++(){

m_Num ++;

}

?

然后我们再去测试,test01方法中

这里面,++myint,在写的时候还是报错.

?

可以看到依然是报错的,为什么呢?因为我们operator++这个,我们的成员函数,

前置++的重载运算符函数,上面,我们返回的是void对吧,返回void,很明显是不行的.

导致这里 ++返回一个void,然后把一个void,传给<<函数了,这样肯定不对,就报错了.

?

所以这里,我们要返回一个

MyInteger的引用:

MyInteger&,其实就是返回什么啊?

返回这个成员函数的,对应的,调用他的对象的,那个this指针的,解引用对吧.

这样解引用出来,就是那个调用这个++运算符重载函数的,那个MyInteger对象了.

?

然后我们再去看,test01(),这个方法这里这样写就不报错了.

?

我们去执行可以看到,MyInteger开始是0,经过,我们的前置++,

也就是++myint,返回了myint的值是1,因为是先进行加1,然后把加1后的值,赋值给myint的.

?

有人就说了,返回的时候,为什么要返回,MyInteger&,引用呢?

返回一个MyInteger的值,不可以嘛?

可以看到我返回值也没有报错对吧.

?

下面也没有报错

?.

然后我们运行一下,结果也没有错误对吧?

那为什么,我们返回的时候,还是用MyInteger&,这个引用呢

?

我们先别管上面这个问题,我先用++a,原生的++运算符来,进行前置++试试

?

运行可以看到,显示结果是1没问题.

?

如果我们把++a的结果,当然a是1,把这个结果,再进行前置++,我们看看是什么结果.

?

可以看到就变成2了对吧.没问题.

?

然后我们再去输出,这个时候的a变量,

++a 完了以后a =1 ,然后外面再++以后,a就变成2了,我们去看看跟预想的一样嘛?

?

可以看到跟我们预想的是一样的.没问题

?

然后我们再去看看我们的,myint,我们去

++(++myint)

?

然后我们再去输出我们的这个myint可以看看

?

可以看到,结果是1了对吧.

最后,经过两轮的++,这个myint变成1了,可肯定是不对的.为什么呢?

?

可以看到,这就是为什么我们之前,在MyInteger类中,重载operator++ ,这个++运算符函数的时候,返回的是

MyInteger的引用了,如果不返回引用,第一次

++myint以后,返回了一个值,myint的值是1,然后

第二次++ ,是在第一次的那个myint的值基础上++,得到最后的结果是2,但是

myint的值一直都是1,因为第一次++以后,并没有返回myint的自己,而是返回的值,所以再++

的时候,myint的值还是1,并没有给myint这个对象++,仅仅是把myint的副本,也就是myint的值给++了.


这也就是为什么,最后打印myint的时候,如果前面我们在MyInteger类中,重载opreator++ 的时候,如果没有

返回MyInteger&,而是返回MyIntger的时候,会导致,最后,输出myint的值是1的原因.

?

可以看到,如果上面我们返回

MyInteger&的引用,这样,就可以了

?

可以看到现在打印的都是2了.

?

然后我们再去看后置++的运算符函数的重载

?

这里要注意,如果在参数中给他传入一个int,这样的话,就叫做后置++的运算符了,

为啥

后置++,先赋值,再++,这个是个规定,上面这样写,就可以表示是后置++运算符,的函数重载.

?

然后我去写一下实现步骤,先记录结果,然后递增,然后把递增前的结果返回

?

可以看到上面就是把MyInteger 声明了一个temp,然后,最后返回,return 一个temp,MyInteger对象.

但是这里要注意,后++,我们是返回的值,MyInteger,因为后++,是先返回值,然后再进行++

所以这里,返回MyInteger的时候,就不用,返回引用了MyInteger&.

?

然后我们去测试后++,可以看到

?

运行以后,可以看到没有问题对吧.

?

这里要注意,前置++,返回引用,后置++返回值.这个规则要理解,并记住.
































Tags:

最近发表
标签列表