重载后缀和前缀运算符

问题描述 投票:0回答:4

请考虑以下代码:

#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
4个回答
16
投票
预自增和后自增是两个不同的运算符,需要单独的重载。

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

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


8
投票
在预自增/自减和后自增/自减中,区别仅基于重载函数中的虚拟参数

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
投票
与任何函数一样,运算符由签名来标识。函数/运算符名称之前的返回类型和修饰符不包含在其中。您的运营商名字在这里

operator++() operator++(int)

这是编译器区分两者的唯一方式。至于

Digit&

Digit
 返回值;需要它们是因为 ++x 和 x++ 的运行方式。


2
投票
在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

© www.soinside.com 2019 - 2024. All rights reserved.