【问题标题】:overloading postfix and prefix operators重载后缀和前缀运算符
【发布时间】:2011-10-12 12:52:12
【问题描述】:

请考虑以下代码

#include <iostream>
using namespace std;
class Digit
{

private:
    int m_digit;
public:
    Digit(int ndigit=0){
     m_digit=ndigit;
                        }
    Digit& operator++();//prefix
    Digit& operator--();   //prefix
        Digit operator++(int);
        Digit operator--(int);
        int get() const { return m_digit;}
};
Digit& Digit::operator++(){

   ++m_digit;
   return *this;
}
Digit& Digit::operator--(){
 --m_digit;
 return *this;

}
Digit Digit::operator++(int){
Digit cresult(m_digit);
++(*this);
return cresult;


}
    Digit Digit::operator--(int){
Digit cresult(m_digit);
--(*this);
return cresult;


}
    int main(){

     Digit cDigit(5);
      ++cDigit;
        cDigit++;
         cout<<cDigit.get()<<endl;
         cout<<cDigit.get()<<endl;





     return 0;
    }

这里实现了两个版本的后缀和前缀运算符,我已经读到通过引入另一个所谓的虚拟参数来实现差异,但我有疑问,如果我们看到这些声明

Digit& operator++();//prefix
             Digit& operator--();   //prefix
        Digit operator++(int);
        Digit operator--(int);

它们的区别在于 & 标记,那么为什么需要虚拟参数?而且在这两种情况下,例如 ++ 运算符都写在参数之前,这不意味着它们是相同的吗?

【问题讨论】:

    标签: c++ syntax language-lawyer postfix-operator prefix-operator


    【解决方案1】:

    前置和后置增量是两个不同的运算符,需要单独的重载。

    C++ 不允许仅在返回类型上重载,因此在您的示例中具有不同的返回类型不足以消除这两种方法的歧义。

    虚拟参数是 C++ 设计者选择的消歧机制。

    【讨论】:

    • 我想在手臂或某处有一个符号说明为什么这是选择消歧的方法。答案可能就像“没有其他办法”一样简单。
    【解决方案2】:

    与任何函数一样,操作符由签名标识。函数/运算符名称之前的返回类型和修饰符不包含在此中。您的运营商名称在这里

    operator++()
    operator++(int)
    

    这是编译器区分两者的唯一方法。至于Digit&amp;Digit的返回值;需要它们是因为 ++x 和 x++ 应该运行的方式。

    【讨论】:

      【解决方案3】:

      Pre-Increment/Decrement 和 Post-Increment/decrement 的区别仅基于重载函数中的虚拟参数

      operator++()         => Prefix Increment
      operator--()         => Prefix Decrement
      
      operator++(int)      => Postfix Increment
      operator--(int)      => Postfix Decrement
      

      返回类型可能相同。也可以参考:http://www.tutorialspoint.com/cplusplus/increment_decrement_operators_overloading.htm

      【讨论】:

        【解决方案4】:

        在 C++ 中,函数/方法不能被返回类型重载,只能被参数列表重载。忽略前缀和后缀运算符是运算符这一事实,想象一下如果它们只是简单的其他函数,编译器将如何根据返回类型确定使用哪个?例如

        int x = 2;
        
        const int DoIt()
        {
            return 1;
        }
        
        int& DoIt()
        {
            return x;
        }
        
        int y = DoIt();
        

        由于运算符重载本质上只是函数,因此编译器无法通过返回类型来区分它们。

        http://www.parashift.com/c++-faq-lite/operator-overloading.html#faq-13.14

        【讨论】:

          猜你喜欢
          • 2012-01-05
          • 1970-01-01
          • 1970-01-01
          • 2016-03-29
          • 1970-01-01
          • 2013-07-27
          • 1970-01-01
          • 2011-03-12
          相关资源
          最近更新 更多