Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java和x27之间的区别是什么;s等于()和C++';s运算符==? 在C++中,我建议它可以用来比较对象比较中的类型。我没有看到它做了很多,但我想到了Java的equals_Java_C++_Equals_Language Comparisons_Equality Operator - Fatal编程技术网

Java和x27之间的区别是什么;s等于()和C++';s运算符==? 在C++中,我建议它可以用来比较对象比较中的类型。我没有看到它做了很多,但我想到了Java的equals

Java和x27之间的区别是什么;s等于()和C++';s运算符==? 在C++中,我建议它可以用来比较对象比较中的类型。我没有看到它做了很多,但我想到了Java的equals,java,c++,equals,language-comparisons,equality-operator,Java,C++,Equals,Language Comparisons,Equality Operator,,情况似乎是这样的:应该比较两个对象的实际类,instanceof是正确的工具,可能需要双重分派。当然,在某些情况下,两种方法中的一种肯定更合适,但至少是这样 在C++、Otoh中,我几乎找不到代码,其中比较了实际类型。在大多数情况下,使用双重分派(与dynamic\u cast一起),我找不到任何人坚持在平等性检查开始时进行快速类型比较是正确的 我想知道为什么多态性比较问题在java中有两个可接受的解决方案,而C++中只有一个看起来是最好的实践?是否存在显著的技术差异,或者只是不同的方法 注:

,情况似乎是这样的:应该比较两个对象的实际类,
instanceof
是正确的工具,可能需要双重分派。当然,在某些情况下,两种方法中的一种肯定更合适,但至少是这样

<>在C++、Otoh中,我几乎找不到代码,其中比较了实际类型。在大多数情况下,使用双重分派(与
dynamic\u cast
一起),我找不到任何人坚持在平等性检查开始时进行快速类型比较是正确的

我想知道为什么多态性比较问题在java中有两个可接受的解决方案,而C++中只有一个看起来是最好的实践?是否存在显著的技术差异,或者只是不同的方法


注:我的主张是基于印象,而不是具体的知识。如果java和C++ C++在C++方面的错误是相同的,或者是因为上面的原因不同,那么java显然是一个可以接受的答案。做同样的事情。

一个明显的区别是Java
equals
是一个虚拟方法(因为默认情况下所有Java方法都是虚拟方法),所以会根据其目标进行动态调度

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


除了多态性的差异外,其他所有行为完全符合特定类型的实现者(或C++的情况下,独立代码< >运算符==/COD> >的实现者。

< P> java对于所有引用类型都有一个基类型——所有引用类型都扩展为<代码> java .Lang.Objs<代码>(模
null
打破了
等于
的对称性,因为
(null).等于(…)
是一个错误)

所以你可以在Java中说“这两个Java引用指向相同的东西吗?”而不知道引用的类型,所以Java可以挂起一个
equals(Object)<基本代码引用类型>代码> > java .ang.Objult<代码>,C++ C++没有这样的基本类型,因此你有很多不同的<代码>=< /COD>操作符,编译器必须能够静态地找出要使用的。

因为java对象总是携带RTI,并且所有的调度都被指定为一个实例方法,所以在定义代码中的等价类时,可以用反射来做的事情,C++中不能简单地使用C++对象。

在爪哇中,所有类型最终都是从<代码>对象< /代码>中派生出来的,而<代码>对象< /代码>。 定义一个虚拟函数
对象。等于(对象其他)
,因此 可以将任何东西与其他任何东西进行比较,无论 这是有意义的,不是。在C++中,没有通用的基础, 没有对
==
的隐式定义
==
通常仅为 在有意义时重写,用于比较 同样的类型,如果你写的是废话,编译器会抱怨 代码。如果存在继承层次结构,则, 当然,由作者决定
==
是否有意义 (我通常不会,但有很多例外),如果 那么,它对于比较 不同类型。在层次结构内部或外部:it 支持
=
之间的
=
可能有意义 例如,
BigFloat
,即使这些类与 继承权

你在C++中没有看到很多问题的原因是 当然,因为您不定义
==
,除非有一些 它的逻辑意义,然后根据 逻辑意义。在Java中,通常必须定义
等于
不管怎样,所以你必须“发明”一些意义,你会得到
讨论了什么是发明的含义。

在C++中>代码>=< /Cord>可以重载-所以它取决于上下文…@ SnimMuMs:在java中,代码>等于< /C>可以被重写。没有太大的区别。Ben Voigt:好点。如果不是读者的SaKein C++,我会删除我的评论,Cales不会自动地出现<代码>rator=
方法。如果一个类需要该功能,它必须重载
操作符==
方法。Java
=
似乎与这个问题无关。正如我所说,你必须重写equals才能执行深度equals。请参阅Joshua Bloch“有效Java”第3章。足够公平。删除我的原始评论。