【问题标题】:What is the difference between Java's equals() and C++'s operator ==?Java equals() 和 C++ 运算符 == 有什么区别?
【发布时间】:2011-10-09 16:37:45
【问题描述】:

a question regarding the use of typeid 是 C++,我建议它可以用来比较对象比较中的类型。我没有看到它做太多,但我想到了 Java 的 equals

Looking into Java a bit more,似乎是这样:Some say 应该比较两个对象的实际类,some say instanceof 是正确使用的工具,可能带有双重调度。当然,在某些情况下,两者中的一个肯定更合适,但至少是both options are considered

在 C++ OTOH 中,我几乎找不到用于比较实际类型的代码。在大多数情况下,使用双重分派(dynamic_cast),我找不到任何人坚持在相等检查开始时进行快速类型比较是正确的做法。

我想知道为什么多态类型比较问题在 Java 中有两种可接受的解决方案,而在 C++ 中似乎只有一种被认为是最佳实践?是否存在显着的技术差异,或者只是方法不同?

注意:我的说法是基于印象,而不是具体知识。如果它们是错误的,并且 Java 和 C++ 在这方面确实相似 - 或者由于上述以外的原因而有所不同,那么这显然是一个可以接受的答案。

【问题讨论】:

  • 在 c++ 中 == 可以重载 - 所以它取决于上下文...
  • @Schnommus:在 Java 中,equals 可以被覆盖。差别不大。
  • @Ben Voigt:好点。如果不是为了读者,我会删除我的评论
  • 在 C++ 中,类不会自动附带operator== 方法。如果一个类需要这个能力,它必须重载operator== 方法。

标签: java c++ equals language-comparisons equality-operator


【解决方案1】:

在 Java 中,所有类型最终都派生自 ObjectObject 定义了一个虚函数Object.equals(Object other),所以你 可以将任何事物与其他事物进行比较,无论是否 这是否有意义。在 C++ 中,没有通用基础,并且 == 没有隐含的定义。 == 通常只有 在有意义时被覆盖,用于比较 相同的类型,如果你写废话,编译器会抱怨 代码。在存在继承层次结构的情况下,它是, 当然,由作者决定==是否有意义 (我通常不会,但也有很多例外),如果 所以,对于比较对象的含义应该是什么 不同种类。在层次结构内部或外部:它 在BigInteger 和之间支持== 可能是有意义的 BigFloat,例如,即使类不相关 继承。

您在 C++ 中没有看到太多讨论的问题的原因是, 当然,因为你没有定义 == 除非有一些 它的逻辑意义,然后你根据 逻辑意义。在 Java 中,您通常必须定义 equals 无论如何,所以你必须“发明”一些含义,然后你得到 讨论发明的含义应该是什么。

【讨论】:

    【解决方案2】:

    一个明显的区别是Javaequals是一个虚方法(因为所有Java方法都是默认的),所以会根据它的目标做动态调度。

    C++ operator== 重载是静态解析的,但如果您想要多态行为,很容易委托给虚函数。

    除了多态性的不同,所有其他行为完全取决于特定类型的实现者(或者在 C++ 情况下,独立的operator== 的实现者)。

    【讨论】:

      【解决方案3】:

      Java 对所有引用类型都有一个基类型——所有引用类型都扩展 java.lang.Object(模 null 破坏了 equals 对称性,因为 (null).equals(...) 是一个错误)。

      所以您可以在 Java 中说“这两个 Java 引用是否指向等价的东西?”在不知道引用类型的情况下,Java 有一个地方可以挂起其基本引用类型 java.lang.Objectequals(Object) 方法,而 C++ 则没有。在 C++ 中没有这样的基类型,因此您有大量不同的 == 运算符,编译器必须能够静态地找出要使用的。

      由于 Java 对象始终带有 RTTI,并且所有对实例方法的分派都被指定为虚拟的,因此在代码中定义等价类时,您可以使用反射来做一些使用 C++ 对象根本无法做到的事情。

      【讨论】:

      • Java == 似乎与这个问题无关。
      【解决方案4】:

      使 C++ == 等同于 Java 的 equals 假设您已覆盖 == 运算符以在 C++ 中执行“深度等于”,而 Java“等于”则执行相同操作。

      【讨论】:

      • 就像我说的,你必须重写 equals 来做深度相等。请参阅 Joshua Bloch “Effective Java”第 3 章。
      • 很公平。删除我原来的评论。
      猜你喜欢
      • 2022-12-14
      • 2011-05-29
      • 2011-11-23
      • 1970-01-01
      • 1970-01-01
      • 2022-12-04
      相关资源
      最近更新 更多