Was bedeuten const
solche Erklärungen? Das const
verwirrt mich.
class foobar
{
public:
operator int () const;
const char* foo() const;
};
quelle
Was bedeuten const
solche Erklärungen? Das const
verwirrt mich.
class foobar
{
public:
operator int () const;
const char* foo() const;
};
Wenn Sie das const
Schlüsselwort zu einer Methode hinzufügen , wird der this
Zeiger im Wesentlichen zu einem Zeiger auf ein const
Objekt, und Sie können daher keine Mitgliedsdaten ändern. (Wenn Sie nicht verwenden mutable
, dazu später mehr).
Das const
Schlüsselwort ist Teil der Funktionssignatur. Dies bedeutet, dass Sie zwei ähnliche Methoden implementieren können, eine, die aufgerufen wird, wenn sich das Objekt befindet const
, und eine, die nicht aufgerufen wird.
#include <iostream>
class MyClass
{
private:
int counter;
public:
void Foo()
{
std::cout << "Foo" << std::endl;
}
void Foo() const
{
std::cout << "Foo const" << std::endl;
}
};
int main()
{
MyClass cc;
const MyClass& ccc = cc;
cc.Foo();
ccc.Foo();
}
Dies wird ausgegeben
Foo
Foo const
In der non-const-Methode können Sie die Instanzmitglieder ändern, was in der const
Version nicht möglich ist. Wenn Sie die Methodendeklaration im obigen Beispiel in den folgenden Code ändern, werden einige Fehler angezeigt.
void Foo()
{
counter++; //this works
std::cout << "Foo" << std::endl;
}
void Foo() const
{
counter++; //this will not compile
std::cout << "Foo const" << std::endl;
}
Dies ist nicht ganz richtig, da Sie ein Mitglied als markieren können mutable
und eine const
Methode es dann ändern kann. Es wird hauptsächlich für interne Zähler und ähnliches verwendet. Die Lösung dafür wäre der folgende Code.
#include <iostream>
class MyClass
{
private:
mutable int counter;
public:
MyClass() : counter(0) {}
void Foo()
{
counter++;
std::cout << "Foo" << std::endl;
}
void Foo() const
{
counter++; // This works because counter is `mutable`
std::cout << "Foo const" << std::endl;
}
int GetInvocations() const
{
return counter;
}
};
int main(void)
{
MyClass cc;
const MyClass& ccc = cc;
cc.Foo();
ccc.Foo();
std::cout << "Foo has been invoked " << ccc.GetInvocations() << " times" << std::endl;
}
was ausgeben würde
Foo
Foo const
Foo has been invoked 2 times
Die Konstante bedeutet, dass die Methode verspricht, keine Mitglieder der Klasse zu verändern. Sie könnten die so markierten Mitglieder des Objekts ausführen, selbst wenn das Objekt selbst markiert wäre const
:
const foobar fb;
fb.foo();
wäre legal.
Siehe Wie viele und welche Verwendungszwecke hat "const" in C ++? für mehr Informationen.
Das const
Qualifikationsmerkmal bedeutet, dass die Methoden für jeden Wert von aufgerufen werden können foobar
. Der Unterschied ergibt sich, wenn Sie eine Nicht-Const-Methode für ein Const-Objekt aufrufen. Überlegen Sie, ob Ihr foobar
Typ die folgende zusätzliche Methodendeklaration hatte:
class foobar {
...
const char* bar();
}
Die Methode bar()
ist nicht konstant und kann nur über nicht konstante Werte aufgerufen werden.
void func1(const foobar& fb1, foobar& fb2) {
const char* v1 = fb1.bar(); // won't compile
const char* v2 = fb2.bar(); // works
}
Die Idee dahinter const
ist jedoch, Methoden zu markieren, die den internen Zustand der Klasse nicht verändern. Dies ist ein leistungsstarkes Konzept, das in C ++ jedoch nicht durchsetzbar ist. Es ist eher ein Versprechen als eine Garantie. Und eine, die oft kaputt und leicht kaputt ist.
foobar& fbNonConst = const_cast<foobar&>(fb1);
const
ist jedoch, Methoden zu markieren, die den internen Zustand der Klasse nicht verändern". Das habe ich wirklich gesucht.const
?Diese const bedeuten, dass der Compiler einen Fehler macht, wenn die Methode 'with const' interne Daten ändert.
Die Prüfung
Lesen Sie dies für weitere Informationen
quelle
const
Mitgliedsfunktionen, in der nicht veränderlich erwähnt wird, ist bestenfalls unvollständig.Blairs Antwort ist genau richtig.
Beachten Sie jedoch, dass es ein
mutable
Qualifikationsmerkmal gibt, das den Datenelementen einer Klasse hinzugefügt werden kann. Jedes so gekennzeichnete Mitglied kann in einerconst
Methode geändert werden, ohne denconst
Vertrag zu verletzen .Sie können dies (zum Beispiel) verwenden, wenn sich ein Objekt merken soll, wie oft eine bestimmte Methode aufgerufen wird, ohne die "logische" Konstanz dieser Methode zu beeinflussen.
quelle
Bedeutung einer Const-Member-Funktion in C ++ Allgemeines Wissen: Grundlegende Zwischenprogrammierung gibt eine klare Erklärung:
Also in deinem Code:
Sie können es so denken:
quelle
this
ist nichtconst
. Der Grund, warum es nicht geändert werden kann, ist, dass es ein Wert ist.Wenn Sie
const
in der Methodensignatur (wie gesagtconst char* foo() const;
:) verwenden, teilen Sie dem Compiler mit, dass der Speicher, auf den durch verwiesen wird,this
mit dieser Methode (diefoo
hier angezeigt wird) nicht geändert werden kann .quelle
Ich möchte den folgenden Punkt hinzufügen.
Sie können es auch zu einem
const &
und machenconst &&
Damit,
Fühlen Sie sich frei, um die Antwort zu verbessern. Ich bin kein Experte
quelle
*this
ist immer ein l-Wert, auch wenn die Member-Funktion rvalue-ref-qualifiziert ist und für einen rvalue aufgerufen wird. Beispiel .Das mit der Funktionsdeklaration verwendete Schlüsselwort const gibt an, dass es sich um eine const-Member-Funktion handelt und die Datenelemente des Objekts nicht geändert werden können .
quelle
https://isocpp.org/wiki/faq/const-correctness#const-member-fns
quelle