C++ 简单运算符重载双向

Gil*_*Gil 4 c++ operator-overloading

所以我试图重载 operator* 这样两种方法都可以工作:

Myclass * a;
a * Myclass;
Run Code Online (Sandbox Code Playgroud)

当我声明这个函数时,一切顺利:

Polynomial operator*(const double d);
Run Code Online (Sandbox Code Playgroud)

但是当我尝试这样做的另一个方向时:

Polynomial operator*(Polynomial &, const double d)
Run Code Online (Sandbox Code Playgroud)

我收到错误消息:“此运算符函数的参数太多。

我究竟做错了什么?

谢谢!

Som*_*ude 8

当你重载一个二元运算符作为成员函数时,类实例总是左边的运算符,函数的参数是右边的,你无法改变它。如果您想继续使用仅限成员的函数,则不会。

但是,如果您使用全局非成员函数,则可以轻松获得所需的任何顺序。例如

class Polynomial { ... };

// Function that allows poly * 12.34
Polynomial operator*(const Polynomial& lhs, const double rhs)
{
    ...
}

// Function which allows 12.34 * poly
Polynomial operator*(const double lhs, const Polynomial& rhs)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

如果您不想在两个函数中重新实现相同的代码,并且运算符是可交换的(如乘法和加法应该是),那么您可以通过调用另一个函数来实现其中一个函数:

Polynomial operator*(const Polynomial& lhs, const double rhs)
{
    ...
}

Polynomial operator*(const double lhs, const Polynomial& rhs)
{
    return rhs * lhs;  // Calls the operator function above
}
Run Code Online (Sandbox Code Playgroud)

当然,以Polynomial对象为左侧的操作符当然可以实现为成员函数。


在相关说明中,如果您已将运算符实现为成员函数,例如

class Polynomial
{
    ...

    Polynomial operator*(const double rhs)
    {
        ...
    }
};
Run Code Online (Sandbox Code Playgroud)

以下代码

Polynomial poly1(...);
Polynomial poly2 = poly * 12.34;
Run Code Online (Sandbox Code Playgroud)

等于

Polynomial poly1(...);
Polynomial poly2 = poly.operator*(12.34);
Run Code Online (Sandbox Code Playgroud)