Andere haben die technische Seite Ihrer Frage zu const-Member-Funktionen beantwortet, aber es gibt ein größeres Bild hier - und das ist die Idee von const correctness.
Kurz gesagt, const Korrektheit geht es um die Klärung und Durchsetzung der Semantik Ihres Codes. Nehmen Sie ein einfaches Beispiel. Sehen Sie sich diese Funktionserklärung an:
bool DoTheThing(char* message);
Angenommen jemand anderes hat diese Funktion geschrieben und Sie müssen sie aufrufen. Weißt du, was DoTheThing()
mit deinem Char-Puffer macht? Vielleicht protokolliert es nur die Nachricht in einer Datei oder ändert die Zeichenfolge. Sie können nicht sagen, was die Semantik des Aufrufs ist, indem Sie nur die Funktionsdeklaration betrachten. Wenn die Funktion die Zeichenfolge nicht ändert, ist die Deklaration inkorrekt.
Es ist praktisch, die Funktionen auch korrekt zu konfigurieren. Je nach Kontext des Aufrufs können Sie möglicherweise keine const-incorrect-Funktionen aufrufen, ohne etwas zu tricksen. Zum Beispiel davon ausgehen, dass Sie wissen, dass DoTheThing()
nicht den Inhalt der Zeichenfolge an sie übergeben nicht verändert, und Sie haben diesen Code:
void MyFunction()
{
std::string msg = "Hello, const correctness";
DoTheThing(msg.c_str());
}
Der obige Code wird nicht kompiliert, da msg.c_str()
eine const char*
zurückgibt. Um diesen Code zu kompilieren, würden Sie so etwas zu tun haben:
void MyFunction()
{
std::string msg = "Hello, const correctness";
DoTheThing(msg.begin());
}
... oder noch schlimmer:
void MyFunction()
{
std::string msg = "Hello, const correctness";
DoTheThing(const_cast<char*>(msg.c_str()));
}
von denen keiner, wohl, sind ‚besser‘ als der ursprüngliche Code. Aber weil DoTheThing()
in einer const-inkorrekten Weise geschrieben wurde, müssen Sie Ihren Code darum herum biegen.
Wenn sich Ihre Elementvariablen nie ändern, warum haben Sie Membervariablen? –
Weil er eine Klasse wollen, die unveränderlich ist? Das ist nicht unvernünftig. –
Ich bin nicht wirklich eine C++ Person, also war es eher eine Frage von Interesse als eine "Gotcha" -Frage. Warum würdest du nicht einfach alle deine Mitglieder für "const" erklären, wenn du willst, dass es wirklich unveränderlich ist? Oder würden Sie beide die Mitglieder als const und die Methoden als const bezeichnen? –