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

标签 c++ object static

我正在阅读 effective 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 对象的值进行比较。为什么这些静态值总是相等的?

最佳答案

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

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

关于c++ - 为什么运算符重载实现中的两个静态对象在 C++ 中总是相等的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19094418/

相关文章:

javascript - 无法像标准对象一样通过tiles[i-1]访问 "2d"对象的属性(javascript)

C++ 指向函数的静态成员指针——如何初始化它?

java - 单例类的优势是什么?

c++ - 通过具有虚函数的基类保护析构函数以禁用删除调用是个好主意吗

c# - 对象类型和装箱

javascript - 用javascript中的函数交换对象的两个属性

loops - Nginx - 在 proxy_pass 中添加变量时无限重新加载

c++ - 具有 C++ 迭代器参数的多功能函数

PHP popen 应用程序无法打开共享对象

c++ - 构建 Qt 5.3 时出错