Der Anwendungsfall von 'diesem' Zeiger in C ++

7

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?

Hinzugefügt

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.

    
prosseek 23.07.2010, 17:09
quelle

14 Antworten

12

Manchmal möchten Sie sich selbst von einem Operator zurückgeben, z. B. operator=

%Vor%     
Donald Miner 23.07.2010, 17:14
quelle
12

Der Zeiger 'this' ist nützlich, wenn eine Methode der Klasse die Instanz (this) an eine andere Funktion übergeben muss.

    
Patrick 23.07.2010 17:12
quelle
9

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%     
Michael Mrozek 23.07.2010 17:14
quelle
3

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%     
Gianni 23.07.2010 17:12
quelle
3

Beim Übergeben eines Verweises auf ein Objekt innerhalb einer seiner Methoden. Zum Beispiel:

%Vor%     
Andrew Garrison 23.07.2010 17:13
quelle
3

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:

%Vor%

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.

%Vor%     
quelle
2

Sie können ein dynamisch erstelltes Objekt löschen, indem Sie delete this von einer seiner Elementfunktionen aufrufen.

    
tsiki 23.07.2010 17:20
quelle
1

Der this-Zeiger ist der Zeiger auf das Objekt selbst. Betrachten Sie zum Beispiel die folgende Methode:

%Vor%     
Krumelur 23.07.2010 17:12
quelle
1
%Vor%     
James Curran 23.07.2010 17:13
quelle
1

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.

    
zneak 23.07.2010 17:23
quelle
1

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.

    
jalf 23.07.2010 17:32
quelle
1

Ein weiterer möglicher Anwendungsfall von this :

%Vor% %Vor%     
Vanni Totaro 23.07.2010 18:28
quelle
1

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):

%Vor%

Ob das nützlich ist oder nicht, hängt vom Kontext ab, aber ich habe es gelegentlich gesehen und auch selbst benutzt.

    
Niki 23.07.2010 18:45
quelle
0

Selbstzuweisungsschutz

    
nbourbaki 24.07.2010 04:59
quelle

Tags und Links