重载运算符 - =在C ++中

时间:2012-10-01 00:48:40

标签: c++ overloading operator-keyword

我为operator-=为我的Rational-class定义了一个重载:

rational.hh:
class Rational {

public:
    Rational(int numerator, int denominator) : numerator(numerator), denominator(denominator)
    { }

    int getNumerator() const;
    int getDenominator() const;
    Rational& operator-=(const Rational& bar);

private:
    int numerator, denominator;

rational.cc:
Rational& Rational::operator-=(const Rational& subtracted) {
    Rational result((*this).getNumerator()*subtracted.getDenominator() - (*this).getDenominator()*subtracted.getNumerator(), (*this).getDenominator()*subtracted.getDenominator());
    return *this;
}

代码在没有警告的情况下编译,但这段代码不会改变r:

的值
  Rational r(1, 1);
  r -= Rational(1, 2);

任何想法为什么?

3 个答案:

答案 0 :(得分:2)

您的-=运营商应该更改numeratordenominator的值,但事实并非如此。添加代码以将这些值设置为this,而不是创建result

Rational& Rational::operator-=(const Rational& subtracted) {
    numerator = (*this).getNumerator()*subtracted.getDenominator() - (*this).getDenominator()*subtracted.getNumerator();
    denominator = (*this).getDenominator()*subtracted.getDenominator();
    return *this;
}

答案 1 :(得分:2)

您永远不会在您的运算符中指定“this” - =!

您的函数创建一个临时Rational对象(称为“结果”)。然后,它会忘记“结果”并返回它。

您需要实际分配给this-> numerator和this->分母。

答案 2 :(得分:1)

就是这样,因为你没有改变对象。

您必须更改对象成员变量,而不是创建临时对象。

Rational& Rational::operator-=(const Rational& subtracted) {
    numerator = ...;
    denominator = ...;
    return *this;
}

你应该知道这个:

Rational result(...);

只创建本地对象。它与调用-=的对象无关。