Om ‘deze’ aanwijzer te begrijpen, is het belangrijk om te weten hoe objecten naar functies en gegevensleden van een klasse kijken.
- Elk object krijgt zijn eigen kopie van het gegevenslid.
- Iedereen heeft toegang tot dezelfde functiedefinitie als aanwezig in het codesegment.
Dit betekent dat elk object zijn eigen kopie van gegevensleden krijgt en dat alle objecten één kopie van lidfuncties delen.
De vraag is nu: als er slechts één kopie van elke lidfunctie bestaat en door meerdere objecten wordt gebruikt, hoe kunnen dan de juiste gegevensleden worden benaderd en bijgewerkt?
De compiler levert een impliciete pointer samen met de namen van de functies als ‘this’.
De ‘this’-aanwijzer wordt als verborgen argument doorgegeven aan alle niet-statische lidfunctieaanroepen en is beschikbaar als lokale variabele binnen de hoofdtekst van alle niet-statische functies.‘deze’ pointer is niet beschikbaar in statische lidfuncties, omdat statische lidfuncties kunnen worden aangeroepen zonder enig object (met klassenaam).
Voor een klasse X is het type van deze pointer ‘X*’. Als een lidfunctie van X wordt gedeclareerd als const, dan is het type van deze pointer ‘const X *’ (zie deze GFact )
In de vroege versie van C++ zou ‘deze’ pointer worden gewijzigd; door dit te doen kon een programmeur veranderen aan welk object een methode werkte. Deze functie is uiteindelijk verwijderd en nu is dit in C++ een r-waarde.
C++ laat objecten zichzelf vernietigen door de volgende code aan te roepen:
delete> this>;> |
>
>
top 10 hentai
Zoals Stroustrup zei: ‘dit’ zou de referentie kunnen zijn dan de pointer, maar de referentie was niet aanwezig in de vroege versie van C++. Als ‘dit’ als referentie wordt geïmplementeerd, kan het bovenstaande probleem worden vermeden en kan het veiliger zijn dan de aanwijzer.
Hieronder volgen de situaties waarin ‘deze’ aanwijzer wordt gebruikt:
1) Wanneer de naam van de lokale variabele hetzelfde is als de naam van het lid
reeks van int
#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;> }> |
>
>
Uitgang:
x = 20>
Voor constructeurs, initialisatielijst kan ook worden gebruikt als de parameternaam hetzelfde is als de naam van het lid.
2) Om de verwijzing naar het oproepende object terug te geven
/* Reference to the calling object can be returned */> Test& Test::func ()> {> >// Some processing> >return> *>this>;> }> |
>
>
Wanneer een verwijzing naar een lokaal object wordt geretourneerd, kan de geretourneerde verwijzing worden gebruikt ketenfunctieaanroepen op één enkel voorwerp.
verborgen apps op dit apparaat
#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;> }> |
>
>
Uitgang:
x = 10 y = 20>
Oefening:
Voorspel de uitvoer van de volgende programma's. Als er compilatiefouten zijn, repareer deze dan.
Vraag 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 hoe te overschrijven
>
vraag 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>->leuk1(); }> };> > int> main()> {> >Test obj;> >obj.fun2();> >return> 0;> }> |
>
>
vraag 3
iterator Java-kaart
#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;> }> |
>
>
Vraag 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;> }> |
>
>