请考虑以下代码:
#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++ 不允许仅在返回类型上重载,因此像示例中那样具有不同的返回类型不足以消除这两种方法的歧义。
虚拟参数是 C++ 设计者选择用于消除歧义的机制。
operator++()
operator++(int)
这是编译器区分两者的唯一方式。至于
Digit&
和
Digit
返回值;需要它们是因为 ++x 和 x++ 的运行方式。