为什么运算符重载实现中的两个静态对象在c ++中总是相等的?

sar*_*rda 3 c++ static object

我读了有效的c ++.他们给出了一个例子如下:

class Rational{
    public : Rational (int num=0, int deno=1);
    private : int n,d;
              friend Rational operator*(const Rational &lhs, const Rational &rhs);

 }


 Rational& operator*(const Rational& lhs, const Rational& rhs)
 {
     static Rational result;
     result = f(lhs.n*rhs.n, lhs.d*rhs.d) //some function f which multiply num 
                                          //and denom which returns Rational type

      return result;
 }

  bool operator==(const Rational& lhs, const Rational& rhs);

  int main()
  {
        Rational a,b,c,d;
        .....
        if((a*b)==(c*d)){
        ....
        }
        else {
        .....
        }
  }
Run Code Online (Sandbox Code Playgroud)

为什么compariosion(a*b)==(c*d)总是评估为真?

==运算符将被评估为(运算符==(运算符*(a,b),运算符*(c,d)))有效C++说 - 运算符==将被要求比较静态Rational对象的值inside operator*,其中包含*运算符内的静态Rational对象的值.为什么这些静态值总是相等?

jro*_*rok 5

此比较中的两个表达式都((a*b)==(c*d))返回对同一对象的引用 - static Rational result从内部operator*.它具有静态存储持续时间,它从执行流程第一次到达它的那一刻开始,直到程序退出(换句话说,它在调用之间持续存在operator*).

除非operator==做一些奇怪的事情,否则一个对象应该与自己相等,结果总是如此.