我有一个包含几个公共成员变量的类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
个对象本身进行比较的事实有关?
答案 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以检查它们指向的对象是否相同。
此外,对于这样的对象(没有指针或任何东西),默认运算符==应该可以正常工作。如果您没有定义一个运算符,编译器将为您创建一个运算符==,在这种情况下,它只会比较它知道如何操作的整数。