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