const laat de compiler weten dat de variabele niet kan worden gewijzigd (kan niet worden veranderd na initiatie). Het wordt gebruikt voor het declareren van constante variabelen en voor methoden die gegarandeerd de staat van een object niet veranderen.
mutable staat toe dat de waarde van een klasseveld verandert, zelfs binnen const-methoden.
volatile laat de compiler weten dat de waarde van de variabele ergens buiten de controle van het programma kan worden veranderd (bijvoorbeeld door hardware), en de compiler moet geen optimalisaties uitvoeren voor toegang tot deze variabele.
class Logger { public: void log() const { ++count; // Toegestaan - count is declared mutable } private: mutable int count = 0; }; volatile int flag; void wait() { while (flag == 0) { /* de compiler optimaliseert de lus niet, omdat flag volatile is */ } }
"Wat gebeurt er als een lid van de klasse wordt gedeclareerd als zowel
constalsmutable?"
Antwoord: Dit is niet mogelijk, dit zijn elkaar uitsluitende kwalificatoren; de compiler zal een foutmelding geven.
Verhaal
In industriële software voor hardware-interacties had de ontwikkelaar gegevens die door externe onderbrekingen werden bijgewerkt, gedeclareerd als gewone int. De optimalisatie van de compiler verwijderde herhaalde toegang tot deze variabelen, waardoor het programma vast liep in een oneindige lus. Het probleem kon alleen worden vastgesteld na vervanging door
volatile int.
Verhaal
Een van de loggingsklassen had een methode
log() const, waar het nodig was om de aanroep-teller bij te werken. Dit werd in het begin gedaan door gebruik te maken van eenconst_cast, wat leidde tot tal van waarschuwingen en onduidelijke bugs. Het probleem verdween na de juiste declaratie van de teller metmutable.
Verhaal
Sommige methoden van de klasse waren gedeclareerd als
const, maar leden van het type pointer veranderden (bijvoorbeeld voor caching). Dit leidde tot een schending van de logica van "const-correctness" en zelfs UB, als het object daadwerkelijk in een read-only gebied werd geplaatst. Er hadmutableof een ontwerpwijziging gebruikt moeten worden.