2009-07-28 34 views
2

如果我为Foo类写了一个运算符==(用C++),究竟发生了什么?它是否将每个数据成员相互比较?比较两个对象时会发生什么?

class Foo 
{ 
    private: 
     int bar; 

    public: 
     bool operator==(const Foo other&) 
     { 
     return *this == other; //what? 
     //is this the same as bar == bar? 
     } 
} 

回答

16

上面的代码将调用自身递归,直到你得到一个堆栈溢出(窃笑)和程序崩溃。方法本身(你写的那个)是相等运算符,然后在体内明确再次调用它。

覆盖相等运算符(operator==)背后的想法是,您可以自行决定如何实现平等。所以你可能想让你的方法的主体做类似的事情:

return this->bar == other.bar; 

哪个会做你最想要的。

您可能不希望C++关于平等“智能”并自动进行成员智能比较的原因之一是,您可能对于“平等”的含义与C++标准体的含义截然不同。

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

+0

哦,好的,这是有道理的。感谢您的解释! – jkeys 2009-07-29 00:09:27