如何在C ++中重载非交换运算符的两种可能性?

时间:2013-12-27 04:32:56

标签: c++ operator-overloading complex-numbers

我目前正在为复杂的数字创建一个类,所以我想让它更简单,我允许进行 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 =整数/复数

给出正确答案?

换句话说,我怎样才能以两种方式重载运算符?

2 个答案:

答案 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对象,因此您不能以这种方式链接调用。