Partilhar via


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();
}
  

Consulte também

Referência

Palavras-chave C++

Tipo deste ponteiro

Correspondência de argumento e este ponteiro