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