c ++两个方向的简单运算符重载

时间:2015-12-05 14:21:36

标签: c++ operator-overloading

所以我试图重载运算符*所以两种方式都可以工作:

Myclass * a;
a * Myclass;

当我宣布这个功能时,一切顺利:

Polynomial operator*(const double d);

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

Polynomial operator*(Polynomial &, const double d)

我收到一个错误:“此操作符函数的参数太多。

我做错了什么?

谢谢!

1 个答案:

答案 0 :(得分:2)

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

但是如果您使用全局非会员功能,您可以轻松地拥有您想要的任何订单。例如

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)
{
    ...
}

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

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

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

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

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

class Polynomial
{
    ...

    Polynomial operator*(const double rhs)
    {
        ...
    }
};

以下代码

Polynomial poly1(...);
Polynomial poly2 = poly * 12.34;

等于

Polynomial poly1(...);
Polynomial poly2 = poly.operator*(12.34);