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

4 篇文章 0 订阅
1 篇文章 0 订阅

个人学习笔记

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

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

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

#include <iostream>
using namespace std;
int main()
{
    int a = 2;
    int b = a++;//此时b的值为2
    int c = ++a;//此时c的值为4
    cout<<b<<' '<<c<<endl;
    //int d = a++++;  //error
    int e = ++++a;
    cout<<e<<endl;
    return 0;
}

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

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

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

#include <iostream>
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<<","<<b<<")"<<endl;
}
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 <iostream>
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<<","<<b<<")"<<endl;
}
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,也就是不能修改了。

这样我们重载就完成了。

注意:

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

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




  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值