Condividi tramite


Puntatore this

Il puntatore this è un puntatore accessibile solo all'interno delle funzioni membro non statiche di un tipo class, struct o union. Viene puntato l'oggetto per il quale è chiamata la funzione membro. Le funzioni membro statiche non hanno puntatori this.

this 
this->member-identifier

Note

Il puntatore this di un oggetto non fa parte dell'oggetto stesso e non viene rilevato dal risultato di un'istruzione sizeof sull'oggetto. Al contrario, quando una funzione membro non statica viene chiamata per un oggetto, l'indirizzo dell'oggetto viene passato dal compilatore alla funzione come argomento nascosto. Ad esempio, la seguente chiamata di funzione:

myDate.setMonth( 3 );

può essere interpretata come segue:

setMonth( &myDate, 3 );

L'indirizzo dell'oggetto è disponibile dall'interno della funzione membro come il puntatore this. La maggior parte degli utilizzi di this è implicita. È possibile, ma non necessario, utilizzare this in modo esplicito, quando si fa riferimento ai membri della classe. Ad esempio:

void Date::setMonth( int mn )
{
   month = mn;            // These three statements
   this->month = mn;      // are equivalent
   (*this).month = mn;
}

L'espressione *this viene in genere utilizzata per restituire l'oggetto corrente da una funzione membro:

return *this;

Il puntatore this viene utilizzato anche per evitare autoriferimenti:

if (&Object != this) {
// do not execute in cases of self-reference

Nota

Poiché il puntatore this non è modificabile, le assegnazioni a this non sono consentite.Precedenti implementazioni di C++ consentivano le assegnazioni a this.

Talvolta il puntatore this viene utilizzato direttamente, ad esempio per modificare le strutture di dati autoreferenziali, in cui l'indirizzo dell'oggetto corrente è obbligatorio.

Esempio

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

Vedere anche

Riferimenti

Parole chiave C++

Tipo di puntatore this

Corrispondenza di argomenti e puntatore this