一、引文
事情是这样的,我类似写了这样一段代码(简略版):
struct cvPoint {
cvPoint() {}
cvPoint(int a, int b) : x(a), y(b) {}
int x;
int y;
// 自定义结构体的 “==” 运算符重载
bool operator==(const cvPoint &b) {
bool temp = (this->x == b.x && this->y == b.y);
return temp;
}
};
bool isSame(const cvPoint &a, const cvPoint &b) {
if (a == b) {
return true;
} else {
return false;
}
}
int main() {
cvPoint a(1, 2);
cvPoint b(1, 3);
isSame(a, b);
return 0;
}
第一印象大家会觉得有问题吗? 实际上编译报错了
error: no match for ‘operator==’ (operand types are ‘const value_type’ )
然后我就纳闷了,将 isSame(a, b)函数删掉,将里面的内容移出来,发现不报错了
int main() {
cvPoint a(1, 2);
cvPoint b(1, 3);
if (a == b) {
return 1;
} else {
return 0;
}
return 0;
}
不禁陷入了沉思。。。。。。。
二、理解
首先怀疑的就是传参const + "&"导致的,果不其然真就是这样,怎么解释呢?查看资料,得出结论:
// “==” 运算符重载 一般需要加两个const
bool operator==(const cvPoint &b) const {
bool temp = (this->x == b.x && this->y == b.y);
return temp;
}
// 括号内第一个const表示传入的参数可以接收const也可以接收非const; 第二个const表示常量可以调用该函数