Saltar a contenido

Última actualización:2026-10-12

El puntero this en C++

Sobre el autor

Cuenta pública de WeChat:

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:

thiscontrust

genthis

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:

constthis

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

Comentarios