Pentru a înțelege „acest” pointer, este important să știți cum arată obiectele la funcțiile și membrii de date ai unei clase.
- Fiecare obiect primește propria copie a membrului de date.
- Accesați în totalitate aceeași definiție de funcție ca cea prezentă în segmentul de cod.
Înseamnă că fiecare obiect primește propria copie a membrilor datelor și toate obiectele partajează o singură copie a funcțiilor membru.
Atunci întrebarea este că, dacă există o singură copie a fiecărei funcții de membru și este utilizată de mai multe obiecte, cum sunt accesați și actualizați membrii de date corespunzători?
Compilatorul furnizează un pointer implicit împreună cu numele funcțiilor ca „this”.
Pointerul „acest” este transmis ca argument ascuns tuturor apelurilor de funcții membre nestatice și este disponibil ca variabilă locală în corpul tuturor funcțiilor nestatice.pointerul „acest” nu este disponibil în funcțiile membre statice, deoarece funcțiile membre statice pot fi apelate fără niciun obiect (cu numele clasei).
Pentru o clasă X, tipul acestui indicator este „X*”. De asemenea, dacă o funcție membru a lui X este declarată ca const, atunci tipul acestui pointer este „const X *” (vezi acest GFact )
În versiunea timpurie a C++, ar permite ca indicatorul „acest” să fie schimbat; făcând acest lucru, un programator ar putea schimba obiectul la care lucra o metodă. Această caracteristică a fost în cele din urmă eliminată, iar acum aceasta în C++ este o valoare r.
C++ permite obiectului să se distrugă prin apelarea următorului cod:
delete> this>;> |
>
ipconfig pe Ubuntu
>
După cum a spus Stroustrup, „acest lucru” ar putea fi referința decât indicatorul, dar referința nu a fost prezentă în versiunea timpurie a C++. Dacă „acest lucru” este implementat ca referință, atunci problema de mai sus ar putea fi evitată și ar putea fi mai sigură decât indicatorul.
Următoarele sunt situațiile în care este folosit indicatorul „acest”:
1) Când numele variabilei locale este același cu numele membrului
#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;> }> |
>
>
Ieșire:
x = 20>
Pentru constructori, lista de inițializare poate fi folosit și când numele parametrului este același cu numele membrului.
2) Pentru a returna referința la obiectul apelant
/* Reference to the calling object can be returned */> Test& Test::func ()> {> >// Some processing> >return> *>this>;> }> |
>
>
sunt exemple model
Când se returnează o referință la un obiect local, referința returnată poate fi folosită pentru apeluri de funcție în lanț pe un singur obiect.
#include> using> namespace> std;> > class> Test> {> private>:> >int> x;> >int> y;> public>:> >Test(>int> x = 0,>int> y = 0) {>this>->x = x;>>>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;> }> |
>
>
Ieșire:
x = 10 y = 20>
Exercițiu:
Preziceți rezultatul următoarelor programe. Dacă există erori de compilare, remediați-le.
Intrebarea 1
lup versus vulpe
#include> using> namespace> std;> > class> Test> {> private>:> >int> x;> public>:> >Test(>int> x = 0) {>this>->x = x; }>>> 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;> }> |
>
>
intrebarea 2
#include> using> namespace> std;> > class> Test> {> private>:> >int> x;> >int> y;> public>:> >Test(>int> x = 0,>int> y = 0) {>this>->x = x;>>> void> fun1() { cout <<>'Inside fun1()'>; }> >static> void> fun2() { cout <<>'Inside fun2()'>;>this>->distracție1(); }>>> int> main()> {> >Test obj;> >obj.fun2();> >return> 0;> }> |
>
>
Întrebarea 3
#include> using> namespace> std;> > class> Test> {> private>:> >int> x;> >int> y;> public>:> >Test (>int> x = 0,>int> y = 0) {>this>->x = x;>>>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;> }> |
>
>
Întrebarea 4
șir c în matrice
#include> using> namespace> std;> > class> Test> {> private>:> >int> x;> >int> y;> public>:> >Test(>int> x = 0,>int> y = 0) {>this>->x = x;>>> 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;> }> |
>
>