重写==操作符用于类比较

Overriding == operator for class comparison C++

本文关键字:比较 操作符 重写 用于      更新时间:2023-10-16

我有一个类S,它包含几个公共成员变量:

class S{
public:
    int l1;
    int r1;
    int b;
    int l2;
    int r2;
    // constructor and methods....
}

我想比较类,所以我重写了==操作符,像这样:

bool operator==(const S &s1, const S &s2){
  if(s1.l1 != s2.l1)
    return false;
  if(s1.l2 != s2.l2)
    return false;
  if(s1.r1 != s2.r1)
    return false;
  if(s1.r2 != s2.r2)
    return false;
  if(s1.b != s2.b)
    return false;
  return true;
}

然而,这根本不起作用-当我通过创建两个指向S对象的指针并打印S1 == S2来测试它时,结果是0,并且我知道成员变量是相等的,因为我也打印它们。

我重写操作符的方式有问题吗?

它是否与我比较指针到S对象而不是S对象本身的事实有关?

比较两个指针时,检查它们是否指向相同的地址。如果你想使用你的操作符-取消引用它们:

S *p1 = ...;
S *p2 = ...;
if( *p1 == *p2 ) // would compare objects rather than pointers

注意:在解引用指针之前,一定要确保它们不等于nullptr

然而,这根本不起作用-当我通过创建两个指向S对象的指针并打印S1 == S2来测试它时,结果是0

这是因为==操作符适用于对象,而不是指针。指针总是使用内置的比较来比较,因此你会得到一个false,除非指针实际上指向相同的对象。

如果你想比较指针所指向的对象,你需要这样做:

if (*s1 == *s2)
    ...

这是因为你在比较指针。指针只是内存地址,所以内存地址必须是不同的,如果他们被单独分配。比较*S1 == *S2来检查它们指向的对象是否相同。

同样,对于这样的对象(没有指针或任何东西),默认操作符==应该可以很好地工作。如果你没有定义运算符,编译器会为你创建一个运算符==在这种情况下,它只会比较int型,它知道怎么做。