如果我为类Foo编写了一个运算符==(在C ++中),究竟会发生什么?它是否将每个数据成员相互比较?
class Foo
{
private:
int bar;
public:
bool operator==(const Foo other&)
{
return *this == other; //what?
//is this the same as bar == bar?
}
}
答案 0 :(得分:16)
上面的代码将递归调用自己,直到你得到堆栈溢出(窃笑)并且程序崩溃。方法本身(你写的那个)是相等运算符,然后在正文中再次显式调用。
重写等于运算符(operator==
)背后的想法是,您可以自己决定应该如何实现相等性。所以你可能想让你方法的主体做类似的事情:
return this->bar == other.bar;
哪个会做你最想要的。
你可能不希望C ++对于平等“智能”并自动进行成员比较的原因之一是你可能对“平等”的含义与C ++标准体有不同的看法。
例如,只有当指针指向完全相同的对象时,您可能会认为具有指针成员的类是相等的,或者如果指向对象在成员上相等,您可能只认为它们相等。或者它们可能是(注意:这里的坏习惯,但人们仍然这样做)指向一些随机地址,因为它们尚未初始化并且取消引用它们将导致崩溃(“你”可能因为一些标志变量而知道这一点,但是当C ++试图“帮助”取消引用它时,C ++就不会这样做了。