const-correctness — это концепция в C++, которая определяет, как переменные, указатели, ссылки и методы помечаются как "только для чтения". Это повышает безопасность кода, делает интерфейсы классов более понятными и позволяет компилятору ловить ошибки на этапе компиляции, а не во время исполнения.
Использование const-квалификаторов важно потому, что:
Пример:
class MyArray { public: int getItem(size_t idx) const { // Не изменяет объект return arr[idx]; } void setItem(size_t idx, int value) { arr[idx] = value; } private: int arr[10]; };
Здесь метод getItem гарантирует, что не изменяет объект.
Чем отличается
void foo(const int* ptr);от
void foo(int* const ptr);?
Правильный ответ:
const int* ptr — указатель на константное значение, значение менять нельзя, указатель можно.int* const ptr — константный указатель на изменяемое значение, указатель менять нельзя, значение можно.История
В большом проекте был написан метод класса без const-квалификатора:int MyClass::getVal();Из-за этого невозможно было использовать объект класса как const reference, например, в функциях, работающих только с "только для чтения" объектами. Это ограничило повторное использование кода и привело к избыточному копированию объектов.
История
Разработчик по ошибке вернул ссылку на внутренние данные через неконстантный метод:int& MyClass::getInt();В результате клиентский код получил возможность изменить приватное поле класса, что привело к неожиданному изменению состояния и трудноуловимым багам.
История
Оставив константный параметр без const в функции:void printVector(std::vector<int>& v);кто-то случайно модифицировал вектор прямо в функции для отладки, забыв убрать этот код. Это вызвало side-effect, почти незаметный в тестах, и обнаружился только в продакшене.