2009-07-28 89 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