paulo1205
(usa Ubuntu)
Enviado em 07/07/2015 - 14:57h
O ponteiro
this é uma referência para o próprio objeto usado para invocar uma função-membro (ou método, no linguajar de alguns).
O exemplo do Thiago, de usar o ponteiro para ter uma referência explícita a um membro da classe (e particularmente numa situação de potencial conflito de nomes), é um dos casos de uso, mas não é o único nem é o mais importante -- até porque o problema que ele mostrou geralmente é tratado simplesmente evitando os conflitos.
Dentro de uma função-membro, o valor do ponteiro
this é igual ao endereço do objeto que foi usado para chamar a função. Esse ponteiro existe sempre no escopo de funções-membro não-estáticas, e é única a forma pela qual a função-membro consegue saber sobre qual objeto atuar, membro que você nem sempre o escreva explicitamente, lá ele estará.
class SomeClass {
private:
int val;
public:
SomeClass(int new_val): val(new_val) { }
void SomeFunc(int x){
/* Implicitamente equivalente a “this->val+=x” */
val+=x;
}
SomeClass &operator=(int other_val);
};
Para todos os efeitos, é como se o endereço do objeto fosse passado como argumento de todas as funções-membros da classe, até mesmo daquelas que não recebem parâmetros. (E, na verdade, é isso mesmo o que o compilador faz por trás das cortinas: ele transformaria algo parecido com
obj.SomeFunc(10) em
SomeClass::SomeFunc(&obj, 10).)
Algumas vezes, é preciso ser explícito. Como parte do funcionamento da função, você poderia precisar saber o valor do endereço do objeto, e informá-lo para alguma função que precise de tal informação. Mas algo muito comum é você querer não o ponteiro, mas sim uma referência ao próprio objeto. Nesses casos, você deve dizer
*this (i.e. “conteúdo do endereço indicado por
this”). Veja como ficaria a implementação da função
operator=(), declarada acima.
SomeClass &SomeClass::operator=(int other_val){
val=other_val;
return *this;
}
Um artigo que explica mais detalhadamente pode ser encontrado em
http://en.cppreference.com/w/cpp/language/this.