在c ++中是否有等效的Java equals方法?

use*_*898 9 c++ variables comparison

有类似Java的东西equals()吗?要比较对象是否是同一类型?

public boolean equals(Object obj) {
    if (obj == null || !(obj instanceof ViewMode)) {
        return false;
    }

    ViewMode dm = (ViewMode) obj;
    return dm.width == w
        && dm.h == h
        && dm.b == b
        && dm.f == f;
}

public int hashCode() {
    return w ^ h ^ f  ^ b ;
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*sop 15

对于您的示例的惯用语,您将定义operator==如下:

friend bool operator==(const ViewMode &lhs, const ViewMode &rhs) {
    return (lhs.w == rhs.w) && the rest;
}

friend bool operator!=(const ViewMode &lhs, const ViewMode &rhs) {
    return !(lhs == rhs);
}
Run Code Online (Sandbox Code Playgroud)

在C++中,您通常不会编写一个函数来允许将ViewMode对象与完全没有任何关系的东西进行比较ViewMode.我想如果你真的希望这个比较返回false,而不是拒绝编译,那么你可以添加一些模板操作符(作为自由函数,在类外):

template <typename T>
bool operator==(const ViewMode &, const T&) {
    return false;
}

template <typename T>
bool operator==(const T &, const ViewMode&) {
    return false;
}
Run Code Online (Sandbox Code Playgroud)

但我真的不推荐它.Java习惯用法不适用于C++,因为在C++中你几乎不应该有一个对象,但不知道它的类型.

如果你希望你的equals函数是虚函数,那么最好编写一个equals()虚函数,而不是使用operator==它.你可以把它写成const ViewObject &as参数,所以不需要任何等价的instanceof检查.这也是一样,因为C++没有任何方法可以获取完全未知类型的对象并测试它是否是指定类型的实例.

您很少需要C++中的多态等号函数,但如果您在其中使用它std::unordered_map,那么您需要为其指定额外的模板参数unordered_map.给它一个相等比较函数,它equals在一个或另一个上接受两个指针和调用,以及一个做一些合理的散列函数.


bma*_*ies 13

不,C++没有像Java这样的全局类型模型.没有Object所有其他类型继承的类型,因此没有equals为所有类定义的方法(如).

C++提供了一个框架,用于构建具有通用比较操作的类型模型:operator ==.您可以在所有类中构建所有这些实现,以便它们正确交互.但是没有可比的默认实现Object.equals.

  • 另外需要注意的是,惯用的C++*通常*不需要像Java那样从基类中进行向下转换. (2认同)

Mar*_*say 5

您可以operator==在班级中定义.