История вопроса:
Квалификатор const в C++ появился из соображений безопасности: отметить те функции, которые гарантированно не меняют внутреннее состояние объекта. В контексте классов const-методы обязательны для проектов, где требуется строгая инкапсуляция и защита от случайных ошибок.
Проблема:
Если забывать отмечать геттеры, вспомогательные функции и проверочные методы как const, их нельзя вызвать для const-объекта. Без const-методов компилятор не сможет предотвратить нежелательные изменения данных.
Решение:
Добавлять const в объявлении метода класса после сигнатуры (а не до неё!) Это позволяет вызывать метод для объектов как обычных, так и объявленных как const, избавляет от ошибок изменения состояния. Внутри такого метода нельзя изменять члены класса (кроме mutable), доступно только чтение.
Пример кода:
class Counter { int value; public: int getValue() const { return value; } // Можно вызывать для const Counter }; void print(const Counter& c) { std::cout << c.getValue(); }
Ключевые особенности:
Где пишется const у метода: перед возвращаемым значением или после скобок?
Только после скобок: int getValue() const; — ошибка писать перед типом возвращаемого значения (например, const int get()).
Может ли const-метод вызывать не-const методы класса?
Нет, const-метод может вызвать только другие const-методы, если объект — const.
Чем отличается const в методе от const в возвращаемом значении?
int get() const (метод не меняет состояние)
const int get(); (возвращаемое значение нельзя изменить, но метод может менять внутренние данные)
В классе пропущено const у метода, который не изменяет состояние. Его нельзя вызвать для константного объекта, что мешает использовать класс в инструментах анализа и при работе с API.
Плюсы:
Минусы:
Все геттеры, проверки и вспомогательные методы объявлены с const, тесты покрыты для const- и не-const-объектов.
Плюсы:
Минусы: