logo

'denne'-pekeren i C++

For å forstå 'denne' pekeren er det viktig å vite hvordan objekter ser på funksjoner og datamedlemmer i en klasse.

  1. Hvert objekt får sin egen kopi av datamedlemmet.
  2. Alle får tilgang til samme funksjonsdefinisjon som finnes i kodesegmentet.

Dette betyr at hvert objekt får sin egen kopi av datamedlemmer og alle objekter deler en enkelt kopi av medlemsfunksjoner.
Så nå er spørsmålet at hvis bare én kopi av hver medlemsfunksjon eksisterer og brukes av flere objekter, hvordan får man tilgang til og oppdaterer de riktige datamedlemmene?
Kompilatoren leverer en implisitt peker sammen med navnene på funksjonene som 'dette'.
'Denne'-pekeren sendes som et skjult argument til alle ikke-statiske medlemsfunksjonskall og er tilgjengelig som en lokal variabel i kroppen til alle ikke-statiske funksjoner.'denne'-pekeren er ikke tilgjengelig i statiske medlemsfunksjoner, da statiske medlemsfunksjoner kan kalles uten noe objekt (med klassenavn).
For en klasse X er typen av denne pekeren 'X* '. Dessuten, hvis en medlemsfunksjon av X er erklært som const, er typen av denne pekeren 'const X *' (se denne GFakten )



I den tidlige versjonen av C++ ville «denne»-pekeren bli endret; ved å gjøre dette kan en programmerer endre hvilket objekt en metode jobbet med. Denne funksjonen ble til slutt fjernet, og nå er denne i C++ en r-verdi.
C++ lar objekt ødelegge seg selv ved å kalle følgende kode:








delete> this>;>

>

>

Som Stroustrup sa kan 'dette' være referansen enn pekeren, men referansen var ikke til stede i den tidlige versjonen av C++. Hvis 'dette' er implementert som en referanse, kan problemet ovenfor unngås, og det kan være sikrere enn pekeren.

Følgende er situasjonene der 'denne' pekeren brukes:

1) Når lokal 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;> }>

>

>

Produksjon:

 x = 20>

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



2) For å returnere referanse til det anropende objektet




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

>

>

Når en referanse til et lokalt objekt returneres, kan den returnerte referansen brukes til kjedefunksjonsanrop på en enkelt gjenstand.




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

>

>

Produksjon:

x = 10 y = 20>



Trening:
Forutsi resultatet av følgende programmer. Hvis det er kompileringsfeil, så fiks dem.

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

>

>



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

>

>