我试图在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)
这样的比较吗?或者表达式中的操作数需要是同一类型吗? classA
或classB
?
请帮我澄清一下。谢谢你的阅读!
答案 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;
}
此代码编译,但第二个断言失败,因为5被转换为S
。