对于分数类型,重载运算符<,==

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对于分数类型,重载运算符<,==相关的知识,希望对你有一定的参考价值。

我试图在C ++中重载运算符<。到目前为止,我只设法做+, - ,*,/。我已经提出了这个代码:

Fraction Fraction::operator/(Fraction &second)
 
    int n1 = getNumerator() * second.getDenominator();
    int n2 = second.getNumerator() * getDenominator();
    int d = getDenominator() * second.getDenominator();
    return Fraction(n1/n2, d);


bool Fraction::operator<(Fraction &second)

if(numerator < second.numerator)

    return true;

else if(denominator < second.denominator)

    return true;
else

    return false;



我想知道如何修改它以便我可以重载运算符<,==?我需要一个布尔方法类型,这是我所知道的,但我不知道要比较。提前致谢。

答案

注意:我的原始答案并不完美,并且处理了许多假设,主要是分母不会为零,这可以通过类成员设置器强制执行。 setter也可用于强制分母为正(通过将符号推到分子上)。一旦分母被迫严格大于零,operator<可以优雅地写成(参见johnchen's answer,其中b * d > 0):

bool Fraction::operator<(const Fraction &second) const
 
    return getNumerator() * second.getDenominator() <  second.getNumerator() * getDenominator();

这里唯一剩下的风险是溢出,如果分子和分母的使用数据类型是int64_t或更小,可以强制此计算中使用的数据类型为int32_t以消除此风险。

原始(低质量)接受的答案:

bool Fraction::operator<(const Fraction &second) const
 
    return (float(getNumerator() ) / getDenominator() <  float(second.getNumerator() ) / second.getDenominator() )

事实上,你应该有一个const方法getFloatingValue,它返回float(getNumerator() ) / getDenominator():这将简化编写其他比较函数。

另一答案

我不知道要比较

用这个事实

(a / b) < (c / d) ←→ (a * d) < (c * b) if b * d > 0
(a / b) < (c / d) ←→ (a * d) > (c * b) if b * d < 0

(假设没有发生溢出)

另一答案

这很简单。 (一条建议:如果运算符不修改对象,则使用const引用...)

bool Fraction::operator<(const Fraction &that) const

    unsigned long long num1 = this->num * that.denom;
    unsigned long long num2 = that.num * this->denom;
    return num1 < num2;


bool Fraction::operator==(const Fraction &that) const

    // I'm too lazy to do more maths, so I cheat
    return !(*this < that || that < *this);

请注意,这不会处理已签名的数字(显然),这是作为练习留给您的。

以上是关于对于分数类型,重载运算符<,==的主要内容,如果未能解决你的问题,请参考以下文章

C++类和对象--运算符重载

c++中运算符重载

如何使用运算符重载来简化两个分数的添加?

重载运算符

重载运算与类型转换——函数调用运算符,重载类型转换与运算符

重载运算与类型转换)