this-Zeiger
Der this-Zeiger ist ein Zeiger, auf den nur in nicht statischen Memberfunktionen des Typs class, struct oder union zugegriffen werden kann. Er zeigt auf das Objekt, für das die Memberfunktion aufgerufen wird. Statische Memberfunktionen haben keinen this-Zeiger.
this
this->member-identifier
Hinweise
Der this-Zeiger eines Objekts ist nicht Teil des Objekts selbst. Er wird nicht im Ergebnis einer sizeof-Anweisung für das Objekt wiedergegeben. Wenn stattdessen eine nicht statische Memberfunktion für ein Objekt aufgerufen wird, wird die Adresse des Objekts vom Compiler als ausgeblendetes Argument an die Funktion übergeben. Folgender Funktionsaufruf kann beispielsweise:
myDate.setMonth( 3 );
auf diese Weise interpretiert werden:
setMonth( &myDate, 3 );
Die Adresse des Objekts ist von innerhalb der Memberfunktion als this-Zeiger verfügbar. Die meisten Verwendungen von this sind implizit. Es ist zulässig, wenn auch unnötig, this explizit für den Verweis auf Member der Klasse zu verwenden. Beispiel:
void Date::setMonth( int mn )
{
month = mn; // These three statements
this->month = mn; // are equivalent
(*this).month = mn;
}
Der Ausdruck *this wird häufig verwendet, um das aktuelle Objekt aus einer Memberfunktion zurückzugeben:
return *this;
Der this-Zeiger wird auch verwendet, um vor Selbstverweisen zu schützen:
if (&Object != this) {
// do not execute in cases of self-reference
Hinweis
Da der this-Zeiger nicht veränderbar ist, sind Zuweisungen zu this nicht zulässig.Frühere Implementierungen von C++ lassen Zuweisungen zu this zu.
Gelegentlich wird der this-Zeiger direkt verwendet, beispielsweise um auf sich selbst verweisende Datenstrukturen zu bearbeiten, für welche die Adresse des aktuellen Objekts erforderlich ist.
Beispiel
// 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();
}