Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Puntatore
Il this puntatore è un puntatore accessibile solo all'interno delle funzioni membro non statiche di un classtipo , structo union . Viene puntato l'oggetto per il quale è chiamata la funzione membro. Le funzioni membro statiche non hanno un this puntatore.
Sintassi
this
this->member-identifier
Osservazioni:
Il puntatore di this un oggetto non fa parte dell'oggetto stesso. Non fa parte del risultato di un'istruzione sizeof sull'oggetto . Quando viene chiamata una funzione membro non statica per un oggetto, il compilatore passa l'indirizzo dell'oggetto alla funzione come argomento nascosto. Ad esempio, la seguente chiamata di funzione:
myDate.setMonth( 3 );
può essere interpretato come:
setMonth( &myDate, 3 );
L'indirizzo dell'oggetto è disponibile all'interno della funzione membro come this puntatore. La maggior parte degli this usi del puntatore è implicita. È legale, anche se non necessario, usare un oggetto esplicito this quando si fa riferimento ai membri di class. 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 this puntatore viene usato anche per proteggersi dal self-reference:
if (&Object != this) {
// do not execute in cases of self-reference
Nota
Poiché il this puntatore non è modificabile, le assegnazioni al this puntatore non sono consentite. Implementazioni precedenti di C++ consentite l'assegnazione a this.
In alcuni casi, il this puntatore viene usato direttamente, ad esempio per modificare strutture di dati auto-referenziale, in cui è necessario l'indirizzo dell'oggetto corrente.
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 operator
myBuf = yourBuf;
// Display 'your buffer'
myBuf.Display();
}
my buffer
your buffer
Tipo del puntatore this
Il this tipo del puntatore cambia a seconda che la dichiarazione di funzione includa le const parole chiave e/o volatile . La sintassi seguente descrive il tipo di this in una funzione membro:
[cv-qualifier-list] class-type* const this
Il dichiaratore della funzione membro determina cv-qualifier-list. Può essere const o volatile (o entrambi).
class-type è il nome dell'oggetto class.
Il this puntatore non può essere riassegnato. I const qualificatori o volatile usati nella dichiarazione di funzione membro si applicano all'istanza class a cui punta il this puntatore, nell'ambito di tale funzione, come illustrato nella tabella seguente:
| Dichiarazione di funzione membro | tipo di this puntatore per un class oggetto denominato myClass |
|---|---|
void Func() |
myClass * |
void Func() const |
const myClass * |
void Func() volatile |
volatile myClass * |
void Func() const volatile |
const volatile myClass * |
Nella tabella seguente vengono illustrate altre informazioni su const e volatile.
Semantica dei this modificatori
| Modificatore | significato |
|---|---|
const |
Non è possibile modificare i dati dei membri; non può richiamare funzioni membro che non constsono . |
volatile |
I dati dei membri vengono caricati dalla memoria ogni volta che si accede; disabilita alcune ottimizzazioni. |
Si tratta di un errore per passare un const oggetto a una funzione membro che non constè .
Analogamente, è anche un errore passare un volatile oggetto a una funzione membro che non volatileè .
Le funzioni membro dichiarate come const non possono modificare i dati dei membri. Nelle const funzioni il this puntatore è un puntatore a un const oggetto .
Nota
I costruttori e i distruttori non possono essere dichiarati come const o volatile. Tuttavia, possono essere richiamati su const oggetti o volatile .