Per entendre 'aquest' punter, és important saber com es veuen els objectes a les funcions i als membres de dades d'una classe.
- Cada objecte obté la seva pròpia còpia del membre de dades.
- Accedeix tots a la mateixa definició de funció que hi ha al segment de codi.
Això vol dir que cada objecte obté la seva pròpia còpia dels membres de dades i tots els objectes comparteixen una única còpia de les funcions dels membres.
Aleshores, ara la pregunta és que si només existeix una còpia de cada funció membre i la fan servir diversos objectes, com s'accedeix i s'actualitzen els membres de dades adequats?
El compilador proporciona un punter implícit juntament amb els noms de les funcions com a 'això'.
El punter 'aquest' es passa com a argument ocult a totes les trucades de funcions membres no estàtiques i està disponible com a variable local dins del cos de totes les funcions no estàtiques.El punter 'aquest' no està disponible a les funcions de membre estàtiques, ja que les funcions de membre estàtiques es poden cridar sense cap objecte (amb nom de classe).
Per a una classe X, el tipus d'aquest punter és 'X*'. A més, si una funció membre de X es declara com a const, el tipus d'aquest punter és 'const X *' (vegeu aquest GFact )
A la primera versió de C++ permetria canviar el punter 'aquest'; fent-ho, un programador podria canviar en quin objecte estava treballant un mètode. Aquesta característica es va eliminar finalment, i ara això en C++ és un valor r.
C++ permet que l'objecte es destrueixi cridant al codi següent:
delete> this>;> |
>
>
Com va dir Stroustrup, 'això' podria ser la referència que el punter, però la referència no estava present a la versió inicial de C++. Si s'implementa 'això' com a referència, es podria evitar el problema anterior i podria ser més segur que el punter.
A continuació es mostren les situacions en què s'utilitza 'aquest' punter:
1) Quan el nom de la variable local és el mateix que el nom del membre
#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;> }> |
>
>
Sortida:
x = 20>
Per als constructors, llista d'inicialitzadors també es pot utilitzar quan el nom del paràmetre és el mateix que el nom del membre.
2) Per tornar la referència a l'objecte cridant
/* Reference to the calling object can be returned */> Test& Test::func ()> {> >// Some processing> >return> *>this>;> }> |
>
>
Quan es retorna una referència a un objecte local, la referència retornada es pot utilitzar per crides a funcions en cadena sobre un sol objecte.
interfície comparable a java
#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;> }> |
>
>
Sortida:
x = 10 y = 20>
Exercici:
Prediu la sortida dels programes següents. Si hi ha errors de compilació, corregiu-los.
Pregunta 1
#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;> }> |
>
>
matemàtiques java pow
Pregunta 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>->diversió1(); }>>> int> main()> {> >Test obj;> >obj.fun2();> >return> 0;> }> |
>
>
Pregunta 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;> }> |
>
>
Pregunta 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;> }> |
>
>