考虑存在一个函数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会改变甚至更改。“ 将定义更改为不通过引用只会创建副本,并且不会发生任何变化。
答案 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