O ponteiro this
O ponteiro this
é um ponteiro acessível apenas dentro das funções de membro não estático 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ático não têm um ponteiro this
.
Sintaxe
this
this->member-identifier
Comentários
O ponteiro this
de um objeto não faz parte do próprio objeto. Não faz parte do resultado de uma instrução sizeof
no objeto. Quando uma função membro não estática é chamada para um objeto, o compilador passa o endereço do objeto para a função como um argumento oculto. Por exemplo, a chamada de função a seguir:
myDate.setMonth( 3 );
pode ser interpretada como:
setMonth( &myDate, 3 );
O endereço do objeto está disponível na função membro como o ponteiro this
. A maioria dos usos de ponteiro this
são implícitos. É legal, embora desnecessário, usar um this
explícito ao se referir a membros de class. 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 proteção contra autorreferência:
if (&Object != this) {
// do not execute in cases of self-reference
Observação
Como o ponteiro this
não é modificável, as atribuições ao ponteiro this
não são permitidas. As implementações anteriores de C++ permitiam a atribuição a this
.
Ocasionalmente, o ponteiro this
é usado diretamente—por exemplo, para manipular dados structautorreferenciais, 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 operator
myBuf = yourBuf;
// Display 'your buffer'
myBuf.Display();
}
my buffer
your buffer
Tipo do ponteiro this
O tipo do ponteiro this
muda dependendo se a declaração da função inclui as palavras-chave const
e/ou volatile
. A sintaxe a seguir descreve o tipo de this
em uma função membro:
[cv-qualifier-list
] class-type
* const this
O declarador da função membro determina cv-qualifier-list
. Pode ser const
ou volatile
(ou ambos). class-type
é o nome do class.
O ponteiro this
não pode ser reatribuído. Os qualificadores const
ou volatile
usados na declaração da função membro se aplicam à class instância para a qual o this
ponteiro aponta, no escopo dessa função, conforme mostrado na tabela a seguir:
Declaração de função de membro | tipo de this ponteiro para um class nomeado myClass |
---|---|
void Func() |
myClass * |
void Func() const |
const myClass * |
void Func() volatile |
volatile myClass * |
void Func() const volatile |
const volatile myClass * |
A tabela a seguir explica mais sobre const
e `volatile``.
Semântica de modificadores this
Modificador | Significado |
---|---|
const |
Não é possível alterar os dados dos membros; não é possível invocar funções de membro que não sejam const . |
volatile |
Os dados dos membros são carregados da memória cada vez que são acessados; desativa certas otimizações. |
É um erro passar um objeto const
para uma função membro que não seja const
.
Da mesma forma, também é um erro passar um objeto volatile
para uma função membro que não seja volatile
.
As funções-membro declaradas como const
não podem alterar os dados dos membros. Nas funções const
, o ponteiro this
é um ponteiro para um const
objeto.
Observação
Constructores e destructores não podem ser declarados como const
ou volatile
. Eles podem, no entanto, ser invocados em objetos const
ou volatile
.