Das mutable
Schlüsselwort ist eine Möglichkeit, den const
Schleier 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 const
Referenz 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 mutable
Ausnahme können Sie jetzt markierte Datenelemente schreiben oder festlegen mutable
. Das ist der einzige äußerlich sichtbare Unterschied.
Intern können die const
fü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 mutable
das const
Konzept nicht zerstört wird und nur in nützlichen Sonderfällen verwendet wird. Das mutable
Schlüsselwort hilft, da es Datenelemente, die diesen Sonderfällen unterliegen, eindeutig kennzeichnet.
In der Praxis können Sie const
Ihre 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 mutable
Schlüsselwort werden Sie möglicherweise gezwungen sein, const_cast
die verschiedenen nützlichen Sonderfälle zu behandeln, die es zulässt (Caching, Ref-Counting, Debug-Daten usw.). Leider const_cast
ist es wesentlich destruktiver als mutable
weil es den API- Client zwingt , den const
Schutz der von ihm verwendeten Objekte zu zerstören . Darüber hinaus führt dies zu einer weit verbreiteten const
Zerstörung: const_cast
Wenn 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 mutable
muss der API-Designer die const
Ausnahmen genau steuern. In der Regel sind diese Ausnahmen in const
Methoden 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 .)