Wenn eine Elementvariable nicht das Qualifikationsmerkmal mutable
hat, können Sie sie nicht ändern, wenn ein Objekt const
ist.
Wenn eine Elementvariable das Qualifikationsmerkmal mutable
hat, können Sie sie ändern, auch wenn ein Objekt const
ist.
Einfaches Beispiel:
%Vor%Wenn Sie haben:
%Vor% Sie umgehen die const
-ness des Objekts und ändern es so, wie Sie es nicht sollten. Dies unterliegt nicht definiertem Verhalten.
Soweit der Compiler betroffen ist, entspricht dieser Code:
%Vor%Die Zeile
%Vor% wird gesagt, dass " const
-ness" weggeworfen wird. Im Grunde sagt es dem Compiler: Nimm den this
-Zeiger (der den Typ temp const*
hat, weil wir uns in einer const
-Memberfunktion von temp
befinden), und tue so, als wären sie vom Typ temp*
(der Unterausdruck (temp*)this
). Dann weist es den Compiler an, diesen Zeiger vom Typ temp*
zu dereferenzieren, um eines seiner Mitglieder zu ändern.
Wegwerfen von const
-ness war, wie änderbare Datenelemente implementiert wurden, bevor C ++ das Schlüsselwort mutable
angeboten hat.
Wie Sie vielleicht vermutet haben, ist das eine schlechte Übung. Es ist eine schlechte Übung, weil es genauso gut mit dem Modifikator mutable
ausgedrückt werden könnte. Und es ist eine schlechte Übung, weil es die große Kanone eines C-Style-Casts benutzt, wo ein C ++ const_cast<>
ausgereicht hätte.
Der beste Weg zu lernen ist, es zu einem trivialen Fall zu machen und zu sehen, wie es geht.
a) Wenn Sie auskommentieren (* temp) und etwas ähnliches machen this- & gt; value1 = 10;
Fehler: Zuordnung von Datenelement 'temp :: value1' in schreibgeschützter Struktur
oder
b) Wenn Sie ein veränderbares Schlüsselwort auskommentieren, erhalten Sie denselben Fehler
Fehler: Zuweisung von Datenelement 'temp :: value2' in schreibgeschützt Struktur
und wenn du oben gelesen hast, hat R Sahu die richtige Antwort über veränderbares Schlüsselwort gegeben.
Wenn Sie verwirrt sind, warum können wir den Wert nicht auf die normale Weise ändern, denken Sie daran, dass die Funktion const und const ein Vertrag ist, der verspricht, dass wir hier keine Werte ändern oder zuweisen sollen (aber veränderbar). also zeigt es im Grunde zwei Techniken oder Hacks, um das Versprechen zu brechen :-)
Tags und Links c++