this – ukazatel
Ukazatel this je ukazatel přístupný pouze v rámci nestatické členské funkce třídy, struktury (struct) nebo sjednocení.Odkazuje na objekt, pro který je volána členská funkce.Statické členské funkce nemají ukazatel this.
this
this->member-identifier
Poznámky
Ukazatel this objektu není součástí objektu samotného, není zohledněn ve výsledku příkazu sizeof objektu.Namísto toho při volání nestatické členské funkce objektu, je adresa objektu kompilátorem předána funkci jako skrytý argument.Například, následující volání funkce:
myDate.setMonth( 3 );
lze interpretovat takto:
setMonth( &myDate, 3 );
Adresa objektu je v členské funkci k dispozici jako ukazatel this.Většina použití ukazatele this jsou implicitní.Je platné, i když ne nezbytné, explicitně zadat ukazatel this při odkazování na členy třídy.Příklad:
void Date::setMonth( int mn )
{
month = mn; // These three statements
this->month = mn; // are equivalent
(*this).month = mn;
}
Výraz *this se běžně používá k vrácení aktuální objektu z členské funkce:
return *this;
Ukazatel this slouží také pro ochranu proti odkazu na sebe sama:
if (&Object != this) {
// do not execute in cases of self-reference
[!POZNÁMKA]
Protože nelze ukazatel this modifikovat, přiřazení do ukazatele this nejsou povolena.Starší implementace jazyka C++ umožňovaly přiřazení do ukazatele this.
V některých případech se ukazatel this používá přímo, například k manipulaci s datovými strukturami odkazující na sebe sama, kde je vyžadována adresa aktuálního objektu.
Příklad
// 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();
}