请考虑以下代码
#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,那么为什么它是必要的伪参数?并且在两种情况下例如++运算符都是在参数之前写的而不是它意味着它们是相同的?
答案 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