怎样在C++中重载++运算符

2025-01-03 03:18:03
推荐回答(1个)
回答1:

我们知道在C++中重载运算符是很方便的,尤其是类对象之间的运算尤为方便。但是在重载的运算符中有一个比较特殊,就是++和--运算符。

我们拿++运算符(重载用于类对象之间的运算)来说,这个是存在前++和后++的,我们怎么在使用时辨识这两个++呢?在重载时又要注意什么问题呢?

当我们重载一个运算符时,尽量不要失去原有的神韵,也就是说不要失去了原来的本意最好。于是我们先看看重载前的++运算符怎么使用:

#include   

using namespace std;  

int main()  

{  

int a = 2;  

int b = a++;//此时b的值为2  

int c = ++a;//此时c的值为4  

cout<

//int d = a++++;  //error  

int e = ++++a;  

cout<

return 0;  

}  

我们通过上面这个小程序了解了一些信息:后++是不能连用的,但是前++可以的。

我们得想想这对我们重载我们自己的++有什么启示。也就是说当我们只是一次++时,是要返回一个值的,既然能够使用,所以这个值我们是可以拿过来修改的,同理,既然后++不能连用,这就意味着其返回值是不能修改的。分析完我们开始重载。

通过上面的例子我们想我们重载前++还是比较简单的,于是我们先来开始重载前++。

#include   

using namespace std;  

class Complex  

{  

private:  

float a;  

float b;  

public:  

Complex(float _a=0,float _b=0)//赋初值为零  

:a(_a),b(_b)  

{}  

void dis();  

Complex& operator ++();  

};  

void Complex::dis()  

{  

cout<<"("<

}  

Complex& Complex::operator ++()//特别注意其返回值  

{  

this->a++;  

this->b++;  

return *this;  

}  

int main()  

{  

Complex c(1,2);  

Complex c1;  

c1 = ++++c;  

c.dis();  

c1.dis();  

return 0;  

}  

上面已经重载完前++运算符了,就像刚刚我们强调的问题,我们的返回值必须要能修改,于是我们返回的是其引用(上面的注释部分)。

我们说这次重载我们没用考虑怎样避开两个++怎样区别的问题,现在我们要重载后++,我们要考虑怎么写了,反正不能和上面一样。

这里我们就用到一个叫做哑元的东西,哑元就是只有类型没有名称的参数,它用来区别不同的函数,比如这里的前++和后++。

现在我们可以用这个哑元来重载后++。

#include   

using namespace std;  

class Complex  

{  

float a;  

float b;  

public:  

Complex(float _a=0,float _b=0)  

:a(_a),b(_b){}  

void dis();  

const Complex operator ++(int);  

};  

void Complex::dis()  

{  

cout<<"("<

}  

const Complex Complex::operator++(int)  

{  

this->a++;  

this->b++;  

return *this;  

}  

int main()  

{  

Complex c(1,2);  

Complex c1;  

c1 = c++++;  

c.dis();  

c1.dis();  

return 0;  

}  

    我们还是强调返回值的问题,我们这次将返回值设为const,也就是不能修改了。

    这样我们重载就完成了。

    注意:

    ①返回值在这里是重点,一个是要求返回的值能够修改,一个是不能修改。

    ②重载一个运算符要联系其本意,不要偏离。