4

我已经重载了运算符 ++ 的前缀版本。如果重载的函数不是我的类*的成员,我如何重载后缀版本?

#include <iostream>
using namespace std;

class Number{
    int number;
public:
    Number(int inNr):number(inNr){}
    friend void operator++(Number& fst);
};

void operator++(Number& fst){
    fst.number=fst.number+1;
}

int main(){
    Number nr1(1);
    ++nr1;
    //nr1++; error: no 'operator++(int)' declared for postfix '++' 
}

*我知道如果是类的成员,我可以使用dummy int参数来区分它们。

4

2 回答 2

13

非成员重载也使用虚拟int参数来区分它们:

friend void operator++(Number&);      // prefix
friend void operator++(Number&, int); // postfix

请注意,有些人可能希望这些通过分别返回新值和旧值来模拟内置运算符的行为:

Number& operator++(Number& fst) {
    fst.number=fst.number+1;
    return fst; // reference to new value
}

Number operator++(Number& fst, int) {
    Number old = fst;
    ++fst;
    return old; // copy of old value
}
于 2013-07-26T16:18:21.697 回答
1

我相信(我目前无法对此进行测试)您使用虚拟 int 作为运算符重载的第二个参数,即

void operator++(Number& fst, int /*dummy*/){
    fst.number=fst.number+1;
}
于 2013-07-26T16:20:19.710 回答