我看到了以下代码:
struct Point
{
int x,y;
bool operator <(const Point &p) const {
return x<p.x||(x==p.x&&y<p.y);
}
};
我不明白这是什么东西:
bool operator <(const Point &p) const {
return x<p.x||(x==p.x&&y<p.y);
}
它是什么?
我看到了以下代码:
struct Point
{
int x,y;
bool operator <(const Point &p) const {
return x<p.x||(x==p.x&&y<p.y);
}
};
我不明白这是什么东西:
bool operator <(const Point &p) const {
return x<p.x||(x==p.x&&y<p.y);
}
它是什么?
看,很简单。
您已经定义了一个表示点的结构。假设你有两个这样的结构,有问题的代码为它们定义了一个比较运算符,这样你就可以编写类似的东西
if (pt1 < pt2) { ...
编译器如何处理<
符号?在 C++ 中,它执行以下操作:表达式pt1 < pt2
被解释为pt1.operator < (pt2)
. 即调用具有特殊名称对象的方法,参数等于。operator <
pt1
pt2
让我们看看它在做什么。const Point &p
在其参数中表示正在比较的另一个操作数。const
表示我们不会修改操作数(这允许编译器生成更有效的代码),并且&
意味着我们不是复制struct
传递的,而是使用实际Point
实例(这再次更快,因为没有为比较)。
现在,表达式x<p.x
检查x
左侧操作数的值(它是this
对象,即方法正在运行的上下文中的对象)* 与x
右侧操作数的值是否相符。接下来,代码检查左手x
等于右手的情况,因此y
比较 's。
*对于语言纯粹主义者:措辞不准确,但对于面向初学者的解释应该没问题。
operator
在这种特殊情况下,它是 , 的定义operator <
。当有人这样做时,它会被调用:
Point a, b;
if( a < b )
{
//...
}
<
它是一个重载运算符的成员函数
Point a,b;
a < b; // the member function is used here.
在 C++ 中,结构与类非常相似。您看到的是作为实例方法的运算符定义。const
它将“this”点与作为参数“p”引用的(不可修改的)点进行比较,并且由于参数列表之后的原因,不允许修改“this”点。