Namespaces
Variants

The this pointer

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

Inhaltsverzeichnis

Syntax

this

Der Ausdruck this ist ein prvalue Ausdruck , dessen Wert die Adresse des impliziten Objektparameters (Objekt, auf dem die implizite Objekt-Memberfunktion aufgerufen wird) ist. Er kann in den folgenden Kontexten auftreten:

2) Innerhalb der Deklaration jeder impliziten Objekt-Memberfunktion an beliebiger Stelle nach der (optionalen) CV-Qualifizierer-Sequenz, einschließlich der Ausnahmespezifikation und des nachgestellten Rückgabetyps (seit C++11) .
3) Innerhalb eines Default Member Initializers .
4) Innerhalb der Capture-Liste eines Lambda-Ausdrucks.
(seit C++11)

Erklärung

this kann sich nur mit der innersten umschließenden Klasse seines Auftretens assoziieren, selbst wenn das Auftreten im Kontext ungültig ist:

class Outer
{
    int a[sizeof(*this)];            // Fehler: nicht innerhalb einer Memberfunktion
    unsigned int sz = sizeof(*this); // OK: in Default-Member-Initializer
    void f()
    {
        int b[sizeof(*this)];     // OK
        struct Inner
        {
            int c[sizeof(*this)]; // Fehler: nicht innerhalb einer Memberfunktion von Inner
                                  // „this“ ist nicht mit Outer assoziiert
                                  // selbst wenn es sich in einer Memberfunktion von Outer befindet
        };
    }
};

Der Typ von this in einer Memberfunktion der Klasse X ist X* (Zeiger auf X). Wenn die Memberfunktion mit einer CV-Qualifizierer-Sequenz deklariert ist cv , ist der Typ von this cv X* (Zeiger auf identisch CV-qualifiziertes X). Da Konstruktoren und Destruktoren nicht mit CV-Qualifizierern deklariert werden können, ist der Typ von this in ihnen stets X* , selbst wenn ein konstantes Objekt konstruiert oder zerstört wird.

In Klassentemplates ist this ein abhängiger Ausdruck , und explizites this - > kann verwendet werden, um einen anderen Ausdruck zu einem abhängigen Ausdruck zu machen.

template<typename T>
struct B
{
    int var;
};
template<typename T>
struct D : B<T>
{
    D()
    {
        // var = 1;    // Fehler: "var" wurde in diesem Gültigkeitsbereich nicht deklariert
        this->var = 1; // OK
    }
};

Während der Konstruktion eines Objekts, wenn auf den Wert des Objekts oder eines seiner Teilobjekte über einen Glvalue zugegriffen wird, der nicht direkt oder indirekt vom this -Zeiger des Konstruktors erhalten wurde, ist der so erhaltene Wert des Objekts oder Teilobjekts unspezifiziert. Mit anderen Worten: Der this-Zeiger kann in einem Konstruktor nicht gealiast werden:

extern struct D d;
struct D
{
    D(int a) : a(a), b(d.a) {} // b(a) oder b(this->a) wäre korrekt
    int a, b;
};
D d = D(1); // da b(d.a) nicht a durch this bezogen hat, ist d.b jetzt nicht spezifiziert

Es ist möglich, delete this ; auszuführen, wenn das Programm garantieren kann, dass das Objekt durch new alloziert wurde. Allerdings macht dies jeden Zeiger auf das freigegebene Objekt ungültig, einschließlich des this -Zeigers selbst: Nachdem delete this ; zurückgekehrt ist, kann eine solche Memberfunktion nicht auf ein Klassenmitglied verweisen (da dies eine implizite Dereferenzierung von this beinhaltet) und keine andere Memberfunktion darf aufgerufen werden.

Dies kann in der Memberfunktion des referenzzählenden Zeigers (zum Beispiel, std::shared_ptr ) (since C++11) verwendet werden, die für das Dekrementieren des Referenzzählers verantwortlich ist, wenn die letzte Referenz auf das verwaltete Objekt den Gültigkeitsbereich verlässt.

class ref
{
    // ...
    void incRef() { ++mnRef; }
    void decRef() { if (--mnRef == 0) delete this; }
};
**Anmerkung:** Der C++-Code wurde gemäß den Anforderungen nicht übersetzt, da er sich innerhalb von `
`-Tags befindet und C++-spezifische Begriffe enthält. Der umgebende HTML-Code wurde ebenfalls unverändert beibehalten.

Schlüsselwörter

this

Beispiel

class T
{
    int x;
    void foo()
    {
        x = 6;       // dasselbe wie this->x = 6;
        this->x = 5; // explizite Verwendung von this->
    }
    void foo() const
    {
    //  x = 7; // Fehler: *this ist konstant
    }
    void foo(int x) // Parameter x verdeckt das Mitglied mit demselben Namen
    {
        this->x = x; // nicht qualifiziertes x bezieht sich auf den Parameter
                     // "this->" wird zur Unterscheidung benötigt
    }
    int y;
    T(int x) : x(x),      // verwendet Parameter x zur Initialisierung des Mitglieds x
               y(this->x) // verwendet Mitglied x zur Initialisierung des Mitglieds y
    {}
    T& operator=(const T& b)
    {
        x = b.x;
        return *this; // viele überladene Operatoren geben *this zurück
    }
};

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
CWG 760 C++98 wenn this in einer geschachtelten Klasse verwendet wurde, war
nicht spezifiziert, ob es mit der geschachtelten Klasse
oder der umschließenden Klasse assoziiert ist
this assoziiert immer mit
der innersten geschachtelten Klasse,
unabhängig davon, ob es sich in
einer nicht-statischen Memberfunktion befindet
CWG 2271 C++98 this konnte gealiast werden, wenn
ein nicht-konstantes Objekt konstruiert wurde
Aliasing ist in diesem Fall
ebenfalls verboten
CWG 2869 C++98 es war unklar, ob this in einer statischen Memberfunktion
einer nicht-assoziierten Klasse verwendet werden konnte
klargestellt