Was bedeutet der Operator const, wenn er mit einer Methode in C ++ verwendet wird?

8

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.

    
Bernard 08.09.2008, 02:20
quelle

7 Antworten

12

Betrachten Sie eine Variation Ihrer Klasse A .

%Vor%

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.

    
Henk 08.09.2008, 02:37
quelle
5

Dies ist keine Antwort, nur eine Nebenbemerkung. Es wird empfohlen, Variablen und Konstanten const so weit wie möglich zu deklarieren.

  1. Dies teilt Ihre Absicht den Benutzern Ihrer Klasse mit (auch / vor allem Sie selbst).
  2. Der Compiler wird Sie auf diese Absichten aufmerksam machen. - Das ist wie eine vom Compiler überprüfte Dokumentation.
  3. Dies verhindert definitionsgemäß Zustandsänderungen, die Sie nicht erwartet haben, und ermöglicht Ihnen möglicherweise, in Ihren Methoden vernünftige Annahmen zu treffen.
  4. 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.

    
Pat Notz 08.09.2008 02:52
quelle
3

Funktionen mit const qualifier dürfen keine Membervariablen ändern. Zum Beispiel:

%Vor%     
1800 INFORMATION 08.09.2008 02:27
quelle
2

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.

    
dfjacobs 08.09.2008 02:30
quelle
2

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.

    
Tyler 12.09.2008 12:43
quelle
2
  

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.

    
MP24 12.09.2008 22:58
quelle
1

Das wird dazu führen, dass die Methode keine Membervariablen des Objekts ändern kann

    
John Boker 08.09.2008 02:23
quelle

Tags und Links