我目前正在为复杂的数字创建一个类,所以我想让它更简单,我允许进行 a = b + c 等操作,而不是 a = b.add(c)。例如,这是我添加两个复数的实现:
// An addition operator for the complex numbers
Complex Complex::operator + (Complex n) {
return Complex(this->real + n.real, this->imaginary + n.imaginary);
}
在此示例中,添加复数 a + b 与添加 b + a 的结果相同。
但是,在处理非交换运算符和整数时会出现问题。例如,除以整数或整数除法。我怎么能这样做:
a =复杂/整数
和
a =整数/复数
给出正确答案?
换句话说,我怎样才能以两种方式重载运算符?
答案 0 :(得分:8)
如果您将运算符编写为自由函数而不是类成员,则可以指定两个操作数。
Complex operator/ (int lhs, Complex rhs);
Complex operator/ (Complex lhs, int rhs);
如果您需要访问私人会员,则可能必须将其设为好友功能。
(我会留给你决定你是否需要int,或者浮动,或者前面的任何东西。)
编辑:更完整的例子可能是:
Complex operator/ (int lhs, Complex rhs) {
Complex answer;
double mag = rhs.real*rhs.real+rhs.imag*rhs.imag;
answer.real = lhs*rhs.real/mag;
answer.imag = -lhs*rhs.imag/mag;
return answer;
}
然后稍后:
f = 6/f;
(我再次假设公共成员变量易于使用)。
答案 1 :(得分:2)
为类重载运算符时,它看起来像这样:s1.operator+(s2)
。如您所见,它有一个隐含的参数this
。因此,它只需要一个参数。为了使用带有两个参数的版本,它们必须是自由函数。如果你想让这些自由函数看到你对象的私有变量,你必须让它们成为你的类声明中的朋友。
class Object
{
friend Object& operator+(int something, Object& other);
};
// not a member function, don't qualify Object::
Object& operator+(int something, const Object& other)
{
return other.private_variable + something;
}
这就是为什么例如当你重载operator<<
时,它必须是一个自由函数。
// Bad code
class Test
{
std::ostream& operator<<(std::ostream& os, const Test& test);
};
std::ostream& Test::operator<<(std::ostream& os, const Test& test)
{
}
隐式this
不是ostream对象,因此您不能以这种方式链接调用。