c ++ const Member-Funktion, die einen const-Zeiger zurückgibt. Aber welcher Typ von const ist der zurückgegebene Zeiger?
Ich entschuldige mich, wenn dies gefragt worden, aber wie erstelle ich eine member-Funktion in c++ wird ein Zeiger in der folgenden scenerios:
1. Der zurückgegebene Zeiger ist konstant, aber die junk-E-darin können geändert werden.
2. Der junk-E-darin ist konstant, aber die zurückgegebenen Zeiger kann geändert werden.
3. Weder junk, noch den Zeiger geändert werden kann.
Ist es so:
int *const func() const
const int* func() const
const int * const func() const
All die tutorials, die ich gelesen habe decken nicht diese Unterscheidung.
Seite beachten:
Wenn meine Methode deklariert const dann die tutorials sagen, dass ich es bin, die besagt, dass ich nicht die Parameter ändern.. Aber dies ist nicht klar genug für mich in dem Fall, wenn ein parameter ist ein Zeiger. Tun meine Parameter müssen wie:
ein. void func(const int* const x) const;
b. void func(const int* x) const;
c. void func(const int* const x) const;
InformationsquelleAutor der Frage Jor | 2010-10-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich weiß nicht, welches Buch du gelesen hast, aber wenn du daneben eine Methode const, bedeutet es, dass
this
Typconst MyClass*
stattMyClass*
ab, was wiederum bedeutet, dass Sie nicht ändern können, nicht-statische Datenelemente, die nicht deklariertmutable
, noch rufen Sie eine nicht-const-Methoden aufthis
.Nun für den Rückgabewert.
1 .
int * const func () const
Ist die Funktion konstant, und der zurückgegebene Zeiger ist konstant, aber die 'junk-innen' geändert werden kann. Allerdings sehe ich keinen Sinn in der Rückkehr einen const-Zeiger, weil die ultimate-Funktion aufrufen, wird ein rvalue, und rvalues von nicht-Klasse-Typ nicht
const
, was bedeutet, dassconst
werden sowieso ignoriert2 .
const int* func () const
Dies ist eine nützliche Sache. Die "junk-innen" können nicht geändert werden
3 .
const int * const func() const
semantisch fast das gleiche wie 2, aus Gründen, die in 1.
HTH
InformationsquelleAutor der Antwort Armen Tsirunyan
Einige Verwendungen von const nicht wirklich viel Sinn.
Angenommen, Sie haben die folgende Funktion:
Das const sagt dem compiler, dass ein Wert nicht geändert werden darf innerhalb der Funktion. Diese Informationen haben keinen Wert für den Anrufer. Es liegt an der Funktion selbst zu entscheiden, was zu tun mit dem Wert. Für die Anrufer, die folgenden zwei Funktionsdefinitionen Verhalten, genau das gleiche für ihn:
Weil der Wert durch Wert übergeben wird, was bedeutet, dass die Funktion bekommt eine lokale Kopie sowieso.
Auf der anderen Seite, wenn das argument eine Referenz oder einen Zeiger, der die Dinge sehr anders.
Diese sagt dem Aufrufer, der Wert wird per Referenz übergeben (also hinter den Bildschirmen, es ist eigentlich ein pointer), aber der Anrufer verspricht nicht, um Wert zu ändern.
Das gleiche gilt für die Zeiger:
Übergeben wir einen Zeiger auf MyClass (wegen performance-Gründen), aber die Funktion verspricht nicht, ändern Sie den Wert.
Würden wir Folgendes schreiben:
Dann sind wir wieder int er ersten situation. myFunction wird ein pointer, der als Wert übergeben, und die const. Da MyFunction wird eine Kopie des Zeigers Wert, es spielt keine Rolle für die Anrufer, ob es const ist oder nicht. Das wichtigste ist, dass myFunction können, ändern Sie den Inhalt von Wert, da die Zeiger-variable selbst ist const, aber der Inhalt ist es nicht.
Gleiches gilt für Rückgabewerte:
Dieser macht keinen Sinn. Quadratwurzel gibt eine const double, aber da dieses übergeben 'by value' und muss daher kopiert werden, um meine eigene lokale variable, ich kann tun, was ich will.
Auf der anderen Seite:
Sagt mir, dass getCustomer gibt mir einen Zeiger auf einen Kunden, und ich bin nicht erlaubt zu ändern, die Inhalte des Kunden.
Eigentlich, es würde besser sein, einen char-Zeiger-Inhalte const, da ich nicht erwarte, dass die Funktion zum ändern der angegebenen Zeichenfolge:
InformationsquelleAutor der Antwort Patrick
int *const func() const
Können Sie beobachten die
const
hier mit Ausnahme von ein paar Fällenfunc
.func
mit dem Funktions-Aufruf-syntax alsdecltype
Operanden, wird der Ertragint * const
.Dies ist, weil Sie wieder eine Reine Zeiger-Wert, das heißt einen Zeiger mit dem Wert nicht wirklich gespeichert in einer Zeiger-variable. Solche Werte sind nicht const-qualifiziert, weil Sie nicht geändert werden kann sowieso. Man kann nicht sagen
obj.func() = NULL;
auch wenn Sie nehmen dieconst
. In beiden Fällen ist der Ausdruckobj.func()
hatder Typ
int*
und ist nicht änderbar (jemand schnell zitieren, die Standard kommen, mit dem Begriff "rvalue").Also in Kontexten, die Sie mit der return-Wert Sie werden nicht in der Lage zu Abbildung einen Unterschied. Nur in den Fällen, verweisen Sie auf die Erklärung oder die ganze Funktion selbst, Sie werden den Unterschied bemerken.
const int* func() const
Dies ist, was Sie normalerweise tun würden, wenn der Körper wäre so etwas wie
return &this->intmember;
. Es erlaubt nicht das ändern der int member by doing*obj.func() = 42;
.const int * const func() const
Dies ist nur die Kombination der ersten beiden 🙂
InformationsquelleAutor der Antwort Johannes Schaub - litb
Rückgabe einen Zeiger auf const viel Sinn macht, aber wieder ein const-pointer (kann man nicht ändern) trägt in der Regel keinen Wert (obwohl einige sagen, es kann verhindern, dass Benutzer Fehler oder hinzufügen von compiler-Optimierung).
Ist, weil der return-Wert gehört zu den Aufrufer der Funktion zurückgegeben, d.h. es ist Ihre eigene Kopie, so dass es nicht wirklich wichtig, wenn Sie es ändern (auf etwas anderes zeigen). Die Inhalte jedoch nicht zu "gehören" die Anrufer und die Implementierung der Funktion kann ein Vertrag, es ist nur-lese-Informationen.
Const-member-Funktionen Versprechen, nicht zu ändern, der Status der Klasse, obwohl dies nicht notwendigerweise erzwungen, die in der Realität durch den compiler. Ich beziehe mich nicht hier, const_cast oder veränderlich Mitglieder, so viel wie die Tatsache, dass, wenn Sie Ihre Klasse selbst enthält Zeiger oder Referenzen, const-member-Funktion verwandelt Ihren Zeiger in konstanter Zeiger aber nicht bedeutet, dass Sie Zeiger auf const, ebenso die Verweise nicht aktiviert sind, in Referenzen auf const. Wenn diese Komponenten Ihrer Klasse (und solche Komponenten sind oft vertreten durch Zeiger) Ihre Funktionen ändern können Ihren Staat.
Veränderlich Mitglieder gibt es für den Vorteil, dass Ihre Klasse zu ändern, während nicht ändern internen Zustand. Diese können in der Regel angewendet werden:
const_cast ist im Allgemeinen als ein "hack" und wird oft gemacht, wenn jemand anderes hat nicht geschrieben, deren code ordnungsgemäß const-korrekt. Es können Wert, obwohl sich in den folgenden Situationen:
Mehrere überladungen, von denen eines const-und einen non-const und const gibt eine const-Referenz-und die non-const gibt eine nicht-const Referenz, aber ansonsten sind Sie gleich. Duplizieren Sie den code (wenn es nicht eine einfache Daten-Mitglied erhalten), ist keine gute Idee, so die Implementierung einer in Bezug auf die anderen und nutzen Sie const_cast, um rund um den compiler.
Wo Sie wollen, insbesondere zum aufrufen der const-überladung, aber haben eine non-const Referenz. Es Stimmen const ersten.
InformationsquelleAutor der Antwort CashCow
Die const-Methode verhindert, dass Sie ändern der Mitglieder. Im Falle von Zeigern, das heißt, Sie können nicht zuweisen, der den Zeiger. Sie können ändern Sie das Objekt wies an, indem Sie den Zeiger, um Ihr Herz begehrt.
Als Zeiger zurückgegeben wird, durch einen Wert (eine Kopie), der Anrufer kann es nicht verwenden, ändern Sie den Mauszeiger Mitglied der Klasse. Daher hinzufügen const auf den Rückgabewert fügt nichts.
Dinge sind anders, wenn Sie wurden für die Rückgabe einer Referenz auf den Zeiger. Nun, wenn sich der Zeiger nicht konstant, würde dies bedeuten, dass eine Funktion, die nicht über die erforderlichen Rechte zum ändern eines Wertes wird die Gewährung dieses rechts an den Aufrufer.
Beispiel:
InformationsquelleAutor der Antwort visitor