Der this Zeiger

Der this Zeiger ist ein Zeiger, auf den nur innerhalb der nicht statischen Memberfunktionen eines classOder unionstructTyps zugegriffen werden kann. Er zeigt auf das Objekt, für das die Memberfunktion aufgerufen wird. Statische Memberfunktionen verfügen nicht über einen this Zeiger.

Syntax

this
this->member-identifier

Hinweise

Der Zeiger eines this Objekts ist nicht Teil des Objekts selbst. Es ist nicht Teil des Ergebnisses einer sizeof Anweisung für das Objekt. Wenn eine nicht statische Memberfunktion für ein Objekt aufgerufen wird, übergibt der Compiler die Adresse des Objekts als ausgeblendetes Argument an die Funktion. Folgender Funktionsaufruf kann beispielsweise:

myDate.setMonth( 3 );

kann interpretiert werden als:

setMonth( &myDate, 3 );

Die Adresse des Objekts steht innerhalb der Memberfunktion als this Zeiger zur Verfügung. Die meisten this Zeigerverwendungen sind implizit. Es ist zwar legal, aber unnötig, eine explizite this Verwendung zu verwenden, wenn sie auf Mitglieder der .class 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 sich vor Selbstverweis zu schützen:

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

Hinweis

Da der this Zeiger nicht modifizierbar ist, sind Zuordnungen this zum Zeiger nicht zulässig. Frühere Implementierungen von C++ erlaubten Zuordnungen.this

Gelegentlich wird der this Zeiger direkt verwendet, z. B. um selbstreferentielle Daten-Ures structzu bearbeiten, wobei 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 operator
    myBuf = yourBuf;

    // Display 'your buffer'
    myBuf.Display();
}
my buffer
your buffer

Typ des this Zeigers

Der this Zeigertyp ändert sich je nachdem, ob die Funktionsdeklaration die const und/oder volatile Schlüsselwort (keyword)s enthält. Die folgende Syntax beschreibt den Typ einer this Memberfunktion:

[cv-qualifier-list] class-type* const this

Der Deklarator der Memberfunktion bestimmt cv-qualifier-list. Es kann const sein oder volatile (oder beides). class-type ist der Name des class.

Der this Zeiger kann nicht neu zugewiesen werden. volatile Die const in der Memberfunktionsdeklaration verwendeten Qualifizierer gelten für die class Instanz der this Zeigerpunkte im Bereich dieser Funktion, wie in der folgenden Tabelle dargestellt:

Memberfunktionsdeklaration Typ des this Zeigers für einen benannten classmyClass
void Func() myClass *
void Func() const const myClass *
void Func() volatile volatile myClass *
void Func() const volatile const volatile myClass *

In der folgenden Tabelle werden weitere Informationen zu const und "" erläutertvolatile.

Semantik von this Modifizierern

Modifizierer Bedeutung
const Memberdaten können nicht geändert werden; Memberfunktionen können nicht aufgerufen werden, die nicht const.
volatile Memberdaten werden jedes Mal aus dem Arbeitsspeicher geladen, wenn auf sie zugegriffen wird; deaktiviert bestimmte Optimierungen.

Es ist ein Fehler, ein const Objekt an eine Memberfunktion zu übergeben, die nicht const.

Ebenso ist es auch ein Fehler, ein volatile Objekt an eine Memberfunktion zu übergeben, die nicht volatilevorhanden ist.

Memberfunktionen, die deklariert wurden, als const mitgliederdaten nicht ändern können. In const Funktionen ist der this Zeiger ein Zeiger auf ein const Objekt.

Hinweis

Constructors and destructors can't be declared as const or or volatile. Sie können jedoch für const oder volatile Objekte aufgerufen werden.

Siehe auch

Schlüsselwörter