用于类比较C ++的覆盖==运算符

时间:2015-09-15 20:24:42

标签: c++ boolean override

我有一个包含几个公共成员变量的类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个对象本身进行比较的事实有关?

3 个答案:

答案 0 :(得分:4)

比较2个指针时,检查它们是否指向同一地址。如果您想使用您的运营商 - 取消引用它们:

S *p1 = ...;
S *p2 = ...;

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

注意:在取消引用它们之前,请务必确保指针不等于nullptr

答案 1 :(得分:3)

  

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

这是因为运算符==适用于对象,而不是指针。指针总是使用内置比较进行比较,因此返回false,除非指针实际指向同一个对象。

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

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

答案 2 :(得分:1)

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

此外,对于这样的对象(没有指针或任何东西),默认运算符==应该可以正常工作。如果您没有定义一个运算符,编译器将为您创建一个运算符==,在这种情况下,它只会比较它知道如何操作的整数。