Какие методы с квалификатором const существуют и зачем они нужны в C++
Что проверяют
Понимаете ли вы const-корректность как часть интерфейса класса, а не как косметику. После определения обычно спрашивают про mutable, перегрузку по const и про то, безопасно ли вызывать константный метод из нескольких потоков.
Как отвечать
Константный метод объявляется с const после списка параметров: int size() const;. Внутри него this имеет тип const T*, поэтому менять поля и вызывать неконстантные методы нельзя. Главное следствие: у объекта, доступного через const T&, можно вызвать только константные методы. Параметры по константной ссылке встречаются повсюду, и геттер без const сразу делает класс неудобным.
Что стоит назвать:
- перегрузка по
const: параT& operator[](size_t)иconst T& operator[](size_t) const, как уstd::vector. Компилятор выбирает версию по константности объекта; mutable: поле, которое можно менять и в константном методе. Законно для кеша, счётчика обращений,std::mutex, то есть того, что не входит в наблюдаемое состояние;- логическая и побитовая константность:
constзащищает только сами поля. Если поле указатель, объект по нему менять можно, константность неглубокая; распространить её помогаетstd::experimental::propagate_const; - ref-квалификаторы: с C++11 метод можно пометить
&или&&и отличать вызов на временном объекте; - deducing this: в C++23 один метод с явным параметром
this auto&& selfзаменяет пару из константной и неконстантной перегрузки.
Константными не бывают статические методы, конструкторы и деструкторы.
Где спотыкаются
Называют главной пользой оптимизацию. Компилятор почти ничего не выигрывает: из-за mutable, const_cast и алиасинга он не может считать объект неизменным. Польза в контракте и проверке на этапе компиляции.
Считают const_cast безопасным способом снять константность. Изменение объекта, изначально объявленного const, это неопределённое поведение.
Забывают про потоки. Стандартная библиотека исходит из того, что константные методы можно вызывать параллельно, поэтому mutable-кеш без мьютекса или атомика даёт гонку данных.