Historia pytania:
Kwalifikator const w C++ pojawił się z powodów bezpieczeństwa: oznaczenie tych funkcji, które gwarantują, że nie zmieniają wewnętrznego stanu obiektu. W kontekście klas metody const są niezbędne w projektach, gdzie wymagana jest ścisła enkapsulacja i ochrona przed przypadkowymi błędami.
Problem:
Jeśli zapomnimy oznaczyć gettery, funkcje pomocnicze i metody sprawdzające jako const, nie można ich wywołać dla obiektu const. Bez metod const kompilator nie będzie w stanie zapobiec niepożądanym zmianom danych.
Rozwiązanie:
Dodanie const w deklaracji metody klasy po sygnaturze (a nie przed nią!) To pozwala na wywoływanie metody zarówno dla obiektów normalnych, jak i zadeklarowanych jako const, eliminując błędy w zmianie stanu. Wewnątrz takiej metody nie można zmieniać członów klasy (oprócz mutable), dostępne jest tylko czytanie.
Przykład kodu:
class Counter { int value; public: int getValue() const { return value; } // Można wywoływać dla const Counter }; void print(const Counter& c) { std::cout << c.getValue(); }
Kluczowe cechy:
Gdzie pisze się const w metodzie: przed wartością zwracaną czy po nawiasach?
Tylko po nawiasach: int getValue() const; — błąd pisać przed typem wartości zwracanej (na przykład const int get()).
Czy metoda const może wywoływać nie-const metody klasy?
Nie, metoda const może wywoływać tylko inne metody const, jeśli obiekt jest const.
Czym różni się const w metodzie od const w wartości zwracanej?
int get() const (metoda nie zmienia stanu)
const int get(); (wartość zwracana nie może być zmieniona, ale metoda może zmieniać wewnętrzne dane)
W klasie pominięto const w metodzie, która nie zmienia stanu. Nie można jej wywołać dla obiektu stałego, co utrudnia korzystanie z klasy w narzędziach analitycznych i przy pracy z API.
Plusy:
Minusy:
Wszystkie gettery, walidacje i metody pomocnicze są oznaczone jako const, testy pokrywają zarówno obiekty const, jak i nie-const.
Plusy:
Minusy: