Última actualización:2026-10-12
El puntero this en C++¶
Sobre el autor¶
Cuenta pública de WeChat:

1. El puntero this¶
Seguro que muchos de los presentes están aprendiendo Python; en Python existe self, y su analogía en C++ es el puntero this. ¡Veamos juntos, a continuación, un análisis en profundidad del uso del puntero this dentro de las clases!
Hablemos primero de la utilidad del puntero this:
(1) El puntero this de un objeto no forma parte del objeto en sí y no afecta al resultado de sizeof(objeto).
(2) El ámbito de this está dentro de la clase; cuando una función miembro no estática de la clase accede a un miembro no estático de la clase, el compilador pasa automáticamente la dirección del propio objeto como parámetro implícito a la función. Es decir, aunque no escribas el puntero this, el compilador lo añade al compilar; actúa como parámetro formal implícito de las funciones miembro no estáticas, y todos los accesos a los miembros se realizan a través de this.
En segundo lugar, el uso del puntero this:
(1) Cuando una función miembro no estática de la clase devuelve el propio objeto, se usa directamente return *this.
(2) Cuando un parámetro tiene el mismo nombre que una variable miembro, por ejemplo this->n = n (no puede escribirse n = n).
Además, en Internet veréis que this es interpretado por el compilador como A *const o como A const *; ¿cuál de los dos es? Analicémoslo mediante depuración con puntos de interrupción:
Tenemos el siguiente ejemplo:
#include<iostream>
#include<cstring>
using namespace std;
class Person{
public:
typedef enum {
BOY = 0,
GIRL
}SexType;
Person(char *n, int a,SexType s){
name=new char[strlen(n)+1];
strcpy(name,n);
age=a;
sex=s;
}
int get_age() const{
return this->age;
}
Person& add_age(int a){
age+=a;
return *this;
}
~Person(){
delete [] name;
}
private:
char * name;
int age;
SexType sex;
};
int main(){
Person p("zhangsan",20,Person::BOY);
cout<<p.get_age()<<endl;
cout<<p.add_age(10).get_age()<<endl;
return 0;
}
Para este sencillo programa, seguro que no hay problema: se define una clase, se inicializa con el constructor y, tras ajustar la edad de la persona, se vuelve a obtener.
Para verificar cuál de los dos es el puntero this, añadimos ahora un punto de interrupción en add_age; al ejecutar se obtiene lo siguiente:


Se observa que el compilador añade automáticamente A* const, ¡y no A const *this!
A continuación, arriba hay también una función constante; añadamos un punto de interrupción en get_age, como se muestra:

Se observa que el compilador convierte el this anterior en const A* const, algo que también podemos imaginar: como esta función es una función const, solo puede acceder a variables const y a funciones const, y no puede modificar el valor de otras variables; por eso necesita un this que apunte a variables no modificables, es decir const A*; y como el propio this es un puntero const, el resultado es const A* const!
En resumen: this se construye antes de que comience la ejecución de la función miembro y se destruye cuando termina la ejecución del miembro. La función get_age anterior se interpreta como get_age(const A * const this), y la función add_age se interpreta como add_age(A* const this,int a). En C++, las clases y las estructuras solo se diferencian en una cosa: los miembros de una clase son private por defecto, mientras que los de una estructura son public. this es el puntero de la clase; si se tratara de una estructura, this sería el puntero de la estructura.
Temas relacionados¶
- Funciones virtuales puras y clases abstractas en C++ | C++那些事
- Aserciones assert en C++ | C++那些事
- Campos de bits en C++ | C++那些事
- Implementar el polimorfismo de C++ en lenguaje C | C++那些事
- const en C++: constantes y modificación | C++那些事
- La familia completa de const en C++ | C++那些事
- El operador de desreferencia * en C++ | C++那些事
- Inicialización y asignación en C++ | C++那些事
- Formas de devolver varios valores en C++ | C++那些事
- La palabra clave mutable en C++ | C++那些事