Lai saprastu “šo” rādītāju, ir svarīgi zināt, kā objekti aplūko klases funkcijas un datu elementus.
- Katrs objekts iegūst savu datu dalībnieka kopiju.
- Pilnas piekļuves funkcija ir tāda pati kā koda segmentā.
Tas nozīmē, ka katrs objekts iegūst savu datu dalībnieku kopiju, un visiem objektiem ir viena dalībnieka funkciju kopija.
Tagad jautājums ir tāds, ka, ja eksistē tikai viena katras dalībnieka funkcijas kopija un to izmanto vairāki objekti, kā tiek piekļūti un atjaunināti pareizie datu dalībnieki?
Kompilators nodrošina netiešu rādītāju kopā ar funkciju nosaukumiem kā “this”.
Rādītājs “šis” tiek nodots kā slēpts arguments visiem nestatiskajiem dalībnieku funkciju izsaukumiem un ir pieejams kā lokāls mainīgais visu nestatisko funkciju pamattekstā.“šis” rādītājs nav pieejams statiskajās biedru funkcijās, jo statiskās biedru funkcijas var izsaukt bez objekta (ar klases nosaukumu).
X klasei šī rādītāja veids ir “X*”. Turklāt, ja X dalībnieka funkcija ir deklarēta kā const, tad šī rādītāja veids ir “const X *” (skatiet šo GFact )
C++ sākotnējā versijā ļautu mainīt “šo” rādītāju; to darot, programmētājs var mainīt objektu, pie kura metode strādāja. Šis līdzeklis galu galā tika noņemts, un tagad tas C++ ir r-vērtība.
C++ ļauj objektiem sevi iznīcināt, izsaucot šādu kodu:
delete> this>;> |
>
>
Kā teica Stroustrups, “tas” varētu būt atsauce, nevis rādītājs, taču atsauces C++ agrīnajā versijā nebija. Ja “tas” tiek ieviests kā atsauce, no iepriekš minētās problēmas varētu izvairīties un tas varētu būt drošāks par rādītāju.
Tālāk ir norādītas situācijas, kurās tiek izmantots “šis” rādītājs:
1) Ja vietējā mainīgā nosaukums ir tāds pats kā dalībnieka nosaukums
#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;> }> |
>
>
Izvade:
x = 20>
Konstruktoriem, inicializatoru saraksts var izmantot arī tad, ja parametra nosaukums ir tāds pats kā dalībnieka vārds.
2) Lai atgrieztu atsauci uz izsaucošo objektu
stīgu metodes java
/* Reference to the calling object can be returned */> Test& Test::func ()> {> >// Some processing> >return> *>this>;> }> |
>
>
Kad tiek atgriezta atsauce uz vietējo objektu, atgriezto atsauci var izmantot ķēdes funkciju zvani uz viena objekta.
#include> using> namespace> std;> > class> Test> {> private>:> >int> x;> >int> y;> public>:> >Test(>int> x = 0,>int> y = 0) {>this>->x = x;>> >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;> }> |
>
>
Izvade:
x = 10 y = 20>
Vingrinājums:
Prognozējiet šādu programmu izvadi. Ja ir kompilācijas kļūdas, izlabojiet tās.
jautājums 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;> }> |
>
>
konvertēt virknes datumu
2. jautājums
#include> using> namespace> std;> > class> Test> {> private>:> >int> x;> >int> y;> public>:> >Test(>int> x = 0,>int> y = 0) {>this>->x = x;>> >static> void> fun1() { cout <<>'Inside fun1()'>; }> >static> void> fun2() { cout <<>'Inside fun2()'>;>this>->jautri1(); }> };> > int> main()> {> >Test obj;> >obj.fun2();> >return> 0;> }> |
>
>
3. jautājums
#include> using> namespace> std;> > class> Test> {> private>:> >int> x;> >int> y;> public>:> >Test (>int> x = 0,>int> y = 0) {>this>->x = x;>> >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. jautājums
#include> using> namespace> std;> > class> Test> {> private>:> >int> x;> >int> y;> public>:> >Test(>int> x = 0,>int> y = 0) {>this>->x = x;>> >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;> }> |
>
>