logo

'denne' pointer i C++

For at forstå 'denne' pointer er det vigtigt at vide, hvordan objekter ser på funktioner og datamedlemmer i en klasse.

  1. Hvert objekt får sin egen kopi af datamedlemmet.
  2. Alle får adgang til den samme funktionsdefinition som findes i kodesegmentet.

Det betyder, at hvert objekt får sin egen kopi af datamedlemmer, og alle objekter deler en enkelt kopi af medlemsfunktioner.
Så er spørgsmålet nu, at hvis kun én kopi af hver medlemsfunktion eksisterer og bruges af flere objekter, hvordan tilgås og opdateres de korrekte datamedlemmer?
Compileren leverer en implicit pointer sammen med navnene på funktionerne som 'dette'.
'Denne'-markøren sendes som et skjult argument til alle ikke-statiske medlemsfunktionskald og er tilgængelig som en lokal variabel i kroppen af ​​alle ikke-statiske funktioner.'denne' pointer er ikke tilgængelig i statiske medlemsfunktioner, da statiske medlemsfunktioner kan kaldes uden noget objekt (med klassenavn).
For en klasse X er typen af ​​denne pointer 'X* '. Desuden, hvis en medlemsfunktion af X er erklæret som const, så er typen af ​​denne pointer 'const X *' (se denne GFact )



I den tidlige version af C++ ville 'denne' pointer blive ændret; ved at gøre det kunne en programmør ændre, hvilket objekt en metode arbejdede på. Denne funktion blev til sidst fjernet, og nu er denne i C++ en r-værdi.
C++ lader objekt ødelægge sig selv ved at kalde følgende kode:








delete> this>;>

>

>

Som Stroustrup sagde kunne 'dette' være referencen end pointeren, men referencen var ikke til stede i den tidlige version af C++. Hvis 'dette' er implementeret som en reference, kan ovenstående problem undgås, og det kan være mere sikkert end markøren.

Følgende er de situationer, hvor 'denne' pointer bruges:

1) Når den lokale variabels navn er det samme som medlemmets navn




#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;> }>

>

>

Produktion:

 x = 20>

For konstruktører, initialiseringsliste kan også bruges, når parameternavnet er det samme som medlemmets navn.



2) For at returnere reference til det kaldende objekt




/* Reference to the calling object can be returned */> Test& Test::func ()> {> >// Some processing> >return> *>this>;> }>

>

>

Når en reference til et lokalt objekt returneres, kan den returnerede reference bruges til kædefunktionskald på en enkelt genstand.




#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;> }>

>

>

Produktion:

x = 10 y = 20>



Dyrke motion:
Forudsige output af følgende programmer. Hvis der er kompileringsfejl, skal du rette dem.

Spørgsmål 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;> }>

>

>



Spørgsmål 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>->sjov1(); }> };> > int> main()> {> >Test obj;> >obj.fun2();> >return> 0;> }>

>

>



Spørgsmål 3

char til int




#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;> }>

>

>



Spørgsmål 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;> }>

>

>