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

Overload operator < , == for a fraction type

本文关键字:类型 运算符 lt 重载      更新时间:2023-10-16

我正在尝试重载运算符<在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;
}
}

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

我不知道要比较

利用

(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);
}

请注意,这并不涉及有符号的数字(显然),这只是一个练习。

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

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

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

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

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

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