用于前增量和后增量的重载++ [英] Overloading ++ for both pre and post increment

查看:74
本文介绍了用于前增量和后增量的重载++的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们可以为增量前和增量后重载operator++吗?即调用SampleObject++++SampleObject结果正确。

class CSample {
 public:
   int m_iValue;     // just to directly fetch inside main()
   CSample() : m_iValue(0) {}
   CSample(int val) : m_iValue(val) {}
   // Overloading ++ for Pre-Increment
   int /*CSample& */ operator++() { // can also adopt to return CSample&
      ++(*this).m_iValue;
      return m_iValue; /*(*this); */
   }

  // Overloading ++ for Post-Increment
 /* int operator++() {
        CSample temp = *this;
        ++(*this).m_iValue;
        return temp.m_iValue; /* temp; */
    } */
};

我们不能仅根据返回类型重载函数,而且即使我们认为它是允许的,也不能解决问题,因为重载解析中存在歧义。

既然提供了运算符重载,以使内置类型的行为类似于用户定义的类型,为什么我们自己的类型不能同时使用前增量和后增量呢?

推荐答案

增量运算符的后缀版本采用伪参数int以消除歧义:

// prefix
CSample& operator++()
{
  // implement increment logic on this instance, return reference to it.
  return *this;
}

// postfix
CSample operator++(int)
{
  CSample tmp(*this);
  operator++(); // prefix-increment this instance
  return tmp;   // return value before increment
}

这篇关于用于前增量和后增量的重载++的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆