C++ 重载 >> 运算符,根据 >> 的哪一侧进行不同的交互

Teh*_*bbo 2 c++ overloading operator-keyword

我想知道是否可以通过这种方式重载 C++ >> 运算符

Account& operator>> (double left, Account &right)
{
    right.deposit(left);
    return right;
}

Account& operator>> (Account &left, double right)
{
    left.withdraw(right);
    return left;
}
Run Code Online (Sandbox Code Playgroud)

我想知道 >> 运算符是否具有此功能,所以我可以做这样的事情

account1 >> 200 >> account2
Run Code Online (Sandbox Code Playgroud)

这将从第一个账户中提取 200,然后存入第二个账户。

Sam*_*hik 7

如上所述,由于以下简单原因,这不会起作用:

account1 >> 200 ...
Run Code Online (Sandbox Code Playgroud)

当它被评估时,最终会调用以下重载:

Account& operator>> (Account &left, double right)
Run Code Online (Sandbox Code Playgroud)

您会注意到此重载返回一个Account &. 这是白纸黑字地宣布的。我们继续吧:

... >> account2
Run Code Online (Sandbox Code Playgroud)

现在,它的左侧operator>>现在是Account &重载返回的内容。它不再是了double。它需要成为一个double让其他超负荷的人弥补不足并将其带回家的工具。这就是重载运算符在 C++ 中的工作原理。

最简单的解决方案可能是简单地从第一个重载中返回一个双精度值:

double operator>> (Account &left, double right)
{
    left.withdraw(right);
    return right;
}
Run Code Online (Sandbox Code Playgroud)

现在这个表达式的结果是一个double值,这将更容易让另一个重载的operator>>表达式出现。