在C ++中,当LHS是要声明的类时,二进制运算符可以被一个或两个运算符覆盖。如果使用两个参数声明,则必须是非成员函数。在此代码中,两个声明是相同的。
class MyClass
{
public:
MyClass operator+(const MyClass&);
}
MyClass operator+(const MyClass&, const MyClass&);
是否有一个原因不能将后者作为静态成员函数完成?像这样
class MyClass
{
public:
static MyClass operator+(const MyClass&, const MyClass&);
}
这将使编写流输入/输出运算符更加容易(我知道您可以使用friend
来声明运算符)
答案 0 :(得分:6)
逻辑是a+b
可以解释为operator+(a,b)
或a.operator+(b)
,如果斜视它们,每个看起来都是合理的。前者找不到任何成员函数;后者可以找到静态的,但是只会无用地将b
传递给它们。可以通过解释为a.operator+(a,b)
来正确地调用静态变量,但这会尝试将一个额外的参数传递给任何非静态成员(例如,可能将一元-
转换为二进制变量)。 。由于它的(原始)类型会通过名称查找来限制候选者,因此它也会破坏允许在第一个参数上进行转换的功能。
在一种情况下,operator+(a,b)
可以找到成员函数-运算符本身出现在类中(成员函数)。对此类名称的不合格查找会特别忽略类成员,因为类成员(本身是非静态的)将具有错误的arity,并且(通常)将用于错误的类型(将 all 阴影化为非成员)同一操作员的功能!)。