Geschiedenis van de vraag:
De const-kwalificatie in C++ is ontstaan vanuit veiligheidsredenen: om functies aan te geven die gegarandeerd de interne toestand van een object niet veranderen. In de context van klassen zijn const-methoden verplicht voor projecten waar strikte encapsulatie en bescherming tegen toevallige fouten vereist zijn.
Probleem:
Als men vergeet om getters, hulpfuncties en controlemethoden als const aan te duiden, kunnen deze niet worden aangeroepen voor const-objecten. Zonder const-methoden kan de compiler ongewenste gegevenswijzigingen niet voorkomen.
Oplossing:
Const toevoegen in de methode-definitie na de handtekening (en niet ervoor!) Dit maakt het mogelijk om de methode aan te roepen voor zowel gewone objecten als voor die als const zijn gedeclareerd, en voorkomt fouten bij het wijzigen van de toestand. In zo'n methode mogen de klasseleden niet worden gewijzigd (behalve mutable), alleen lezen is toegestaan.
Voorbeeldcode:
class Counter { int value; public: int getValue() const { return value; } // Kan worden aangeroepen voor const Counter }; void print(const Counter& c) { std::cout << c.getValue(); }
Belangrijke kenmerken:
Waar wordt const bij de methode geplaatst: vóór het retourtype of na de haakjes?
Alleen na de haakjes: int getValue() const; — het is een fout om dit vóór het retourtype te schrijven (bijvoorbeeld const int get();).
Kan een const-methode niet-const-methoden van de klasse aanroepen?
Nee, een const-methode kan alleen andere const-methoden aanroepen als het object const is.
Wat is het verschil tussen const in de methode en const in het retourtype?
int get() const (de methode wijzigt de toestand niet)
const int get(); (de retourwaarde kan niet worden gewijzigd, maar de methode kan interne gegevens wijzigen)
In de klasse is const bij de methode gemist die de toestand niet verandert. Deze kan niet worden aangeroepen voor een constant object, wat het gebruik van de klasse in analysetools en bij API-werk verstoort.
Voordelen:
Nadelen:
Alle getters, controles en hulpfuncties zijn als const gedeclareerd, tests zijn gedekt voor zowel const- als niet-const-objecten.
Voordelen:
Nadelen: