请考虑以下代码
#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);
它们与& mark,那么为什么它是必要的伪参数?并且在两种情况下例如运算符都是在参数之前写的而不是它意味着它们是相同的?
解决方法
前后增量是两个不同的运算符,需要单独的重载.
C不允许仅在返回类型上进行重载,因此在示例中使用不同的返回类型将不足以消除这两种方法的歧义.
虚拟参数是C的设计者为消除歧义选择的机制.