【问题标题】:C++ operator Overloading the is equal operatorC++ 运算符重载 is equal 运算符
【发布时间】:2017-08-15 08:18:38
【问题描述】:

我正在尝试学习 C++ 中的运算符重载。

我按照教程重载了“==”运算符,以便能够比较它们之间的类对象。像这样:

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

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

== 运算符在像这样被重载后如何仍然可以用于比较整数/浮点数/双精度/等?在我的情况下,当它看到 Vector2 类对象作为第二个参数时,它的行为就像在重载版本中一样,而当它看到其他东西时,它的行为正常?

还有另一个问题:我有一个class classA 和一个class classB,它们都有两个变量,只是名称不同。我为classA objA 创建了两个对象,一个为classB objB 创建了一个对象,并使用默认构造函数给出了一些值。

现在是否可以重载operator == 以进行类似if(objA==objB) 的比较?或者表达式中的操作数是否需要属于同一类型? classA 还是 classB

请帮我解决这个问题。感谢您的阅读!

【问题讨论】:

  • x_y_是什么类型的?
  • 您应该添加更多来源信息。
  • 您为Vector2 定义了==,而不是为int。重载根据定义不同类型/参数的实现。其他实现不受影响。但是,如果您要重新定义 ==int,那就另当别论了。
  • 如何创建一个最小、完整和可验证的示例stackoverflow.com/help/mcve
  • 运算符重载与所有其他重载一样工作。 (重载运算符与常规函数完全相同,但名称很时髦。)如果您研究“正常”重载以及拥有转换构造函数的潜在惊喜,您的所有问题都可以得到解答。

标签: c++ object overloading operator-keyword


【解决方案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

【讨论】:

    猜你喜欢
    • 2012-11-26
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    相关资源
    最近更新 更多