C++ 后缀/前缀运算符重载为非成员函数

2024-04-16

我正在编写自己的数组类作为练习。因为,我读到非成员函数实际上在某些方面比成员函数更好。 (斯科特·迈耶斯 http://www.drdobbs.com/cpp/how-non-member-functions-improve-encapsu/184401197)

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

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++();

但整件事是,我首先不想让它们成为成员函数! 那么,前/后修复运算符是否不能/不应该作为非成员函数实现?

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

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


也许我误解了,但如果您正在努力正确声明两个运营商,您仍然可以使用会员等免费运营商来完成此操作。但是,您确实需要通过object作为第一个参数的引用。你是对的,作为成员函数,他们通过免费获得他们的对象this。作为免费功能,需要你自己推送。

#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;
}

Output

++obj called.
obj++ called.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 后缀/前缀运算符重载为非成员函数 的相关文章

随机推荐