More effective C++ 今日一贴 之自增自减运算符[2]

据说古代(20世纪80年代)的程序员,经常因为 C++ 无法区分 ++运算符 以及 -- 运算符 的前缀和后缀调用而发牢骚,于是C++ 语言得到了扩展,允许对前缀与后缀形式的自增和自减进行重载.
重载函数是通过他们参数类型上的差异得以区分,但是不管前缀和后缀形式的自增和自减都没有参数.为了解决语言上的这个问题,c++规定后缀形式有一个int类型参数,当函数被调用时,编译器悄无声息地传递了一个 0 作为参数的值给该函数
如:
  ++i;  //calls i.operator++
  i++;  //calls i.operator++(0)

不过前缀和后缀最大的区别在于其返回值的类型的不同.前缀形式返回的是一个引用 ,后缀形式返回的是一个const对象.

  int& int:: operator++()
  {
    *this += 1;
      return *this;
  }

  const int int:: operator++(int)  //后缀形式具有一个 INT类型的参数
  {
      const int oldValue = *this;
      ++(*this);

      return oldValue;
  }

    自增的后缀形式为什么会返回一个const类型的对象呢? 假设返回的不是 const 对象,下面的代码就是正确的:
        int i;
        i++++;

    它等同于  i.operator++(0).operator(0);
  很明显, 第二个 ++ 是由第一个 ++ 所返回的对象来调用的,这和我们期望所得的值并不一样.
  c++ 禁止 int 类型那么做,而最容易的方法就是返回一个 const 类型对象.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值