Das mutableSchlüsselwort ist eine Möglichkeit, den constSchleier zu durchbohren, den Sie über Ihre Objekte legen. Wenn Sie eine konstante Referenz oder Zeiger auf ein Objekt haben, können Sie dieses Objekt nicht in irgendeiner Weise ändern , außer , wann und wie es markiert ist mutable.
Mit Ihrer constReferenz oder Ihrem Zeiger sind Sie beschränkt auf:
- Lesezugriff nur für sichtbare Datenelemente
- Berechtigung, nur Methoden aufzurufen, die als gekennzeichnet sind
const.
Mit der mutableAusnahme können Sie jetzt markierte Datenelemente schreiben oder festlegen mutable. Das ist der einzige äußerlich sichtbare Unterschied.
Intern können die constfür Sie sichtbaren Methoden auch in markierte Datenelemente schreiben mutable. Im Wesentlichen wird der konstante Schleier umfassend durchbohrt. Es liegt ganz beim API-Designer, sicherzustellen, dass mutabledas constKonzept nicht zerstört wird und nur in nützlichen Sonderfällen verwendet wird. Das mutableSchlüsselwort hilft, da es Datenelemente, die diesen Sonderfällen unterliegen, eindeutig kennzeichnet.
In der Praxis können Sie constIhre Codebasis zwanghaft verwenden (Sie möchten Ihre Codebasis im Wesentlichen mit der const"Krankheit" "infizieren "). In dieser Welt sind Zeiger und Referenzenconst mit sehr wenigen Ausnahmen , die Code liefern, der leichter zu verstehen und zu verstehen ist. Für einen interessanten Exkurs schauen Sie nach "referentielle Transparenz".
Ohne das mutableSchlüsselwort werden Sie möglicherweise gezwungen sein, const_castdie verschiedenen nützlichen Sonderfälle zu behandeln, die es zulässt (Caching, Ref-Counting, Debug-Daten usw.). Leider const_castist es wesentlich destruktiver als mutableweil es den API- Client zwingt , den constSchutz der von ihm verwendeten Objekte zu zerstören . Darüber hinaus führt dies zu einer weit verbreiteten constZerstörung: const_castWenn Sie einen konstanten Zeiger oder eine Referenz verwenden, können Sie uneingeschränkt schreiben und Methoden aufrufen, um auf sichtbare Elemente zuzugreifen. Im Gegensatz dazu mutablemuss der API-Designer die constAusnahmen genau steuern. In der Regel sind diese Ausnahmen in constMethoden verborgen , die mit privaten Daten arbeiten.
(Hinweis: Ich beziehe mich einige Male auf die Sichtbarkeit von Daten und Methoden . Ich spreche von Mitgliedern, die als öffentlich oder privat oder geschützt gekennzeichnet sind. Dies ist eine völlig andere Art des hier diskutierten Objektschutzes .)