Warum wird das const-member-Funktion ermöglichen eine member-variable geändert werden?
class String
{
private:
char* rep;
public:
String (const char*);
void toUpper() const;
};
String :: String (const char* s)
{
rep = new char [strlen(s)+1];
strcpy (rep, s);
}
void String :: toUpper () const
{
for (int i = 0; rep [i]; i++)
rep[i] = toupper(rep[i]);
}
int main ()
{
const String lower ("lower");
lower.toUpper();
cout << lower << endl;
return 0;
}
InformationsquelleAutor mahesh | 2008-11-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eine const-Memberfunktion, ist eine member-Funktion, die nicht mutieren seine member-Variablen.
const auf eine member-Funktion bedeutet nicht const char * ist. Das würde bedeuten, dass Sie können nicht ändern die Daten in der Adresse den Zeiger hält.
Deinem Beispiel nicht mutieren die member-Variablen selbst.
Einen const auf eine member-Funktion, sicherzustellen, dass Sie behandeln Sie alle Ihre member-Variablen als const.
Das heißt, wenn Sie haben:
Dann haben Sie:
Gibt es 2 Arten von const-Pointer. Ein const-member-Funktion verwendet, die eine habe ich oben aufgeführt.
Ein Weg, um die Fehler, die Sie wollen:
Ändern versuchen:
:
Und entfernen Sie diese Zeile:
Es wirft den Fehler, den Sie erwarten (können nicht geändert werden Mitglieder, weil const-Schlüsselwort)
Weil es gibt nur 1 Typ der const-array. Und das bedeutet, dass Sie nicht ändern Sie Ihre Daten.
Jetzt das ganze system ist eigentlich kaputt mit dem folgenden Beispiel:
So die Lektion hier ist, dass das Schlüsselwort const auf Elementfunktionen nicht gewährleisten, dass Ihr Objekt nicht ändern.
Es nur dafür sorgt, dass jedes Mitglied-variable werden so behandelt, als const. Und für Hinweise, es ist ein großer Unterschied zwischen const char * und char * const.
Meiste Zeit ein const-member-Funktion bedeutet, dass die member-Funktion nicht ändern, das Objekt selbst, aber dies ist nicht immer der Fall, wie das obige Beispiel zeigt.
InformationsquelleAutor Brian R. Bondy
Der Grund dafür ist, dass Sie sich nicht ändern
rep
. Wenn Sie es machen würden, würden Sie feststellenrep = ...;
irgendwo im code. Das ist der Unterschied zwischenund
In deinem Fall, der erste ist fertig, wenn Sie führen Sie eine const-member-Funktion: Der Zeiger ist const. Also, werden Sie nicht in der Lage zum zurücksetzen der Zeiger. Aber Sie wird sehr wohl in der Lage sein, zu ändern, was der Zeiger zeigt.
Nun, denken Sie daran
rep[i] = ...;
ist das gleiche wie*(rep + i) = ...;
. Also, was Sie ändern Sie nicht die Zeiger, sondern das, was der Zeiger Punkte zu. Sie sind erlaubt, da der Zeiger ist nicht der zweite Fall geben.Lösung
physical constness
. Aber ein const-member-Funktion bedeutet, dass Ihr Objekt istlogical const
. Wenn eine änderung um einige der Inhalte ändern, die logical constness von Ihrem Objekt, zum Beispiel, wenn es änderungen, einige statische variable, die Ihr Objekt abhängt, wird Ihr compiler kann nicht wissen, dass Ihre Klasse hat jetzt einen anderen logischen Wert. Und weder kann er wissen, dass der logische Wert ändert sich abhängig von dem, was ein Zeiger verweist: Der compiler versucht nicht, zu überprüfen logical constness in eine const-Memberfunktion, da es nicht wissen kann, was die Variablen bedeuten. Dieses Zeug ist alsconst-correctness
.std::string
wie vorgeschlagen von einigen, oder ein array von Zeichen (beachten Sie, dass ein array wird verbieten Sie ändern Ihren Inhalt, im Gegensatz zu nur einem Zeiger), wäre eine geeignete Wahl.2.
InformationsquelleAutor Johannes Schaub - litb
toUpper() ändert sich nicht, der Zeiger (die gehört zu der Klasse). Es ändert sich nur die Daten, die rep Punkte (, die nicht gehören zu der Klasse).
Aber 'const' ist eine Art von Garantie für den Benutzer der Klasse: wenn eine Methode deklariert wird, const, wer nutzt eine Instanz der Klasse erwarten können es nicht ändern, wenn man die Methode aufruft. Mein Punkt ist, wenn toUpper() ändert den Status eines string, nicht deklarieren const, ob C++ es erlaubt ist oder nicht.
InformationsquelleAutor Federico A. Ramponi
Den const-qualifier bedeutet, es wird sich nicht ändern, alle Mitglieder der Klasse.
In diesem Fall rep ist das einzige Mitglied der Klasse, und ich sehe keinen Versuch, dies zu ändern-Mitglied. Alles Spitze oder verwiesen außerhalb der Klasse ist nicht als Teil der Klasse.
Einer Lösung für dieses problem wäre die zu ersetzen, die char* mit einem std::string.
Dann wären Sie nur in der Lage, um const-member von std::string aus innerhalb von toUpper()
Beispiel (Verwendung von std::string)
InformationsquelleAutor Martin York
Können Sie nicht ändern Sie den Wert von etwas erklärt
oder
Leider erklärten Ihre Mitglied const verwandelt sich in rep in
was bedeutet, Sie können nicht ändern, die eigentliche Adresse, aber Sie können den Inhalt zu ändern, während Sie können den Wert nicht ändern.
Machen const memebrs Achtung halten Sie Ihre Puffer, const, werden Sie brauchen, um machen, rep-und Reihe von Zeichen oder ein string-Objekt, anstatt ein Zeichen Zeiger.
InformationsquelleAutor JohnMcG