Java equals() 和 C++ 运算符 == 有什么区别?

2024-01-02

In 关于使用的问题typeid https://stackoverflow.com/questions/6751061/when-is-using-typeid-the-best-solution是C++,我建议可以用它来比较对象比较中的类型。我没见过太多,但我有 Java 的equals心里。

进一步研究 Java https://stackoverflow.com/questions/27581/overriding-equals-and-hashcode-in-java,情况似乎是这样:Some say https://stackoverflow.com/questions/27581/overriding-equals-and-hashcode-in-java/32223#32223应该比较两个对象的实际类,并且some say https://stackoverflow.com/questions/27581/overriding-equals-and-hashcode-in-java/55736#55736 instanceof是正确使用的工具,可能需要双重调度。当然,在某些情况下,两者之一肯定更合适,但至少两种选择均被考虑 http://www.angelikalanger.com/Articles/JavaSolutions/SecretsOfEquals/Equals.html.

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

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

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


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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java equals() 和 C++ 运算符 == 有什么区别? 的相关文章

随机推荐