'Tämän' osoittimen ymmärtämiseksi on tärkeää tietää, kuinka objektit katsovat luokan toimintoja ja datajäseniä.
- Jokainen objekti saa oman kopion tietojäsenestä.
- Kaikki pääsy samaan funktion määritelmään kuin koodisegmentissä.
Tämä tarkoittaa, että jokainen objekti saa oman kopion tietojäsenistä ja kaikki objektit jakavat yhden kopion jäsenfunktioista.
Sitten kysymys kuuluu, että jos jokaisesta jäsenfunktiosta on olemassa vain yksi kopio ja useat objektit käyttävät sitä, kuinka oikeat datajäsenet saadaan käyttöön ja päivitetään?
Kääntäjä toimittaa implisiittisen osoittimen sekä funktioiden nimet 'tämä'.
'Tämä'-osoitin välitetään piilotettuna argumenttina kaikkiin ei-staattisiin jäsenfunktiokutsuihin, ja se on käytettävissä paikallisena muuttujana kaikkien ei-staattisten funktioiden rungossa.'tämä' osoitin ei ole käytettävissä staattisissa jäsenfunktioissa, koska staattisia jäsenfunktioita voidaan kutsua ilman objektia (luokan nimellä).
Luokassa X tämän osoittimen tyyppi on X*. Lisäksi, jos X:n jäsenfunktio on ilmoitettu const, tämän osoittimen tyyppi on 'const X *' (katso tämä GFact )
C++:n varhaisessa versiossa 'tätä' osoitinta voidaan muuttaa; Näin ohjelmoija voi muuttaa, minkä objektin parissa menetelmä työskenteli. Tämä ominaisuus poistettiin lopulta, ja nyt tämä C++:ssa on r-arvo.
C++ antaa objektin tuhota itsensä kutsumalla seuraavaa koodia:
delete> this>;> |
>
>
tostring menetelmä
Kuten Stroustrup sanoi, 'tämä' voisi olla viite kuin osoitin, mutta viittausta ei ollut C++:n varhaisessa versiossa. Jos 'tämä' toteutetaan viitteenä, yllä oleva ongelma voitaisiin välttää ja se voisi olla turvallisempi kuin osoitin.
Seuraavassa on tilanteita, joissa 'tätä' osoitinta käytetään:
1) Kun paikallisen muuttujan nimi on sama kuin jäsenen nimi
#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;> }> |
>
>
Lähtö:
x = 20>
Rakentajille, alustusluettelo voidaan käyttää myös, kun parametrin nimi on sama kuin jäsenen nimi.
2) Palauttaa viittaus kutsuvaan objektiin
/* Reference to the calling object can be returned */> Test& Test::func ()> {> >// Some processing> >return> *>this>;> }> |
>
>
Kun viittaus paikalliseen objektiin palautetaan, palautettua viittausta voidaan käyttää ketjufunktiokutsuja yhdelle esineelle.
#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;> }> |
>
>
Lähtö:
x = 10 y = 20>
Harjoittele:
Ennusta seuraavien ohjelmien tulos. Jos käännösvirheitä on, korjaa ne.
Kysymys 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;> }> |
>
>
ovat malliesimerkkejä
Kysymys 2
#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>->hauska1(); }> };> > int> main()> {> >Test obj;> >obj.fun2();> >return> 0;> }> |
>
>
Kysymys 3
#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;> }> |
>
>
Kysymys 4
#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;> }> |
>
>