Art von 'diesem' Zeiger
Wie oben im Titel, ich würde gerne wissen, über die Art der 'this'
Zeiger.
Ich bin an einem Projekt arbeiten und ich habe beobachtet, dass die Art der 'this'
Zeiger "ClassName * const this"
unter windows mit VC++ 2008. Nun, ich würde wissen wollen, was ist der Bedarf/Anforderung machen den this-Zeiger Konstante Zeiger. Danke.
InformationsquelleAutor der Frage Purnima | 2011-05-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Typ dieses Zeigers ist entweder
ClassName *
oderconst ClassName *
je nachdem, ob es kontrolliert wird, innerhalb einer nicht-const oder const-Methode der KlasseClassName
. Zeigerthis
ist kein lvalue.Die Beobachtung, die Sie bereits erwähnt, ist irreführend. Zeiger
this
ist nicht ein lvaluewas bedeutet, dass es kann möglicherweise nicht habenClassName * const
geben, d.h. es ist nicht möglich, einenconst
rechts von der*
. Nicht-lvalues vom Typ Zeiger kann nicht const oder non-const. Es gibt einfach kein solches Konzept in C++ - Sprache. Was Sie beobachtet, muss eine interne Eigenart der spezifischen compiler. Formal ist es falsch.Hier sind die relevanten Zitate aus der language-Spezifikation (Hervorhebung von mir)
Es ist nichts Wert, zurück in die C++98/C++03 mal mehrere Compiler verwendet eine interne implementational trick: Sie interpretieren Ihre
this
Zeiger als konstanter Zeiger, z.B.ClassName *const
in einer nicht Konstanten Methode der KlasseClassName
. Diese scheinbar geholfen, um sicherzustellen, dass nicht-modifiablity vonthis
. GCC und MSVC sind bekannt, verwendet die Technik. Es war ein harmloser trick, da das Sprachniveauthis
war nicht ein lvalue und seine constness war nicht nachweisbar. Die extra -const
würde in der Regel zeigen sich erst im Diagnose-Meldungen, die durch den compiler.Jedoch, mit dem Aufkommen von rvalue-Referenzen in C++11 ist es möglich geworden, zu erkennen, diese extra
const
auf die Art derthis
. Zum Beispiel, der folgende code ist gültig für C++11Aber es wird in der Regel nicht kompiliert werden, in Implementierungen, die noch mit den oben genannten Tricks. GCC hat da aufgegeben, die Technik. MSVC++ weiterhin verwendet werden (wie von VS2017), die verhindert, dass die oben perfekt gültigen code aus kompilieren in MSVC++.
InformationsquelleAutor der Antwort AnT
Const bedeutet, dass Sie nicht ändern können, was der Zeiger zeigt.
ist sehr Verschieden von
Letzteres ist ein Zeiger auf ein Objekt und das Objekt kann nicht modifiziert werden (mit der Maus sowieso). Das erstere ist ein Zeiger, die nicht re-verweist auf ein weiteres Objekt (oder NULL), zumindest ohne Rückgriff auf fiesen casting.
Natürlich gibt es auch die Kombination:
Wäre dies ein Zeiger kann nicht geändert werden, um auf etwas anderes zeigen, noch kann es verwendet werden, ändern Sie das Objekt, das es Punkte zu.
Als für warum dein compiler zeigt
this
Zeiger als const, macht es Sinn, dass Sie davon abgehalten werden, machenthis
Punkt zu einem anderen Gegenstand als dem es begann mit.InformationsquelleAutor der Antwort John Zwinck
Gab es eine Menge Diskussionen über und die main post nicht richtige Antwort.
Menschen könnten nicht im Graben Kommentare, so ist es besser zu teilen als Haupt-port (PS).
Habe ich einige Untersuchung auf Ubuntu als auch auf VC++, aber es gibt keine richtige Ausgabe (mit
typeid(X).name
).Den Typ der this-Zeiger für eine member-Funktion einer Klasse Typ X, ist X* const. Wenn Sie die member-Funktion deklariert ist, mit der const-Qualifizierer, der Typ der this-Zeiger ist für das member-Funktion der Klasse X, const X* const.
MSDN-link
Konzeptionell ist dies richtig auch, für normale member-Funktion "X* const" - das ist, warum es nicht l-Wert (wie Sie können nicht ändern, seinen Inhalt).
InformationsquelleAutor der Antwort nky
Einen Auszug aus der C++ Primer, 4. ed: "In einer normalen
nonconst
member-Funktion, die Art derthis
ist einconst pointer
zu denclass
geben. Wir können den Wert ändern, auf diethis
Punkte, aber nicht die Adresse ändern, diethis
hält. In einemconst
member-Funktion, die Art derthis
ist einconst pointer
zu einemconst class
- Art-Objekt. Können wir ändern weder das Objekt, auf dasthis
Punkte noch die Adresse, diethis
hält." Dies bedeutet, dass was auch immer VC++ intellisense war die Anzeige korrekt ist.InformationsquelleAutor der Antwort Purnima