Para entender 'este' puntero, es importante saber cómo los objetos ven las funciones y los datos miembros de una clase.
- Cada objeto obtiene su propia copia del miembro de datos.
- Acceso completo a la misma definición de función que está presente en el segmento de código.
Lo que significa que cada objeto obtiene su propia copia de los miembros de datos y todos los objetos comparten una única copia de las funciones miembro.
Entonces, ahora la pregunta es: si solo existe una copia de cada función miembro y es utilizada por múltiples objetos, ¿cómo se accede y actualiza a los miembros de datos adecuados?
El compilador proporciona un puntero implícito junto con los nombres de las funciones como 'esto'.
El puntero 'este' se pasa como argumento oculto a todas las llamadas a funciones miembro no estáticas y está disponible como una variable local dentro del cuerpo de todas las funciones no estáticas.El puntero 'este' no está disponible en funciones miembro estáticas ya que las funciones miembro estáticas se pueden llamar sin ningún objeto (con nombre de clase).
Para una clase X, el tipo de este puntero es 'X*'. Además, si una función miembro de X se declara como constante, entonces el tipo de este puntero es 'const X *' (consulte este GFact)
En la primera versión de C++ se permitía cambiar 'este' puntero; Al hacerlo, un programador podría cambiar en qué objeto estaba trabajando un método. Esta característica finalmente se eliminó y ahora en C++ es un valor r.
C++ permite que los objetos se destruyan a sí mismos llamando al siguiente código:
delete> this>;> |
>
>
Como dijo Stroustrup, 'esto' podría ser la referencia más que el puntero, pero la referencia no estaba presente en la primera versión de C++. Si 'esto' se implementa como referencia, el problema anterior podría evitarse y podría ser más seguro que el puntero.
A continuación se detallan las situaciones en las que se utiliza 'este' puntero:
1) Cuando el nombre de la variable local es el mismo que el nombre del miembro
recorrido en orden del árbol binario
#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;> }> |
>
>
Producción:
x = 20>
Para los constructores, lista de inicializadores También se puede utilizar cuando el nombre del parámetro es el mismo que el nombre del miembro.
2) Para devolver la referencia al objeto que llama
/* Reference to the calling object can be returned */> Test& Test::func ()> {> >// Some processing> >return> *>this>;> }> |
>
>
Cuando se devuelve una referencia a un objeto local, la referencia devuelta se puede utilizar para llamadas a funciones en cadena sobre un solo objeto.
#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;> }> |
>
>
Producción:
x = 10 y = 20>
Ejercicio:
Predecir el resultado de los siguientes programas. Si hay errores de compilación, corríjalos.
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;> }> |
>
>
alfabeto en números
Pregunta 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>->divertido1(); }> };> > 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;>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;> }> |
>
>
Pregunta 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;> }> |
>
>