Ich verstehe die Bedeutung von "dies", aber ich kann den Anwendungsfall davon nicht sehen.
Im folgenden Beispiel sollte ich dem Compiler beibringen, dass der Parameter der Elementvariablen entspricht, und ich brauche diesen Zeiger.
%Vor%Was wäre der Anwendungsfall für diesen "anderen" Zeiger als dieses (erfundene) Beispiel?
Danke für alle Antworten. Obwohl ich die Antwort von orangeoctopus als akzeptiert akzeptiere, ist es nur, weil er die meisten Stimmen bekommen hat. Ich muss sagen, dass alle Antworten sehr nützlich sind und mir ein besseres Verständnis geben.
Manchmal möchten Sie sich selbst von einem Operator zurückgeben, z. B. operator=
Es ist nützlich, wenn Sie einen Zeiger auf das aktuelle Objekt an eine andere Funktion übergeben oder es zurückgeben müssen. Letzteres wird verwendet, um Stringing-Funktionen zusammen zu ermöglichen:
%Vor%In C ++ wird es nicht oft verwendet. Eine sehr häufige Verwendung ist jedoch beispielsweise in Qt , wo Sie ein Widget erstellen, das das aktuelle Objekt enthält als Elternteil. In einem Fenster wird beispielsweise eine Schaltfläche als untergeordnetes Element erstellt:
%Vor%Beim Übergeben eines Verweises auf ein Objekt innerhalb einer seiner Methoden. Zum Beispiel:
%Vor%Abgesehen davon, dass Sie einen Zeiger auf Ihr eigenes Objekt erhalten, um es an andere Funktionen zu übergeben (oder zurückzugeben) und zu lösen, dass ein Bezeichner ein Mitglied ist, selbst wenn es von einer lokalen Variable verdeckt wird, gibt es eine wirklich erfundene Verwendung in der Template-Programmierung . Diese Verwendung konvertiert einen nicht abhängigen Namen in einen abhängigen Namen. Vorlagen werden in zwei Durchgängen verifiziert, zuerst vor der eigentlichen Typersetzung und dann erneut nach der Typersetzung.
Wenn Sie eine Vorlagenklasse deklarieren, die von einem ihrer Typparameter abgeleitet ist, müssen Sie den Zugriff auf die Basisklassenmitglieder qualifizieren, so dass der Compiler die Überprüfung im ersten Durchgang umgeht und die Prüfung für den zweiten Durchlauf überlässt:
%Vor% Das wichtigste ist, dass, da test
von T
erbt, alle Referenzen auf this
vom Template-Argument T
abhängig sind und der Compiler daher annimmt, dass er korrekt ist und die eigentliche Verifikation der zweiten überlässt Bühne. Es gibt andere Lösungen, wie zum Beispiel die Qualifizierung mit dem Typ, der die Methode implementiert:
Dies kann jedoch den unerwünschten Nebeneffekt haben, dass der Compiler den Aufruf statisch an printer::print
absetzt, unabhängig davon, ob printer
eine virtuelle Methode ist oder nicht. Wenn also printer::print
als virtuell deklariert wird, wenn eine Klasse von test<print>
abgeleitet wird und print
implementiert, dann wird der letzte Overrider aufgerufen, während, wenn dieselbe Klasse von test2<print>
abgeleitet wird, der Code printer::print
aufrufen würde.
this
ist implizit, wenn Sie eine Memberfunktion oder -variable verwenden, ohne sie anzugeben. Darüber hinaus gibt es viele, viele Situationen, in denen Sie das aktuelle Objekt an eine andere Funktion oder als Rückgabewert übergeben möchten.
Also, ja, es ist sehr nützlich.
Manchmal müssen Sie auf das Objekt "this" selbst verweisen, und manchmal müssen Sie möglicherweise in Fällen disambiguieren, in denen eine lokale Variable oder ein Funktionsparameter ein Klassenmitglied schattieren:
%Vor% Die beiden ersten Fälle ( f()
und g()
sind die sinnvollsten Fälle. Der dritte Fall könnte durch Umbenennen der Klassenmitgliedsvariable vermieden werden, aber in den ersten beiden Fällen ist es unmöglich, this
zu verwenden.
Eine weitere Verwendung von this
besteht darin, Abstürze zu verhindern, wenn eine Methode für eine Methode aufgerufen wird, für einen NULL-Zeiger (ähnlich dem NULL-Objektmuster):
Ob das nützlich ist oder nicht, hängt vom Kontext ab, aber ich habe es gelegentlich gesehen und auch selbst benutzt.