this — wskaźnik
Wskaźnik this jest wskaźnikiem dostępnym tylko w obrębie niestatycznych funkcji członkowskich typu class, struct lub union.Wskazuje na obiekt, dla którego wywoływana jest funkcja członkowska.Statyczne funkcje członkowskie nie posiadają wskaźnika this.
this
this->member-identifier
Uwagi
Wskaźnik obiektu this nie jest częścią samego obiektu; nie jest to odzwierciedlone w wyniku instrukcji sizeof na obiekcie.Zamiast tego, gdy na obiekcie zostanie wywołana niestatyczna funkcja członkowska, adres obiektu jest przekazywany przez kompilator jako ukryty argument do funkcji.Na przykład, następujące wywołanie funkcji:
myDate.setMonth( 3 );
może zostać zinterpretowane w ten sposób:
setMonth( &myDate, 3 );
Adres obiektu jest dostępny z poziomu funkcji członkowskiej jako wskaźnik this.Większość zastosowań this to zastosowania niejawne.Dozwolone jest, chociaż niepotrzebne, jawne użycie this przy odwoływaniu się do elementów członkowskich klasy.Na przykład:
void Date::setMonth( int mn )
{
month = mn; // These three statements
this->month = mn; // are equivalent
(*this).month = mn;
}
Wyrażenie *this jest powszechnie używane do zwracania bieżącego obiektu z funkcji członkowskiej:
return *this;
Wskaźnik this jest także używany do ochrony przed odwołaniem do siebie:
if (&Object != this) {
// do not execute in cases of self-reference
[!UWAGA]
Ponieważ wskaźnik this jest niemodyfikowalny, przypisania do this nie są dozwolone.Wczesne implementacje C++ pozwalały na przypisywanie do this.
Od czasu do czasu, wskaźnik this jest używany bezpośrednio — na przykład, do manipulowania strukturami danych odwołujących się do siebie, gdzie wymagany jest adres bieżącego obiektu.
Przykład
// 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();
}