【问题标题】:C++: Member Overloading Binary Operators which Modify the Left Operand eg +=C++:修改左操作数的成员重载二元运算符,例如 +=
【发布时间】:2021-10-22 02:17:23
【问题描述】:

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

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

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

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

提前致谢!

【问题讨论】:

  • 不要忽略“通常首选”和“这些情况”这两个词。你可以按照你的建议去做,但是这样的操作员不会赢得你同事的任何尊重。 (不过,它可能会让你在“混淆 C++”竞赛中获得一些分数。)
  • @molbdnilo,我很难理解的是最左边的操作数将始终是类类型的断言。虽然我的例子可能不常见(或不明智),但我不明白为什么这是不可能的。你认为你能详细说明为什么这是不可能的吗?
  • 在这些情况下始终是类类型,而这些情况是成员函数版本。正如我所说,这可能的。你试过了吗?
  • 啊,我明白了——“这些情况”是指运算符被成员函数重载时,而不是修改左操作数的二元运算符。这完全有道理 - 感谢您的澄清!

标签: c++ operator-overloading


【解决方案1】:

尽管有 cmets,但您正确地阅读了此:它在谈论所有此类修改运算符,并且它使用关于左侧操作数的陈述来证明成员函数是“通常首选的”。 (如果它是一个类类型的对象,你肯定有机会使用成员函数,我们通常更喜欢用成员函数来表达对此类对象的修改。)

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

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);}

偶尔有人可能会找到一种巧妙的方法,例如以这种方式使用 &gt;&gt;= 来模仿 Haskell,但对于只是学习该语言的人(该段落肯定是针对他们)而言,也许最好不要说这些例子的可能性。 (忘了我说了什么。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    • 2012-03-24
    • 2014-05-02
    相关资源
    最近更新 更多