是否需要使用相等操作符声明const关键字?



我正在观看一个关于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
}
}

为什么这是必须的

它不是——但它是一个很好的实践——如果不能以这种方式实现它,将严重抑制与标准(和其他)库交互的能力。

  1. 您的目的是不改变您通过引用获取的参数值。如果该参数是const,并且您将其取为const&,那么您仍然可以在函数中读取它。如果你的声明只说Data& rhs,它将无法编译。

  2. 您的目标不是改变*this(==操作符的左侧)的状态。这同样适用于这里。如果*thisconst,则成员函数上的const限定符使得仍然可以使用该成员函数。

最新更新