我正在编写自己的数组类作为练习。因为,我读到非成员函数实际上在某些方面比成员函数更好。
(斯科特·迈耶斯 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 指针并调用重载,则它们必须作为成员函数实现。
我的推理正确吗?如果不是,我该如何将其实现为非成员函数?
感谢您为我提供了一些见解。