Um „diesen“ Zeiger zu verstehen, ist es wichtig zu wissen, wie Objekte Funktionen und Datenelemente einer Klasse betrachten.
- Jedes Objekt erhält eine eigene Kopie des Datenelements.
- Greifen Sie bei allen Zugriffen auf dieselbe Funktionsdefinition zu, die im Codesegment vorhanden ist.
Das bedeutet, dass jedes Objekt seine eigene Kopie der Datenelemente erhält und alle Objekte eine einzige Kopie der Elementfunktionen gemeinsam nutzen.
Die Frage ist nun: Wenn nur eine Kopie jeder Mitgliedsfunktion vorhanden ist und von mehreren Objekten verwendet wird, wie wird dann auf die richtigen Datenmitglieder zugegriffen und diese aktualisiert?
Der Compiler liefert einen impliziten Zeiger zusammen mit den Namen der Funktionen als „this“.
Der „this“-Zeiger wird als verstecktes Argument an alle nichtstatischen Member-Funktionsaufrufe übergeben und ist als lokale Variable im Hauptteil aller nichtstatischen Funktionen verfügbar.Der Zeiger „dieser“ ist in statischen Memberfunktionen nicht verfügbar, da statische Memberfunktionen ohne Objekt (mit Klassennamen) aufgerufen werden können.
Für eine Klasse X ist der Typ dieses Zeigers „X*“. Wenn außerdem eine Mitgliedsfunktion von X als const deklariert ist, ist der Typ dieses Zeigers „const X *“ (siehe dieses GFact).
In der frühen Version von C++ konnte „dieser“ Zeiger geändert werden; Auf diese Weise könnte ein Programmierer ändern, an welchem Objekt eine Methode arbeitet. Diese Funktion wurde schließlich entfernt, und jetzt ist dies in C++ ein R-Wert.
C++ lässt Objekte sich selbst zerstören, indem es den folgenden Code aufruft:
delete> this>;> |
>
>
Wie Stroustrup sagte, könnte „dies“ die Referenz und nicht der Zeiger sein, aber die Referenz war in der frühen Version von C++ nicht vorhanden. Wenn „this“ als Referenz implementiert wird, könnte das obige Problem vermieden werden und es könnte sicherer als der Zeiger sein.
sortiertes Tupel-Python
Im Folgenden sind die Situationen aufgeführt, in denen der Zeiger „dieser“ verwendet wird:
1) Wenn der Name der lokalen Variablen mit dem Namen des Mitglieds übereinstimmt
#include> using> namespace> std;> > /* local variable is same as a member's name */> class> Test> {> private>:> >int> x;> public>:> >void> setX (>int> x)> >{> >// The 'this' pointer is used to retrieve the object's x> >// hidden by the local variable 'x'> >this>->x = x;> >}> >void> print() { cout <<>'x = '> << x << endl; }> };> > int> main()> {> >Test obj;> >int> x = 20;> >obj.setX(x);> >obj.print();> >return> 0;> }> |
>
>
Ausgabe:
x = 20>
Für Konstrukteure, Initialisierungsliste kann auch verwendet werden, wenn der Parametername mit dem Namen des Mitglieds übereinstimmt.
2) Um einen Verweis auf das aufrufende Objekt zurückzugeben
/* Reference to the calling object can be returned */> Test& Test::func ()> {> >// Some processing> >return> *>this>;> }> |
>
>
Wenn ein Verweis auf ein lokales Objekt zurückgegeben wird, kann der zurückgegebene Verweis verwendet werden Kettenfunktionsaufrufe auf ein einzelnes Objekt.
#include> using> namespace> std;> > class> Test> {> private>:> >int> x;> >int> y;> public>:> >Test(>int> x = 0,>int> y = 0) {>this>->x = x;>this>->y = y; }> >Test &setX(>int> a) { x = a;>return> *>this>; }> >Test &setY(>int> b) { y = b;>return> *>this>; }> >void> print() { cout <<>'x = '> << x <<>' y = '> << y << endl; }> };> > int> main()> {> >Test obj1(5, 5);> > >// Chained function calls. All calls modify the same object> >// as the same object is returned by reference> >obj1.setX(10).setY(20);> > >obj1.print();> >return> 0;> }> |
Wenn sonst, wenn sonst, wenn Java
>
>
Ausgabe:
x = 10 y = 20>
Übung:
Sagen Sie die Ausgabe der folgenden Programme voraus. Wenn Kompilierungsfehler vorliegen, beheben Sie diese.
Frage 1
#include> using> namespace> std;> > class> Test> {> private>:> >int> x;> public>:> >Test(>int> x = 0) {>this>->x = x; }> >void> change(Test *t) {>this> = t; }> >void> print() { cout <<>'x = '> << x << endl; }> };> > int> main()> {> >Test obj(5);> >Test *ptr =>new> Test (10);> >obj.change(ptr);> >obj.print();> >return> 0;> }> |
>
>
Frage 2
#include> using> namespace> std;> > class> Test> {> private>:> >int> x;> >int> y;> public>:> >Test(>int> x = 0,>int> y = 0) {>this>->x = x;>this>->y = y; }> >static> void> fun1() { cout <<>'Inside fun1()'>; }> >static> void> fun2() { cout <<>'Inside fun2()'>;>this>->fun1(); }> };> > int> main()> {> >Test obj;> >obj.fun2();> >return> 0;> }> |
>
Mylive Cricket
>
Frage 3
#include> using> namespace> std;> > class> Test> {> private>:> >int> x;> >int> y;> public>:> >Test (>int> x = 0,>int> y = 0) {>this>->x = x;>this>->y = y; }> >Test setX(>int> a) { x = a;>return> *>this>; }> >Test setY(>int> b) { y = b;>return> *>this>; }> >void> print() { cout <<>'x = '> << x <<>' y = '> << y << endl; }> };> > int> main()> {> >Test obj1;> >obj1.setX(10).setY(20);> >obj1.print();> >return> 0;> }> |
>
>
Frage 4
#include> using> namespace> std;> > class> Test> {> private>:> >int> x;> >int> y;> public>:> >Test(>int> x = 0,>int> y = 0) {>this>->x = x;>this>->y = y; }> >void> setX(>int> a) { x = a; }> >void> setY(>int> b) { y = b; }> >void> destroy() {>delete> this>; }> >void> print() { cout <<>'x = '> << x <<>' y = '> << y << endl; }> };> > int> main()> {> >Test obj;> >obj.destroy();> >obj.print();> >return> 0;> }> |
>
>