c++ - C++:修改左操作数的成员重载二元运算符,例如 +=
问题描述
我目前正在 learncpp.com 上学习运算符重载,并遇到了一个我无法完全理解的声明。这里是:
在处理修改左操作数的二元运算符(例如 operator+=)时,通常首选成员函数版本。 在这些情况下,最左边的操作数将始终是类类型,并且将被修改的对象变为 *this 指向的对象是很自然的。因为最右边的操作数成为显式参数,所以不会混淆谁被修改和谁被评估。
我不明白为什么左手操作数总是类类型。例如,如果我要重载 +=,为什么不能像下面那样将用户定义的类作为右手参数重载?
void operator+=(int blah, MyNewClass foo);
提前致谢!
解决方案
尽管有评论,但您没看错:它讨论了所有此类修改运算符,并且使用关于左操作数的语句来证明成员函数“通常首选”的想法是正确的。(如果它是一个类类型的对象,你肯定有机会使用成员函数,我们通常更喜欢用成员函数来表达对此类对象的修改。)
这篇文章根本没有考虑用非成员函数重载的深奥可能性:
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,但对于刚刚学习语言的人(那段肯定是针对他们的),也许最好不要说这些例子的可能性。(忘记我说了什么。)
推荐阅读
- python - _tkinter.TclError:无效的命令名称“.!canvas”
- .net-core - FtpWebRequest 不会通过 FTP 删除文件 - 但可以找到文件
- ios - azure devops 是否支持 ios 自动代码签名?
- python - 是否可以从 Youtube 搜索中抓取视频链接?
- c# - Windows Defrag 触发 C# filewatcher 删除事件
- angular - 路由后以角度将数据传递给组件
- python-3.x - 如何使用python在循环中附加熊猫数据框
- html - 为什么只有当里面有一个“input”元素时,“button”元素才能在“select”元素内工作?
- swift - 如何从 Observable 对象中显示和隐藏文本字段
- javascript - 为什么即使在编写 setState 方法后我的状态也没有更新?