首页 > 解决方案 > C++:修改左操作数的成员重载二元运算符,例如 +=

问题描述

我目前正在 learncpp.com 上学习运算符重载,并遇到了一个我无法完全理解的声明。这里是:

在处理修改左操作数的二元运算符(例如 operator+=)时,通常首选成员函数版本。 在这些情况下,最左边的操作数将始终是类类型,并且将被修改的对象变为 *this 指向的对象是很自然的。因为最右边的操作数成为显式参数,所以不会混淆谁被修改和谁被评估。

我不明白为什么左手操作数总是类类型。例如,如果我要重载 +=,为什么不能像下面那样将用户定义的类作为右手参数重载?

void operator+=(int blah, MyNewClass foo);

提前致谢!

标签: c++operator-overloading

解决方案


尽管有评论,但您没看错:它讨论了所有此类修改运算符,并且使用关于左操作数的语句来证明成员函数“通常首选”的想法是正确的(如果它是一个类类型的对象,你肯定有机会使用成员函数,我们通常更喜欢用成员函数来表达对此类对象的修改。)

这篇文章根本没有考虑用非成员函数重载的深奥可能性:

enum nil {};
// Use left-to-right compound assignment:
void operator+=(const int &i,nil &n)
{n=static_cast<nil>(n+i);}
// Make something into a pointer (*):
template<class T>
void* operator*=(T &t,nil) {return &t;}

struct A {operator int();};
// Convert sum to a percentage (%):
double operator%=(A a,A b) {return (a+b)/100.;}
// Infix call notation (like $ in Haskell):
template<class R>
R operator&=(R f(int),A a) {return f(a);}

偶尔有人可能会找到一种聪明的方式来使用,比如说,>>=以这种方式来模仿 Haskell,但对于刚刚学习语言的人(那段肯定是针对他们的),也许最好不要说这些例子的可能性。(忘记我说了什么。)


推荐阅读