C ++运算符重载等于运算符

时间:2017-08-15 08:18:38

标签: c++ object overloading operator-keyword

我试图在C ++中学习运算符重载。

我已经按照教程重载了' =='运算符能够比较它们之间的类的对象。像这样:

bool Vector2::operator==(const Vector2& v) const
{
    return ( (x_==v.GetX()) && (y_==v.GetY()) );
}

我的班级中有两个变量(x_y_)。我已经从这个类中创建了两个对象,给出了一些值并对它们进行了比较,它运行得很好。 但后来我使用==运算符来比较整数,它也运行良好。现在我期待==运算符不能处理整数,因为我刚刚重载它以执行其他操作。但它仍然如此。所以我现在有点困惑。我有这个问题:

如果像这样过载后==运算符怎么来仍然可以用来比较整数/浮点数/双打/等?在我的情况下,当它看到一个Vector2类对象作为第二个参数时,它在重载版本中起作用,当它看到其他东西时,它是正常的吗?

另一个问题:我有一个class classA和一个class classB,其中包含2个变量,名称不同。我为classA objA创建了两个对象,为classB objB创建了一个对象,我给出了一些默认构造函数的值。

现在可以重载operator ==来进行像if(objA==objB)这样的比较吗?或者表达式中的操作数需要是同一类型吗? classAclassB

请帮我澄清一下。谢谢你的阅读!

1 个答案:

答案 0 :(得分:1)

如果您的Vector2类的构造函数带有int且未标记为explicit,则它允许将整数隐式转换为Vector2,如下所示例如:

#include <iostream>
#include <assert.h>

struct S
{
    S(int x) : x(x) {}

    bool operator==(const S& other) const
    {
        return x == other.x;
    }
    int x;
};

int main() {
    S s1{5};
    S s2{5};

    assert(s1 == s2);

    assert(!(s1 == 5));

    return 0;
}

Ideone

此代码编译,但第二个断言失败,因为5被转换为S