punter 'aquest' en C++

Per entendre 'aquest' punter, és important saber com es veuen els objectes a les funcions i als membres de dades d'una classe.

  1. Cada objecte obté la seva pròpia còpia del membre de dades.
  2. 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;>>>

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.




#include> using> namespace> std;> > class> Test> {> private> :> > int> x;> > int> y;> public> :> > Test(> int> x = 0,> int> y = 0) {> this> ->x = x;>>>

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; }>>>



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> fun2() { cout < <> 'Inside fun2()'> ;> this> ->diversió1(); }>>>



Pregunta 3




#include> using> namespace> std;> > class> Test> {> private> :> > int> x;> > int> y;> public> :> > Test (> int> x = 0,> int> y = 0) {> this> ->x = x;>>>



Pregunta 4




#include> using> namespace> std;> > class> Test> {> private> :> > int> x;> > int> y;> public> :> > Test(> int> x = 0,> int> y = 0) {> this> ->x = x;>>>