Compartilhar via


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 sizeof declaração sobre o 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 this ponteiro é 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 this tipo do ponteiro muda dependendo se a declaração de função inclui as const palavras-chave e/ou volatile . A sintaxe a seguir descreve o tipo de em uma função de this membro:

[cv-qualifier-list] class-type* const this

O declarador da função de membro determina cv-qualifier-list. Pode ser const ou volatile (ou ambos). class-type é o nome do class.

O this ponteiro não pode ser reatribuído. Os const qualificadores ou volatile usados na declaração de função de membro se aplicam à class instância em que 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.

Funções de membro declaradas como const não podem alterar dados de membro. Em const funções, o this ponteiro é 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.

Confira também

Palavras-chave