c++ 双向简单运算符重载
c++ simple operator overloading for both directions
所以我试图重载运算符*,所以两种方法都可以工作:
Myclass * a;
a * Myclass;
当我声明这个函数时一切顺利:
Polynomial operator*(const double d);
但是当我尝试像这样从另一个方向进行操作时:
Polynomial operator*(Polynomial &, const double d)
我收到一条错误消息:“此运算符函数的参数过多。
我做错了什么?
谢谢!
当您将二元运算符重载为成员函数时,class 实例始终是左侧运算符,函数的参数是右侧运算符,您无法对其进行更改。如果您想继续使用仅限成员的功能,则不会。
但是如果你使用全局非成员函数,你可以很容易地得到你想要的任何顺序。例如
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);
所以我试图重载运算符*,所以两种方法都可以工作:
Myclass * a;
a * Myclass;
当我声明这个函数时一切顺利:
Polynomial operator*(const double d);
但是当我尝试像这样从另一个方向进行操作时:
Polynomial operator*(Polynomial &, const double d)
我收到一条错误消息:“此运算符函数的参数过多。
我做错了什么?
谢谢!
当您将二元运算符重载为成员函数时,class 实例始终是左侧运算符,函数的参数是右侧运算符,您无法对其进行更改。如果您想继续使用仅限成员的功能,则不会。
但是如果你使用全局非成员函数,你可以很容易地得到你想要的任何顺序。例如
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);