然后我们再来看这个递增运算符的重载.
?
我们知道,递增运算符,有前置++,和后置++,可以看到,上面写了
然后我们这次就自己定义一个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&.
?
然后我们去测试后++,可以看到
?
运行以后,可以看到没有问题对吧.
?
这里要注意,前置++,返回引用,后置++返回值.这个规则要理解,并记住.