logo

kazalec 'ta' v C++

Za razumevanje kazalca 'ta' je pomembno vedeti, kako objekti gledajo na funkcije in podatkovne člane razreda.

  1. Vsak objekt dobi svojo kopijo podatkovnega člana.
  2. Vsestranski dostop do iste definicije funkcije, kot je prisotna v segmentu kode.

To pomeni, da vsak objekt dobi svojo kopijo podatkovnih članov in da si vsi objekti delijo eno kopijo članskih funkcij.
Potem je zdaj vprašanje, če obstaja samo ena kopija vsake funkcije člana in jo uporablja več objektov, kako se dostopa do ustreznih podatkovnih članov in jih posodablja?
Prevajalnik posreduje implicitni kazalec skupaj z imeni funkcij kot 'to'.
Kazalec »ta« se kot skriti argument posreduje vsem klicem nestatične funkcije članice in je na voljo kot lokalna spremenljivka v telesu vseh nestatičnih funkcij.Kazalec 'ta' ni na voljo v statičnih članskih funkcijah, saj je statične članske funkcije mogoče poklicati brez kakršnega koli predmeta (z imenom razreda).
Za razred X je tip tega kazalca 'X*'. Poleg tega, če je funkcija članica X deklarirana kot const, potem je tip tega kazalca 'const X *' (glejte ta GFact )



V zgodnji različici C++ bi dovolili, da se kazalec 'ta' spremeni; s tem bi programer lahko spremenil, na katerem objektu metoda deluje. Ta funkcija je bila sčasoma odstranjena in zdaj je to v C++ r-vrednost.
C++ dovoljuje objektom, da se uničijo s klicem naslednje kode:








delete> this>;>

>

>

Kot je rekel Stroustrup, je 'to' lahko referenca kot kazalec, vendar referenca ni bila prisotna v zgodnji različici C++. Če je potem »to« implementirano kot referenca, bi se lahko izognili zgornji težavi in ​​bi lahko bilo varnejše od kazalca.

Spodaj so primeri, v katerih se uporablja kazalec »ta«:

1) Ko je ime lokalne spremenljivke enako imenu člana




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

>

disketa

>

Izhod:

 x = 20>

Za konstruktorje, seznam inicializatorjev lahko uporabite tudi, če je ime parametra enako imenu člana.



2) Za vrnitev sklica na klicni objekt




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

>

>

Ko je vrnjen sklic na lokalni objekt, se vrnjeni sklic lahko uporabi za verižni funkcijski klici na enem samem objektu.




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

>

>

Izhod:

x = 10 y = 20>



Vaja:
Predvidi izhod naslednjih programov. Če obstajajo napake pri prevajanju, jih popravite.

Vprašanje 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;> }>

>

>

java math pow



2. vprašanje




#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>->zabavno1(); }> };> > int> main()> {> >Test obj;> >obj.fun2();> >return> 0;> }>

>

>



3. vprašanje




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

>

>



4. vprašanje




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

>

>