ProgrammazioneC++ разработчик

Как работает const-correctness в C++? Почему важно использовать квалификаторы const, и каких ошибок помогает избежать const-correctness? Приведите реальный пример использования const в методах и функциях.

Supera i colloqui con l'assistente IA Hintsage

Ответ.

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, почти незаметный в тестах, и обнаружился только в продакшене.