为什么不一元加上括号

时间:2018-01-14 22:38:24

标签: c++ operator-overloading

考虑存在一个函数normalize,它将整数规范化为最简单的形式并考虑此代码

#include <cstdio>

class Rational {
public:

    Rational(int top = 0, int bottom = 1) : t(top), b(bottom) { normalize(t, b); }
    Rational& operator +=(Rational &val) {
        t = t * val.b + val.t * b;
        b *= val.b;
        normalize(t, b);
        return val;
    }
    void Print(const char *s) const {
        fprintf(stdout, "%s = %d/%d\n", s, t, b);
    }
private:
    int t, b;
};
int main() {
    Rational r1(1, 2), r2(1, 3), r3(1, 4);
    (r1 += r2) += r3;
    r1.Print("r1");
    r2.Print("r2");
    r3.Print("r3");
    return 0;
}

代码取自Technion Institute of Technology exam.,我无法理解为什么r2会改变甚至更改。“ 将定义更改为不通过引用只会创建副本,并且不会发生任何变化。

1 个答案:

答案 0 :(得分:1)

这是一个棘手的问题。关键是,operator+=会返回对val(右侧)的引用,而不是正常所期望的左侧*this

因此(r1 += r2)会修改r1,但会返回对r2的引用,然后通过调用operator+=并使用参数r3修改该引用。

因此,将要打印的值为

r1 = 1/2 + 1/3 = 5/6
r2 = 1/3 + 1/4 = 7/12
r3 = 1/4