3

我正在阅读有效的 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 {
        .....
        }
  }

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

== 运算符将被评估为 if(operator==(operator*(a,b),operator*(c,d))) Effective C++ 说 - 运算符 == 将被要求比较静态 Rational 对象的值内部运算符 * 与 * 运算符内部的静态 Rational 对象的值。为什么这些静态值总是相等的?

4

3 回答 3

5

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

除非operator==做一些奇怪的事情,否则一个对象应该等于它自己,结果将永远为真。

于 2013-09-30T12:38:37.377 回答
2

因为函数中的静态变量对于对该函数的所有调用都是唯一的。这意味着函数被调用的时间或对象(对于成员函数)无关紧要,静态变量将是唯一的,并在调用之间保持其值(而局部变量将分别在函数的开头和结尾。

在您的情况下,这将发生:

  • 首先,两者operator*(a,b)operator*(c,d)被称为
  • 在每次调用中,您的静态变量的值都会被更新,因此唯一的变量将在比较之前更新两次(这很重要)
  • 然后,运算符比较两个调用返回的值,这是对静态变量的引用(最终是这个变量与自身的比较)
于 2013-09-30T12:42:53.507 回答
1

由于 operator* 返回对同一静态对象的引用,因此 operator== 只是将此对象与自身进行比较。因此,始终返回 true。

于 2013-09-30T12:39:48.693 回答