二进制运算符声明的“静态”关键字

时间:2019-06-08 12:59:25

标签: c++ operator-overloading

在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来声明运算符)

1 个答案:

答案 0 :(得分:6)

逻辑是a+b可以解释为operator+(a,b)a.operator+(b),如果斜视它们,每个看起来都是合理的。前者找不到任何成员函数;后者可以找到静态的,但是只会无用地将b传递给它们。可以通过解释为a.operator+(a,b)来正确地调用静态变量,但这会尝试将一个额外的参数传递给任何非静态成员(例如,可能将一元-转换为二进制变量)。 。由于它的(原始)类型会通过名称查找来限制候选者,因此它也会破坏允许在第一个参数上进行转换的功能。

在一种情况下,operator+(a,b)可以找到成员函数-运算符本身出现在类中(成员函数)。对此类名称的不合格查找会特别忽略类成员,因为类成员(本身是非静态的)将具有错误的arity,并且(通常)将用于错误的类型(将 all 阴影化为非成员)同一操作员的功能!)。