为什么运算符重载实现中的两个 Static 对象在 c++ 中始终相等

Why two Static object inside an operator overload implementation will always be equal in c++?

本文关键字:对象 Static c++ 两个 实现 重载 运算符 为什么      更新时间:2023-10-16

我被读取了有效的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) 总是计算为 true?

== 运算符的计算结果为 if(operator==(operator*(a,b),operator*(c,d)))有效C++说 - 将要求运算符 == 将运算符 * 中的静态 Rational 对象的值与 * 运算符内的静态 Rational 对象的值进行比较。为什么这些静态值将始终相等?

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

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

因为函数中的静态变量对于此函数的所有调用都是唯一的。这意味着何时或在哪个对象(对于成员函数)上调用函数并不重要,静态变量将是唯一的,并在调用之间保持其值(而局部变量将分别在函数的开头和结尾构造和销毁。

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

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

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