重载postfix和前缀运算符

时间:2011-10-12 12:52:12

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

请考虑以下代码

#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);

他们与&amp; mark,那么为什么它是必要的伪参数?并且在两种情况下例如++运算符都是在参数之前写的而不是它意味着它们是相同的?

4 个答案:

答案 0 :(得分:10)

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

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

伪参数是C ++设计者为消除歧义选择的机制。

答案 1 :(得分:3)

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

operator++()
operator++(int)

这是编译器区分两者的唯一方法。至于Digit&Digit返回值;由于++ x和x ++的运行方式,它们是必需的。

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

在预递增/递减和后递增/递减中,差异仅基于重载函数中的伪参数

class ClientForm(forms.ModelForm):
    def __init__(self,*args,**kwargs):
        super(ClientForm,self).__init__(*args,**kwargs)
        self.fields['phone_cell'].label = _(u'Phone (Cell)')
        self.fields['phone_home'].label = _(u'Phone (Home)')

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