二进制运算符声明的'static'关键字

CSM*_*CSM 8 c++ operator-overloading

在C ++中,当LHS是要声明的类时,二进制运算符可以被一个或两个运算符覆盖。如果使用两个参数声明,则必须是非成员函数。在此代码中,两个声明是相同的。

class MyClass
{
     public:
         MyClass operator+(const MyClass&);
}
MyClass operator+(const MyClass&, const MyClass&);
Run Code Online (Sandbox Code Playgroud)

是否有理由不能将后者作为静态成员函数完成?像这样

class MyClass
{
     public:
         static MyClass operator+(const MyClass&, const MyClass&);
}
Run Code Online (Sandbox Code Playgroud)

这将使编写流输入/输出运算符更加容易(我知道您可以使用它friend来声明运算符)

Dav*_*ing 6

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

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