Der this
Zeiger
Der this
Zeiger ist ein Zeiger, auf den nur innerhalb der nicht statischen Memberfunktionen eines class
Oder union
struct
Typs 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 volatile
vorhanden 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
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Tickets als Feedbackmechanismus für Inhalte auslaufen lassen und es durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unter:Feedback senden und anzeigen für