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

个人学习笔记

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

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

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

#include 
using namespace std;
int main()
{
    int a = 2;
    int b = a++;//此时b的值为2
    int c = ++a;//此时c的值为4
    cout<

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

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

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

#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<<"("<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<<"("<a++;
    this->b++;
    return *this;
}
int main()
{
    Complex c(1,2);
    Complex c1;
    c1 = c++++;
    c.dis();
    c1.dis();
    return 0;
}

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

这样我们重载就完成了。

注意:

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

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




你可能感兴趣的:(C语言,C++,重载++)