簡體   English   中英

Java 的 equals() 和 C++ 的運算符 == 有什么區別?

[英]What is the difference between Java's equals() and C++'s operator ==?

關於typeid使用的問題是 C++ 中,我建議它可以用於比較對象比較中的類型。 我沒有看到它做太多,但我想到了 Java 的equals

仔細研究 Java ,似乎是這樣: 有人說應該比較兩個對象的實際類, 有人說instanceof是正確的工具,可能使用雙重調度。 當然,在某些情況下,兩者中的一個肯定更合適,但至少兩個選項都被考慮在內

在 C++,OTOH 中,我幾乎找不到比較實際類型的代碼。 在大多數情況下,使用雙重分派(使用dynamic_cast ),我找不到任何人堅持快速類型比較是在相等檢查開始時做的正確事情。

我想知道為什么多態類型比較的問題在 Java 中有兩個可接受的解決方案,而在 C++ 中似乎只有一個被認為是最佳實踐? 是否存在顯着的技術差異,或者只是不同的方法?

注意:我的說法是基於印象,而不是具體知識。 如果它們是錯誤的,並且 Java 和 C++ 在這方面確實相似 - 或者由於上述以外的原因而有所不同,這顯然是一個可以接受的答案。

In Java, all types ultimately derive from Object , and Object defines a virtual function Object.equals(Object other) , so you can compare anything with anything else, regardless of whether it makes sense or not. 在 C++ 中,沒有通用基礎,也沒有==的隱式定義。 ==通常僅在有意義時才被覆蓋,用於比較相同類型的對象,如果您編寫無意義的代碼,編譯器會抱怨。 在有 inheritance 層次結構的情況下,當然由作者來決定==是否有意義(我通常沒有,但有很多例外),如果是,它應該意味着什么關於比較不同類型的對象。 在層次結構內部或外部:例如,在BigIntegerBigFloat之間支持==可能是有意義的,即使這些類與 inheritance 無關。

你沒有看到C++中討論的問題的原因當然是因為你不定義==除非它有一些邏輯含義,然后你根據邏輯含義定義它。 在 Java 中,您通常必須無論如何定義equals ,因此您必須“發明”一些含義,然后討論發明的含義應該是什么。

一個明顯的區別是 Java equals是一個虛方法(因為所有 Java 方法都是默認的),所以會根據它的目標做動態調度。

C++ operator==重載是靜態解決的,但如果你想要多態行為,很容易委托給虛擬 function。

除了多態性的差異之外,所有其他行為完全取決於特定類型的實現者(或者在 C++ 的情況下,獨立operator==的實現者)。

Java has a single base-type for all reference types -- all reference types extend java.lang.Object (modulo null which breaks equals symmetry since (null).equals(...) is an error).

所以你可以在 Java 中說“這兩個 java 引用是否指向相同的東西?” without knowing anything about the types of the references, so Java has a place to hang an equals(Object) method of its base reference type, java.lang.Object in a way that C++ does not. 在 C++ 中沒有這樣的基本類型,所以你有許多不同的==運算符,編譯器必須能夠靜態地找出使用哪個。

由於 Java 對象總是攜帶 RTTI 並且所有對實例方法的分派都指定為虛擬的,因此在代碼中定義等價類時,您可以使用反射來做一些您無法使用 C++ 對象做的事情。

使 C++ == 等效於 Java 的 equals 假設您已經覆蓋了 == 運算符以在 C++ 和 ZD52387880E1EA22817A72D37592138 中執行“深度等於”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM