c ++ postfix / prefix运算符重载为非成员函数

时间:2013-09-13 15:04:00

标签: c++ operator-overloading postfix-operator prefix-operator non-member-functions

我正在编写自己的数组类作为练习。因为,我读取非成员函数实际上在某些方面比成员函数更好。 (Scott Meyers

我正在尝试尽可能多地编写运算符重载作为非成员函数。 运算符重载+, - 作为非成员函数都可以正常运行。

my_array operator+(const my_array & left, const my_array & right);
my_array operator-(const my_array & operand);
my_array & operator++();  // prefix
my_array   operator++(int); //postfix, compiler puts a 0

但是,作为非成员函数的前缀/后缀运算符会产生问题(如果我使用范围解析并使它们成为成员函数,它们可以正常工作)

据我所知,并非每个运算符重载都可以是成员函数。但是,我很难解释为什么这两个不能成为非成员函数。我得到的错误是:

: 'my_array& operator++()' must have an argument of class or enumerated type

如果我将它们作为成员函数并允许* this数组obj以下列格式传递,那么基本上可以解决这个问题。

(*this).operator++();

但是整个事情是,我不想让它们成为第一名的成员! 那么,前/后修复操作符不能/不应该实现为非成员函数吗?

我想出的原因是,因为postfix / prefix是一元运算符 他们只有一个参数(通常是*这个)。 因此,如果我希望编译器隐式提供* this指针并调用重载,则必须将它们实现为成员函数。

我的推理是否正确?如果不是,我如何将其作为非成员函数实现? 谢谢你给我提供了一些见解。

1 个答案:

答案 0 :(得分:2)

也许我误解了,但是如果你正在为两个运营商的正确宣告而苦苦挣扎,你仍然可以像成员这样的自由运营商这样做。但是,您需要将对象作为第一个参数传递给引用。你是正确的,作为成员函数,他们通过这个免费获得他们的对象。作为一个免费功能,你需要自己动手。

#include <iostream>

struct my_array
{
    // your members here.
};

my_array& operator ++(my_array& obj)
{
    // access to members is through obj.member
    std::cout << "++obj called." << std::endl;
    return obj;
}

my_array operator ++(my_array& obj, int)
{
    my_array prev = obj;

    // modify obj, but return the previous state.        
    std::cout << "obj++ called." << std::endl;

    return prev;
}

int main(int argc, char *argv[])
{
    my_array obj;
    ++obj;
    obj++;
    return 0;
}

<强>输出

++obj called.
obj++ called.