Что делает const в объявлении метода?

Ключевое слово const в объявлении метода является одним из спецификаторов доступа и используется для указания, что этот метод не изменяет состояние объекта, на котором вызывается.

Когда метод объявлен как const, это означает, что он не может менять ни одно из членов данных объекта, а также не может вызывать немаркированные как const методы этого объекта, за исключением тех, которые являются const методами. Такой метод считается константным и применяется только к константным объектам или к объектам, которые объявлены как const.

Основная цель использования const в объявлении метода заключается в обеспечении безопасности и предотвращении неожиданных изменений состояния объекта. Это позволяет гарантировать, что метод не повлияет на состояние объекта и не нарушит инварианты данных.

К примеру, предположим, что у нас есть класс Car, у которого есть метод getSpeed(), который возвращает текущую скорость автомобиля. Если объявить этот метод как константный (const), это означает, что метод не изменяет состояние автомобиля и можно его вызывать на любом объекте Car, включая константные.

class Car {
public:
    int getSpeed() const {
        return speed;
    }

private:
    int speed;
};

Теперь, даже если создать константный объект типа Car, мы все равно сможем вызвать метод getSpeed() на этом объекте, потому что он не изменяет состояние объекта.

const Car myCar;
int speed = myCar.getSpeed(); // допустимо

Однако, если мы попытаемся изменить состояние объекта внутри константного метода, например, изменить значение переменной speed, то компилятор выдаст ошибку, так как такая операция не допускается.

class Car {
public:
    void setSpeed(int newSpeed) const { // ошибка компиляции
        speed = newSpeed;
    }

private:
    int speed;
};

В общем, использование const в объявлении метода позволяет явно указать, что данный метод не изменяет состояние объекта, что улучшает читаемость и безопасность кода.