Última atualização:2026-10-12
O ponteiro this em C++¶
Sobre o autor¶
Conta oficial do 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:


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:

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¶
- Funções virtuais puras e classes abstratas em C++ | C++那些事
- Asserções com assert em C++ | C++那些事
- Bit fields em C++ | C++那些事
- Implementando polimorfismo de C++ em linguagem C | C++那些事
- Constantes e modificadores com const em C++ | C++那些事
- A família completa do const em C++ | C++那些事
- O operador de desreferência * em C++ | C++那些事
- Inicialização e atribuição em C++ | C++那些事
- Formas de retornar múltiplos valores em C++ | C++那些事
- A palavra-chave mutable em C++ | C++那些事