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

时间:2012-06-11 13:22:47

标签: 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 ;
}

4 个答案:

答案 0 :(得分: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);
}

在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;
}

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

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

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

答案 1 :(得分:13)

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

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

答案 2 :(得分:5)

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

答案 3 :(得分:1)

您可以使用typeid运算符。