Ponteiro this
O ponteiro this é um ponteiro acessível somente nas funções de membro não estáticas de um tipo class, struct ou union. Ele aponta para o objeto para o qual a função de membro é chamada. As funções de membro estáticas não têm um ponteiro this.
this
this->member-identifier
Comentários
O ponteiro this de um objeto não faz parte do objeto em si; ele não é refletido no resultado de uma instrução sizeof no objeto. Em vez disso, quando uma função de membro não estática é chamada para um objeto, o endereço do objeto é transmitido pelo compilador como um argumento oculto à função. Por exemplo, a chamada de função a seguir:
myDate.setMonth( 3 );
pode ser interpretada desta forma:
setMonth( &myDate, 3 );
O endereço do objeto está disponível de dentro da função de membro como o ponteiro this. A maioria dos usos de this é implícita. É válido, embora não seja necessário, usar explicitamente this ao fazer referência a membros da classe. Por exemplo:
void Date::setMonth( int mn )
{
month = mn; // These three statements
this->month = mn; // are equivalent
(*this).month = mn;
}
A expressão *this é geralmente usada para retornar o objeto atual de uma função de membro:
return *this;
O ponteiro this também é usado para proteger contra a autorreferência:
if (&Object != this) {
// do not execute in cases of self-reference
Dica
Como o ponteiro this é não modificável, as atribuições a this não são permitidas.As implementações anteriores do C++ permitiam atribuições a this.
Ocasionalmente, o ponteiro this é usado diretamente — por exemplo, para manipular as estruturas de dados autorreferenciais, onde o endereço do objeto atual é necessário.
Exemplo
// this_pointer.cpp
// compile with: /EHsc
#include <iostream>
#include <string.h>
using namespace std;
class Buf
{
public:
Buf( char* szBuffer, size_t sizeOfBuffer );
Buf& operator=( const Buf & );
void Display() { cout << buffer << endl; }
private:
char* buffer;
size_t sizeOfBuffer;
};
Buf::Buf( char* szBuffer, size_t sizeOfBuffer )
{
sizeOfBuffer++; // account for a NULL terminator
buffer = new char[ sizeOfBuffer ];
if (buffer)
{
strcpy_s( buffer, sizeOfBuffer, szBuffer );
sizeOfBuffer = sizeOfBuffer;
}
}
Buf& Buf::operator=( const Buf &otherbuf )
{
if( &otherbuf != this )
{
if (buffer)
delete [] buffer;
sizeOfBuffer = strlen( otherbuf.buffer ) + 1;
buffer = new char[sizeOfBuffer];
strcpy_s( buffer, sizeOfBuffer, otherbuf.buffer );
}
return *this;
}
int main()
{
Buf myBuf( "my buffer", 10 );
Buf yourBuf( "your buffer", 12 );
// Display 'my buffer'
myBuf.Display();
// assignment opperator
myBuf = yourBuf;
// Display 'your buffer'
myBuf.Display();
}