Ir para o conteúdo

Última atualização:2026-10-12

O ponteiro this em C++

Sobre o autor

Conta oficial do WeChat:

wechat

1.O ponteiro this

Acredito que muitos de vocês estão estudando Python; Python tem o self e, por analogia, em C++ temos o ponteiro this. Vamos analisar em profundidade o uso do ponteiro this dentro das classes!

Primeiro, falemos sobre a utilidade do ponteiro this:

(1) O ponteiro this de um objeto não faz parte do objeto em si e não afeta o resultado de sizeof(objeto).

(2) O escopo do this é o interior da classe; quando uma função membro não estática da classe acessa um membro não estático da classe, o compilador passa automaticamente o endereço do próprio objeto como um parâmetro implícito para a função. Ou seja, mesmo que você não escreva o ponteiro this, o compilador o adiciona durante a compilação; ele é o parâmetro formal implícito das funções membro não estáticas, e todo acesso aos membros é feito por meio do this.

Em seguida, o uso do ponteiro this:

(1) Ao retornar o próprio objeto da classe em uma função membro não estática, basta usar return *this.

(2) Quando um parâmetro tem o mesmo nome de uma variável membro, como em this->n = n (não se pode escrever n = n).

Além disso, na internet vocês verão que o this é interpretado pelo compilador como A *const ou A const * — qual dos dois será? Analisemos com a depuração via breakpoints:

Temos o seguinte exemplo:

#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 esse programa simples, acredito que não há dúvidas: definimos uma classe, inicializamos o construtor, obtemos a idade da pessoa e, depois de defini-la, a obtemos novamente!

Para verificar qual é o ponteiro this, adicionamos agora um breakpoint em add_age; ao executar, temos o seguinte:

thiscontrust

genthis

Vemos que o compilador adiciona automaticamente A* const para nós, e não A const *this!

Em seguida, como no código acima há também uma função constante, vamos adicionar um breakpoint em get_age, assim:

constthis

Vemos que o compilador transforma o this acima em const A* const — isso vocês já podem imaginar: como a função é const, ela só pode acessar variáveis e funções const, sem modificar o valor de outras variáveis; portanto, é necessário um this que aponte para variáveis que não podem ser modificadas, ou seja, const A*; e como o próprio this é um ponteiro const, o resultado é const A* const!

Resumo: o this é construído antes do início da execução da função membro e destruído após o término da execução do membro. A função get_age acima será interpretada como get_age(const A * const this) e a função add_age como add_age(A* const this,int a). Em C++, classes e estruturas diferem em apenas um ponto: os membros de uma classe são private por padrão, enquanto os de uma estrutura são public. O this é o ponteiro da classe; se fosse uma estrutura, o this seria o ponteiro da estrutura.

Tópicos relacionados

Comentários