const-correctness to koncepcja w C++, która definiuje, jak zmienne, wskaźniki, odniesienia i metody są oznaczane jako "tylko do odczytu". Zwiększa to bezpieczeństwo kodu, sprawia, że interfejsy klas są bardziej zrozumiałe, a także pozwala kompilatorowi wychwytywać błędy na etapie kompilacji, a nie w czasie wykonania.
Użycie modyfikatorów const jest ważne, ponieważ:
Przykład:
class MyArray { public: int getItem(size_t idx) const { // Nie zmienia obiektu return arr[idx]; } void setItem(size_t idx, int value) { arr[idx] = value; } private: int arr[10]; };
Tutaj metoda getItem gwarantuje, że nie zmienia obiektu.
Czym różni się
void foo(const int* ptr);od
void foo(int* const ptr);?
Poprawna odpowiedź:
const int* ptr — wskaźnik na stałą wartość, wartości nie można zmieniać, wskaźnik można.int* const ptr — stały wskaźnik na zmienną wartość, wskaźnika nie można zmieniać, wartość można.Historia
W dużym projekcie napisano metodę klasy bez modyfikatora const:int MyClass::getVal();W wyniku tego niemożliwe było użycie obiektu klasy jako const reference, na przykład w funkcjach pracujących tylko z obiektami "tylko do odczytu". Ograniczyło to ponowne wykorzystanie kodu i doprowadziło do nadmiarowego kopiowania obiektów.
Historia
Programista przez pomyłkę zwrócił odniesienie do wewnętrznych danych przez niemutowalną metodę:int& MyClass::getInt();W rezultacie kod klienta uzyskał możliwość zmiany prywatnego pola klasy, co doprowadziło do niespodziewanej zmiany stanu i trudnych do uchwycenia błędów.
Historia
Pozostawiając stały parametr bez const w funkcji:void printVector(std::vector<int>& v);ktoś przypadkowo zmodyfikował wektor bezpośrednio w funkcji do debugowania, zapominając usunąć ten kod. Wywołało to skutki uboczne, prawie niezauważalne w testach i ujawniło się dopiero w produkcji.