761 Stimmen

Was ist mit "const" am Ende der Funktionsdeklaration gemeint?

Ich habe ein Buch, in dem etwas geschrieben steht wie:

class Foo 
{
public:
    int Bar(int random_arg) const
    {
        // code
    }
};

Was bedeutet das?

33 Stimmen

Es ändert die Art der this de Foo* const in const 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.

1242voto

Janick Bernet Punkte 19324

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:

Korrektheit der Konstanten

Die C++ 'const' Deklaration: Warum und wie

72voto

Nikolai Fetissov Punkte 79627

Betrachten Sie zwei Variablen vom Typ Klasse:

class Boo { ... };

Boo b0;       // mutable object
const Boo b1; // non-mutable object

Jetzt können Sie anrufen jede Mitgliedsfunktion von Boo sur b0 sondern nur const -qualifizierten Mitgliedsfunktionen auf b1 .

21voto

mkluwe Punkte 3463

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.

14voto

John Warlow Punkte 2900

Ähnlich wie este Frage.

Im Wesentlichen bedeutet dies, dass die Methode Bar keine Änderungen an nicht änderbar Mitgliedsvariablen von Foo .

10voto

Goz Punkte 59671

Ich finde es immer konzeptionell einfacher zu denken, dass Sie die dieser Zeiger const machen (das ist ziemlich genau das, was es tut).

CodeJaeger.com

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.

Powered by:

X