我正在观看一个关于c++最佳实践的研讨会,演讲者给出了这个代码示例:
struct Data{
int x;
int y;
bool operator==(Data &rhs){
return x == rhs.x && y == rhs.y;
}
};
然后他问这段代码缺少了什么。作为一个新手,我认为没有什么遗漏,但后来他指出遗漏了2个const
关键字,比如:
struct Data{
int x;
int y;
bool operator==(const Data &rhs) const{
return x == rhs.x && y == rhs.y;
}
};
现在我认为这就像一个不修改对象的承诺。但是有人能解释一下为什么这些const
关键字是必要的吗?
如果您在operator==
的两个位置都没有const
,则无法编译:
void foo(const Data& lhs, const Data& rhs) {
if(lhs == rhs) { // requires `operator==(const Data &rhs) const`
// do stuff
}
}
为什么这是必须的
它不是——但它是一个很好的实践——如果不能以这种方式实现它,将严重抑制与标准(和其他)库交互的能力。
您的目的是不改变您通过引用获取的参数值。如果该参数是
const
,并且您将其取为const&
,那么您仍然可以在函数中读取它。如果你的声明只说Data& rhs
,它将无法编译。您的目标不是改变
*this
(==
操作符的左侧)的状态。这同样适用于这里。如果*this
是const
,则成员函数上的const
限定符使得仍然可以使用该成员函数。