logo

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

>

>

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

>

>

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

>

>



Pregunta 4




#include> using> namespace> std;> > class> Test> {> private>:> >int> x;> >int> y;> public>:> >Test(>int> x = 0,>int> y = 0) {>this>->x = x;>>>->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;> }>

>

>