Ich habe ein Buch, in dem etwas geschrieben steht wie:
class Foo
{
public:
int Bar(int random_arg) const
{
// code
}
};
Was bedeutet das?
Ich habe ein Buch, in dem etwas geschrieben steht wie:
class Foo
{
public:
int Bar(int random_arg) const
{
// code
}
};
Was bedeutet das?
Eine "const-Funktion", bezeichnet mit dem Schlüsselwort const
nach einer Funktionsdeklaration macht es zu einem Compilerfehler, wenn diese Klassenfunktion eine Mitgliedsvariable der Klasse ändert. Das Lesen von Klassenvariablen innerhalb der Funktion ist jedoch in Ordnung, aber das Schreiben innerhalb dieser Funktion führt zu einem Compilerfehler.
Eine andere Art, über eine solche "const-Funktion" nachzudenken, besteht darin, eine Klassenfunktion als eine normale Funktion zu betrachten, die eine implizite this
Zeiger. Also eine Methode int Foo::Bar(int random_arg)
(ohne das const am Ende) ergibt eine Funktion wie int Foo_Bar(Foo* this, int random_arg)
und ein Aufruf wie Foo f; f.Bar(4)
entspricht intern etwas wie Foo f; Foo_Bar(&f, 4)
. Nun fügen Sie die Konstante am Ende hinzu ( int Foo::Bar(int random_arg) const
) kann dann als eine Deklaration mit einem const this-Zeiger verstanden werden: int Foo_Bar(const Foo* this, int random_arg)
. Da die Art der this
in einem solchen Fall const ist, sind keine Änderungen der Mitgliedsvariablen möglich.
Es ist möglich, die "const function"-Einschränkung zu lockern, die es der Funktion verbietet, in irgendeine Variable einer Klasse zu schreiben. Um zu ermöglichen, dass einige der Variablen beschreibbar sind, auch wenn die Funktion als "const function" gekennzeichnet ist, werden diese Klassenvariablen mit dem Schlüsselwort mutable
. Wenn also eine Klassenvariable als veränderbar markiert ist und eine "const-Funktion" in diese Variable schreibt, wird der Code sauber kompiliert und die Variable kann geändert werden. (C++11)
Wie üblich, wenn es um die const
hat die Änderung der Position des Schlüsselworts const in einer C++-Anweisung eine völlig andere Bedeutung. Die obige Verwendung von const
gilt nur beim Hinzufügen von const
an das Ende der Funktionsdeklaration nach der Klammer.
const
ist ein stark überstrapazierter Qualifier in C++: Die Syntax und die Reihenfolge sind in Kombination mit Zeigern oft nicht einfach. Einige Lektüren über const
Korrektheit und die const
Stichwort:
Bar
garantiert, dass das Objekt, auf das es angewendet wird, nicht verändert wird. Siehe die Abschnitt über die Korrektheit von Konstanten in den C++ FAQ, zum Beispiel.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
33 Stimmen
Es ändert die Art der
this
deFoo* const
inconst Foo* const
. Das hat Folgen.0 Stimmen
Ich verstehe Ihre Bearbeitung nicht. Was genau wollen Sie wissen? Ob die Deklaration von zwei Variablen des Typs Foo mehrere Funktionsinstanzen von Bar erzeugen wird?
0 Stimmen
@inflagranti: Ja, genau das will ich wissen.
0 Stimmen
Dann lautet die Antwort nein. Und warum sind Sie davon ausgegangen, dass es so sein würde?
0 Stimmen
Ein Freund erzählte mir irgendwann mal... Aber ohne den const-Tag, würde es?
8 Stimmen
@aPoC-Funktionen (oder hier Methoden) existieren nur einmal "im Speicher" (als
static
oder nicht, das spielt keine Rolle). Ihnen wird ein versteckter Parameter übergebenthis
der ein Zeiger auf die aufrufende Instanz ist.