代码之家  ›  专栏  ›  技术社区  ›  jkeys

比较两个对象时会发生什么?

  •  2
  • jkeys  · 技术社区  · 15 年前

    如果我为类FO(C++中)编写了一个运算符==,那么到底发生了什么呢?它是否将每个数据成员相互比较?

    class Foo
    {
       private:
          int bar;
    
       public:
          bool operator==(const Foo other&)
          {
             return *this == other; //what?
             //is this the same as bar == bar?
          }
    }
    
    1 回复  |  直到 15 年前
        1
  •  16
  •   Adam Batkin    15 年前

    上面的代码将递归地调用自己,直到您得到一个堆栈溢出(snicker)和程序崩溃为止。方法本身(您编写的方法)是相等运算符,然后在主体内显式调用它。

    重写相等运算符背后的思想( operator== )你可以自己决定如何实现平等。因此,您可能希望使方法体执行如下操作:

    return this->bar == other.bar;
    

    它会做你最想做的。

    您可能不希望C++对“平等”进行“智能化”并自动进行成员智能比较的原因之一是,您可能对“平等”意味着什么而不是C++标准体有非常不同的想法。

    作为一个例子,您可能认为一个具有指针成员的类只有在指针指向完全相同的对象时才是相等的,或者只有当指向对象的是memberwise相等时才认为它们是相等的。或者它们可能是(注意:这里的不良操作,但人们仍然这样做)指向一些随机的地址,因为它们还没有被初始化,并且撤销它们会导致崩溃(“你”)可能因为某种标志变量而知道这一点,但是当C++试图“帮助”解引用时,它不会。