相等运算符是否需要声明 const 关键字?

Dan*_*any 2 c++ struct constants operator-keyword

我正在观看这个关于 C++ 最佳实践的研讨会,演讲者给出了以下代码示例:

struct Data{
  int x;
  int y;

  bool operator==(Data &rhs){
   return x == rhs.x && y == rhs.y;
}
};
Run Code Online (Sandbox Code Playgroud)

然后他问这段代码中缺少什么。作为一个新手,我以为没有遗漏什么,但后来他指出const缺少 2 个关键字,如下所示:

struct Data{
  int x;
  int y;

    bool operator==(const Data &rhs) const{
     return x == rhs.x && y == rhs.y;
  }
};
Run Code Online (Sandbox Code Playgroud)

现在我认为这就像一个不修改对象的承诺。但有人可以解释为什么这些const关键字是必要的吗?

Ted*_*gmo 6

const如果您的 中的两个位置都没有operator==,则不会编译:

void foo(const Data& lhs, const Data& rhs) {
    if(lhs == rhs) { // requires `operator==(const Data &rhs) const`
       // do stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么这是强制性的

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

  1. 您的目标不是更改您引用的参数值。如果该参数是const并且您通过 a 获取它,const&那么您仍然可以在函数中读取它。如果你的声明只说了Data& rhs,它就不会编译。

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