Gegeben eine Erklärung wie folgt:
%Vor%Was heißt das?
Google taucht auf:
Memberfunktionen sollten mit dem Schlüsselwort const nach ihnen deklariert werden, wenn sie mit einem const (this) -Objekt arbeiten können. Wenn die Funktion nicht als const deklariert ist, kann in nicht auf ein const-Objekt angewendet werden, und der Compiler gibt eine Fehlermeldung aus.
Aber ich finde das etwas verwirrend; kann jemand da draußen es besser ausdrücken?
Danke.
Betrachten Sie eine Variation Ihrer Klasse A
.
Das Schlüsselwort const
einer Funktionsdeklaration zeigt dem Compiler an, dass die Funktion vertraglich verpflichtet ist, den Status von A
nicht zu ändern. Daher können Sie nicht const
-Funktionen in A::Foo
aufrufen oder den Wert von Elementvariablen ändern.
Zur Veranschaulichung: Foo () darf A::SetState
nicht aufrufen, da es nicht als const
deklariert ist, A::GetState
ist jedoch in Ordnung, weil es explizit als const
deklariert ist. Das Mitglied m_nState
darf auch nicht geändert werden, es sei denn, es wurde mit dem Schlüsselwort mutable
deklariert.
Ein Beispiel für diese Verwendung von const
ist, dass Getterfunktionen den Wert von Elementvariablen erhalten.
@ 1800 Information: Ich habe Mutable vergessen!
Das Schlüsselwort mutable
weist den Compiler an, Änderungen an der Member-Variablen zu akzeptieren, die andernfalls einen Compilerfehler verursachen würden. Es wird verwendet, wenn die Funktion den Status ändern muss, das Objekt jedoch unabhängig von der Änderung als logisch konsistent (konstant) betrachtet wird.
Dies ist keine Antwort, nur eine Nebenbemerkung. Es wird empfohlen, Variablen und Konstanten const
so weit wie möglich zu deklarieren.
const
hat eine lustige Art, sich durch deinen Code zu verbreiten. Daher ist es eine gute Idee, const
so früh und so oft wie möglich zu verwenden. Die Entscheidung, const
zu starten, kann sehr schmerzhaft sein (einfach, aber ärgerlich). Wenn Sie eine Sprache mit statischen, kompilierenden Zeitüberprüfungen verwenden, ist es eine gute Idee, sie so gut wie möglich zu nutzen ... es ist nur eine andere Art von Tests.
Funktionen mit const
qualifier dürfen keine Membervariablen ändern. Zum Beispiel:
C ++ - Objekte können als const deklariert werden:
%Vor%Wenn ein Objekt const ist, sind die einzigen Elementfunktionen, die für dieses Objekt aufgerufen werden können, Funktionen, die als const deklariert sind. Ein Objekt const kann so interpretiert werden, dass das Objekt nur gelesen wird. Ein konstantes Objekt kann nicht geändert werden, d. H. Es können keine Datenelemente des Objekts geändert werden. Das Deklarieren einer Elementfunktion const bedeutet, dass die Funktion keine Änderungen an den Datenelementen des Objekts vornehmen darf.
Zwei empfohlene Best Practices aus Erfahrung:
(1) Deklarieren Sie const-Funktionen wann immer möglich . Zuerst stellte ich fest, dass dies nur zusätzliche Arbeit war, aber dann begann ich, meine Objekte an Funktionen mit Signaturen wie f (const Object & amp; o) zu übergeben, und plötzlich stürzte der Compiler auf eine Zeile in f wie o.GetAValue (). weil ich GetAValue nicht als const-Funktion markiert hatte. Dies kann Sie besonders dann überraschen, wenn Sie etwas unterklassifizieren und Ihre Version der virtuellen Methoden nicht als const markieren - in diesem Fall könnte die Kompilierung bei einer Funktion fehlschlagen, von der Sie noch nie gehört haben, die für die Basisklasse geschrieben wurde. p>
(2) Vermeiden Sie veränderbare Variablen , wenn es praktikabel ist. Ein verlockender Trap kann sein, dass Lesevorgänge den Status ändern können, z. B. wenn Sie ein "intelligentes" Objekt erstellen, das träge oder asynchrone E / A-Vorgänge ausführt. Wenn Sie das mit nur einer kleinen veränderbaren Variable (wie einem Bool) schaffen, dann ist dies meiner Erfahrung nach sinnvoll. Wenn Sie jedoch feststellen, dass jede Elementvariable als änderbar markiert ist, um einige Operationen konstant zu halten, werden Sie den Zweck des Schlüsselworts const vereiteln. Was schief gehen kann, ist, dass eine Funktion, die denkt, dass sie Ihre Klasse nicht verändert (da sie nur Const-Methoden aufruft), einen Fehler in Ihrem Code auslöst, und es könnte sehr mühsam sein, diesen Fehler in Ihrer Klasse zu erkennen der andere Coder (zu Recht) nimmt an, dass Ihre Daten const sind, weil er oder sie nur const Methoden aufruft.
const hat eine lustige Art, sich durch deinen Code zu verbreiten. Daher ist es eine sehr gute Idee, const so früh und so oft wie möglich zu verwenden. Es kann schmerzhaft sein (einfach, aber nervig), zu entscheiden, mit der Programmierung des Codes zu beginnen.
Zusätzlich werden Sie leicht auf Probleme stoßen, wenn Methoden, die const sein sollten, nicht sind! Dies wird auch durch den Code kriechen und es immer schlimmer machen.
Das wird dazu führen, dass die Methode keine Membervariablen des Objekts ändern kann
Tags und Links c++