将不同的参数传递给重载的运算符函数

时间:2016-03-01 02:51:17

标签: c++ function class operator-overloading

我目前有一个名为Complex的课程:

Complex operator+ (const Complex& num1, const Complex& num2);
Complex operator+ (const int num1, const Complex& num2);
Complex operator+ (const Complex& num1,const int num2);

我用来重载加法运算符。目前我有三个独立的函数声明来处理3种不同的情况:2个复数,1个复数和1个int在右边,1个int和1个复数在右边。

Complex operator+ (const Complex& num1,const Complex& num2) {
    Complex result;
    result.real += num1.real + num2.real;
    result.imaginary += num1.imaginary +num2.imaginary;
    return result;
}
Complex operator+ (const int num1, const Complex& num2){
    Complex result;
    result.real += num1;
    result.imaginary += num2.imaginary;
    return result;
}
Complex operator+ (const Complex& num1, const int num2){
    Complex result;
    result.real += num2;
    result.imaginary += num1.imaginary;
    return result;
}

函数声明只是将" real"和"想象的"复数的一部分,并将整数加到复数的实部。

spriteBatch.DrawString(hudFont, "HP: " + p.Attributes.Hp + " / " + p.Attributes.MaxHp, EDGE_BUFFER, Color.White);

必须有更好的方法来做到这一点吗?或者是否必须明确声明所有三种情况?

2 个答案:

答案 0 :(得分:3)

如果您将委派构造函数添加到Complex类。

class Complex{
public:
    Complex();
    Complex(double, double);

    Complex(double a) : Complex(a, 0) {}

然后您会发现只需要定义一个operator+

Complex operator+(const Complex &a, const Complex &b);

它将处理您示例中的所有用例。

答案 1 :(得分:0)

首先,函数内部的代码不必要地复杂化。你肯定应该使用它的双参数构造函数初始化result,而不是初始化为零然后修改。例如,代码可能是:

Complex operator+ (const Complex& num1,const Complex& num2)
{
    return Complex(num1.real + num2.real, num1.imaginary + num2.imaginary);
}

Complex operator+ (const Complex& num1, const int num2)
{
    return Complex(num1.real + num2, num1.imaginary);
}

Complex operator+ (const int num1, const Complex& num2)
{
    return num2 + num1;    // compiler will inline this
}

我不确定你为什么在这里使用int,使用double似乎更好。

Sam的回答显示了如何将三个功能减少到1.这减少了你必须要做的打字量,虽然它确实会带来轻微的性能降低:你最终做了额外的+ 0.0关于返回值imaginary

如果我们展望乘法,那么这种惩罚会更严重,例如代码:

Complex operator*(Complex const &lhs, double rhs)
{
    return Complex(lhs.real * rhs, lhs.imaginary * rhs);
}

Complex operator*(Complex const &lhs, Complex const &rhs)内的代码少得多。

因此,您必须在代码简单性和性能之间做出选择。

相关问题