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

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

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

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

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

最佳答案

也许我误解了,但如果您在正确声明两个运算符时遇到困难,您仍然可以使用成员(member)等免费运算符来完成此操作。但是,您确实需要将对象作为第一个参数通过引用传递。您是对的,作为成员函数,它们通过 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;
}

输出

++obj called.
obj++ called.

关于C++ 后缀/前缀运算符重载为非成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18789535/

相关文章:

c++ - 编译过时的c++包: undefined reference errors

c++ - 并发读写的嵌入式数据库

c++ - 指针的大小

C++ 对构造函数的模糊调用

c++ - 通过引用传递 - 运算符重载

c++ - GLSL VertexShader 适用于 Qt 但不适用于普通 OpenGL(SL)

c++ - 需要有关运算符 << 重载函数的帮助

c - 关于 while 循环的表达式

c - 无法理解 C 程序的输出

c++ - 为什么要避免在 C++ 中使用后缀运算符?