区分++,--的前置和后置的情况

一般而言,前置返回引用,后置返回一个const对象

暂时不考虑内置对象的前置和后置等


假定有一个类

class CInt
{
public:
    CInt& operator++();                   //前置递增
    CInt& operator--();                   //前置递减

    const CInt operator++(int);          //后置递增
    const CInt operator--(int);          //后置递减
};
//关于后置递增的添加了一个参数的意图

int main(int argc, char* argv[])
{
   CInt obj;
   obj++;//调用obj.operator++(int);
   obj--;//调动obj.operator--(int);

   ++obj;//调用obj.opetator++();
   --obj;//调用obj.operator--();


    return 0;
}

关于前置和后置递增情况的函数的定义

class CInt
{
public:
    CInt& operator++()                   //前置递增
    {
        *this += 1;
        return *this;
    }
    
    const CInt operator++(int)          //后置递增
    {
        CInt temp = *this;
        ++(*this);
        return temp;
    }

    CInt& operator--();                  //前置递减
    const CInt operator--(int);          //后置递减

    CInt& operator+=(int);
};

可以看到后置操作是以前置操作为基础的情况完成的

为什么后置递增需要加一个int作为参数?

为了和前置的函数作为区分


一个技巧:

如果你在函数体内没有使用函数的命名参数,许多编译器就会发出警告,如果故意忽略掉那个参数的名字,可以避免这种警告


后置操作符为什么要返回一个const的对象?

首先,后置操作符返回的是一个对象,这个对象是改变之前的对象,而不是*this

然后,当出现这种情况的时候,例如 obj++++;

这个动作类似于obj.operator++(0).operator++(0);

第二个operator++(0)动作作用于obj第一个operator++(0)的返回值,是属于old obj,而不是obj本身

所以第二个operator++(0)是作用不到obj上的

所以,表面上看obj++++是对obj累加了两次,其实只加了一次,完全得不到你想要的结果,但是++++obj就可以。

第二个原因是这个操作和内置类型的行为是不一样的


所以,关于前置和后置运算符的总结:

1.前置返回引用,后置返回const对象

2.处理内置类型的对象时,前置和后置没有太大的区别,但是处理自定义对象时,应该尽可能的使用前置

3.后置操作符以前置操作符为基础完成

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值