logo

'den här' pekaren i C++

För att förstå 'denna' pekare är det viktigt att veta hur objekt ser på funktioner och datamedlemmar i en klass.

  1. Varje objekt får sin egen kopia av datamedlemmen.
  2. Alla får åtkomst till samma funktionsdefinition som finns i kodsegmentet.

Detta innebär att varje objekt får sin egen kopia av datamedlemmar och alla objekt delar en enda kopia av medlemsfunktioner.
Då är frågan nu att om bara en kopia av varje medlemsfunktion existerar och används av flera objekt, hur nås och uppdateras de korrekta datamedlemmarna?
Kompilatorn tillhandahåller en implicit pekare tillsammans med namnen på funktionerna som 'detta'.
'den här'-pekaren skickas som ett dolt argument till alla icke-statiska medlemsfunktionsanrop och är tillgänglig som en lokal variabel i kroppen av alla icke-statiska funktioner.'den här' pekaren är inte tillgänglig i statiska medlemsfunktioner eftersom statiska medlemsfunktioner kan anropas utan något objekt (med klassnamn).
För en klass X är typen av denna pekare 'X*'. Dessutom, om en medlemsfunktion av X deklareras som const, är typen av denna pekare 'const X *' (se denna GFakt )



I den tidiga versionen av C++ skulle 'denna' pekare ändras; genom att göra så kunde en programmerare ändra vilket objekt en metod arbetade på. Denna funktion togs så småningom bort, och nu är detta i C++ ett r-värde.
C++ låter objekt förstöra sig själva genom att anropa följande kod:








delete> this>;>

>

>

Som Stroustrup sa kan 'detta' vara referensen än pekaren, men referensen fanns inte i den tidiga versionen av C++. Om 'detta' implementeras som en referens kan ovanstående problem undvikas och det kan vara säkrare än pekaren.

mjukvarutestning och typer

Följande är situationerna där 'den här' pekaren används:

1) När den lokala variabelns namn är samma som medlemmens namn




java sträng cmp

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

För konstruktörer, initieringslista kan också användas när parameternamnet är samma som medlemmens namn.



2) För att returnera referens till det anropande objektet




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

>

>

När en referens till ett lokalt objekt returneras kan den returnerade referensen användas till kedjefunktionsanrop på ett enda föremål.


string.replaceall java



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



Träning:
Förutsäg resultatet av följande program. Om det finns kompileringsfel, åtgärda dem.

Fråga 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;> }>

>

>

tredje normalformen



fråga 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;> }>

>

>



Fråga 3

mark zuckerberg utbildning




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

>

>



Fråga 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;> }>

>

>