über die Funktion const member [duplicate]

7

Ich habe zwei Erklärungen zur Funktion const member

gefunden %Vor%
  1. bedeutet, dass es nur auf konstante Mitglieder zugreifen kann;
  2. es bedeutet, dass es keine Mitglieder ändert;

Ich denke, der zweite ist richtig. Aber warum kommt der erste heraus? Gibt es etwas zu klären?

Danke!

    
skydoor 27.12.2009, 16:29
quelle

4 Antworten

18

Sie können alle Werte für Klassenmitglieder in einer Konst-Member-Funktion überprüfen, und in einigen Fällen können Sie sogar den Wert von Elementvariablen ändern. Die erste Erklärung ist falsch, ich weiß nicht woher sie kommt. Die zweite Erklärung ist richtig, aber mit ein paar Ausnahmen.

Es gibt einige Ausnahmen von dieser Regel. Sie können veränderbare Variablen auch in einer Konst-Member-Funktion ändern, zum Beispiel eine Member-Variable, die wie folgt deklariert ist:

%Vor%

Sie können const-Korrektheit auch in einer Klasse brechen, indem Sie einen Verweis auf sich selbst wie folgt konstruieren:

%Vor%

Obwohl dies technisch in C ++ erlaubt ist, wird dies normalerweise als schlechte Form betrachtet, da es alle const-Modifikatoren Ihres Designs wegwirft. Tun Sie das nicht, es sei denn, Sie müssen es tatsächlich tun, und wenn Sie feststellen, dass Sie dies oft tun müssen, was auf ein Problem mit Ihrem Design hindeutet. Die C ++ FAQ deckt dies sehr gut ab.

Hier sind zwei Referenzen, falls Sie mehr lesen möchten:

James Thompson 27.12.2009, 16:30
quelle
5

In einer einfachen Bedeutung können Sie in der const-Funktion den Zustand des Objekts nicht ändern.

In der const-Funktion verhält sich dieser Zeiger wie const-Zeiger zu const-Daten , wobei er sich wie nicht-konstante Funktion wie verhält Const Zeiger auf Daten .

%Vor%

Soweit const data member betroffen ist, können Sie auf jede Member-Funktion zugreifen (lesen), egal ob const oder nicht.

Wie James Thompson gezeigt hat, können Sie sogar den Zustand des Objekts ändern, indem Sie die Konstanz entfernen, wenn Sie so wollen.

%Vor%

Auch änderbare Datenelemente können in der const-Funktion geändert werden.

    
Ashish 27.12.2009 17:29
quelle
2

Sie sind beide richtig.

Eine konstante Elementfunktion kann den Zustand des Objekts nicht ändern.

  • Dies bedeutet, dass es alle Elementvariablen lesen (aber nicht ändern) kann.
  • Dies bedeutet auch, dass es nur andere const Memberfunktionen aufrufen kann Andere Methoden, die garantieren, dass der Status des Objekts nicht geändert wird.

Oben erwähnt James auch veränderliche Mitglieder.
Daher sollte ich auch diese hier behandeln.

Eine veränderbare Elementvariable ist eine Variable, die nicht Teil des Zustands des Objekts ist (der Compiler betrachtet es nicht als Teil des Objektstatus). Sie sollten es auch so behandeln. Jede Membervariable, die Statusinformationen über das Objekt enthält, sollte NICHT als änderbar gekennzeichnet werden. Sie sollten es nur verwenden, um temporäre Informationen zu speichern, die aus dem Objektstatus rekonstruiert werden können.

Ein einfaches Beispiel ist ein Datum-Zeit-Objekt. Wo das Objekt eine Methode hat, die die Daten / Zeit in ein lesbares String-Format konvertiert. Diese Zeichenfolge kann in dem Objekt in einem veränderbaren Element aus Effizienzgründen zwischengespeichert werden (so dass Sie die Zeichenfolge nicht wiederholt erstellen müssen). Die Zeichenfolge ist jedoch nicht Teil des Objektstatus (weil sie aus anderen Elementen erstellt werden kann).

Auch James erwähnt oben das wegwerfen von Konstanz mit const_cast .

Außer in ganz besonderen Situationen, in denen Sie das Objekt KANN NIEMALS const kennen, wird dies allgemein als eine schlechte Idee betrachtet. Wie es direkt zu undefiniertem Verhalten führt. Wenn Sie feststellen, dass Sie Konstanz wegwerfen müssen, dann ist in Ihrem Programm etwas sehr Falsches im Design passiert.

Tatsächlich kann ich nur an eine Situation denken, in der es normalerweise passiert. Und dann bin ich nicht bereit, es zu programmieren, ohne zuerst zu gehen und Nachforschungen anzustellen, um sicherzustellen, dass ich nicht albern aussehe.

    
Martin York 27.12.2009 19:43
quelle
1

Ich denke, dass der Fall 1 nach einer Klarstellung die Situation betreffen kann, wenn Sie ein const-Objekt vom Typ A haben. In diesem Fall können Sie nur seine Mitgliedsfunktionen aufrufen, die in diesem Fall als const wie f () deklariert sind. Nach Ihrem Beitrag müssen Sie also davon ausgehen, dass "es" der Aufrufer der Member-Funktionen für ein Objekt vom Typ const A ist. Vielleicht sollten Sie die Definition, die Sie gefunden haben, unter Berücksichtigung dieser Annahme überprüfen.

    
jszpilewski 27.12.2009 17:41
quelle

Tags und Links