ProgrammatieSysteem/C++ ontwikkelaar

Vertel over de verschillen tussen de sleutelwoorden 'mutable', 'volatile' en 'const' in C++. Waarvoor worden ze gebruikt, welke typische fouten ontstaan bij verkeerd gebruik?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

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.

Voorbeeldcode

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 */ } }

Misleidende vraag

"Wat gebeurt er als een lid van de klasse wordt gedeclareerd als zowel const als mutable?"

Antwoord: Dit is niet mogelijk, dit zijn elkaar uitsluitende kwalificatoren; de compiler zal een foutmelding geven.


Voorbeelden van echte fouten door onbekendheid met de nuances van dit onderwerp.


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 een const_cast, wat leidde tot tal van waarschuwingen en onduidelijke bugs. Het probleem verdween na de juiste declaratie van de teller met mutable.


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 had mutable of een ontwerpwijziging gebruikt moeten worden.