C ++运算符重载混乱

时间:2013-10-02 18:33:51

标签: c++

所以我创建了这个可以添加两个对象的两个值的类。我真正理解的是在运算符函数中,分子和分母的值是否来自int main()中的对象no1?

class frac
{
    public:
        frac operator+(frac&);
        frac();
        frac(int, int);
        int numerator;
        int denominator;
};

frac frac::operator+(frac& tmp)
{
    frac tmpResult;
    tmpResult.numerator = numerator + tmp.numerator;
    tmpResult.denominator = denominator + tmp.denominator;

    return tmpResult;
}

int main()
{
    frac no1(2, 5);
    frac no2(3, 6);
    frac result = no1 + no2;
    return 0;
}

6 个答案:

答案 0 :(得分:1)

  

分子和分母的值是否来自int main()?

中的对象no1

答案 1 :(得分:1)

是的,它被定义为成员函数,因此它等同于调用

no1.operator+(no2);

您希望将参数类型更改为const引用,因为您实际上并不想修改右侧。你想修好你的数学。

注意你也可以使用免费功能

frac operator+(const frac& lhs, const frac& rhs) { ... }
对某些人(包括我)来说,这似乎更自然。

答案 2 :(得分:0)

是的,你是对的。可以在类方法中访问类成员,而无需指定其原点(就好像它们是在本地声明的)。

frac frac::operator+(frac& tmp)
{
    frac tmpResult;
    tmpResult.numerator = numerator + tmp.numerator;
    tmpResult.denominator = denominator + tmp.denominator;

    return tmpResult;
}

此代码可以重写为:

frac frac::operator+(frac& tmp)
{
    frac tmpResult;
    tmpResult.numerator = this->numerator + tmp.numerator;
    tmpResult.denominator = this->denominator + tmp.denominator;

    return tmpResult;
}

PS:我相信你的意思是运营商超载。

编辑:当你处理错误的分数时,我有这种纠正你的数学的冲动。

分数加法(和分别减法)可以这样做:

frac frac::operator+(frac& tmp)
{
    int common_denominator = tmp.denominator * this->denominator;
    int common_numerator = tmp.numerator * this->denominator + this->numerator * tmp.denominator;

    //You can add simplification by dividing these 
    //two above with their greatest common divisor 
    //in order to avoid cases like 111/222 which can
    //be represented as 1/2. (this is optional)

    return frac(common_numerator, common_denominator)
}

答案 3 :(得分:0)

是。分子和分母的值来自对象1号。

为了您的理解,您也可以将其写为:

frac result = no1.operator+( no2 );

答案 4 :(得分:0)

你的main()可以被重写为更明确:

int main()
{
    frac no1(2, 5);
    frac no2(3, 6);
    frac result = no1.operator+( no2 );
    return 0;
}

此代码是等效的,但可以更容易理解哪个对象指针作为此传递给operator +

答案 5 :(得分:0)

忽略您的数学错误......

当您将重载运算符声明为成员函数时,假定第一个参数为this。也就是说,no1 + no2只是no1.operator+(no2)的简写。因此,该函数会从当前numerator对象中看到denominatorno1(因为它位于左侧)。

或者,您也可以这样声明函数:

class frac
{
    // class declaration
    friend frac operator+(const frac& lhs, const frac& rhs);
};

frac operator+(const frac& lhs, const frac& rhs)
{
    // implement fraction addition for lhs + rhs
}