了解在 STL 映射中使用的运算符重载 'const' 语法

Understanding operator overloading 'const' syntax for use in STL map

我正在尝试理解 operator < 的运算符重载语法,其中第二个 const 字需要编译器才能满足。

bool operator < (const point& rhs) const {  // what's the rationale for the second const word here?

以这个为例 struct

struct point {
    int x;
    int y;

    point () : x(0), y(0) {}
    point (int _x, int _y) : x(_x), y(_y) {}

    point operator + (const point& rhs) {
        return point(this->x + rhs.x, this->y + rhs.y);
    }
    bool operator < (const point& rhs) const {
        return this->x < rhs.x;
    }
};

这将允许我将它用作 mymap 的键。

map<point,int> mymap;

末尾的const表示该函数不会改变调用它的对象。这允许在 const 个对象上调用函数。

第二个 const 是隐含参数 this 指向的对象的限定符。这意味着不允许该方法修改其对象。事实上,比较不需要 - 也不应该 - 修改被比较的对象。

方法声明末尾的外部 const 告诉编译器该方法的 *this 对象是 const.

std::map 将其键存储为 const 值。所以任何应用于键的运算符都需要标记为const,否则它们将无法编译。 std::map 默认使用 operator< 对其键进行排序并比较它们是否相等。

此外,作为良好做法,任何不修改 *this 内容的成员 method/operator 无论如何都应标记为 const。这样做让用户知道此类操作是只读的,并让编译器在 const 对象的表达式中使用它们。