Tema
23 El Puntero this
|
|
|
|
|
|
|
|
|
|
|
|
|
Teoría:
Sobrecarga
del operador de asignación =
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Como
indica el comentario que precede al uso anterior de this, normalmente
no necesitamos el apuntador this. Sin embargo, en unas cuantas situaciones
resulta útil.
Un
lugar en el que suele utilizarse el apuntador this es en
la sobrecarga del operador de asignación =. Por ejemplo,
consideremos la siguiente clase:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class
ClaseCadena {
public:
...
ClaseCadena&
operador =(const CalseCadena& lado_derecho);
...
private:
char
*a; //Arreglo dinámico para un valor de cadena
//
que termina con '\0'.
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Podemos
utilizar la definición del operador de asignaión sobrecargado
en cadenas de asignaciones como
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
s1
= s2 = s3;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
La
definición del operador de asignación sobrecargado
utiliza el apuntador this para devolver el objeto que está
a la izquierda del signo = (que es el objeto invocador):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//
Esta versión no funciona en todos los casos. Vea también
la siguiente
versión
ClaseCadena&
ClaseCadena::operador =(const ClaseCadena& lado_derecho) {
delete
[] a;
a
= new char[strlen(lado_derecho.a)+1];
strcpy(a,
lado_derecho.a);
return
* this;
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
La
definición anterior tiene un problema en un caso: si el mismo
objeto ocurre en ambos lados del operador de asignación (como
en s = s;), el miembro del arreglo será eliminado. Para evitar
este problema, podemos probar este caso especial con el apuntador
this, como sigue:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//
versión final con el error corregido
ClaseCadena&
ClaseCadena::operador=(const ClaseCadena& lado_derecho){
if
(this == &lado_derecho){
return
* this;
}
else
{
delete[]
a;
a
= new char[strlen(lado_derecho.a)+1];
strcpy(a,
lado_derecho.a);
return
*this;
}
}
|
|