Wird geladen...

Der this-Zeiger in C++

Lernen Sie den this-Zeiger in C++ kennen, einschließlich Selbstreferenz von Objekten und Methodenverkettung.

In C++ erhält jede Klassenmethode (Mitgliedsfunktion) implizit einen Parameter namens this-Zeiger. Der this-Zeiger repräsentiert die Adresse des Objekts, für das die Methode aufgerufen wurde. Das bedeutet, innerhalb einer Klassenmethode kann man mit this auf das aktuelle Objekt zugreifen, das gerade verarbeitet wird.


1. Was ist der this-Zeiger?

Der this-Zeiger ist ein impliziter Zeiger, der automatisch an jede Klassenmethode übergeben wird. Jede nicht-statische Mitgliedsfunktion greift über diesen Zeiger auf die Adresse des Objekts zu, an dem sie arbeitet.


#include <iostream>
using namespace std;

class Book {
private:
    string title;

public:
    Book(string t) {
        this->title = t; // Verwendung von this
    }

    void Show() {
        cout << "Buch: " << this->title << endl;
    }
};

int main() {
    Book b("C++ Lernen");
    b.Show();
}

Hier greift this->title auf das title-Mitglied des aktuellen Objekts zu. title = t; würde dasselbe Ergebnis liefern, aber this ist besonders nützlich, wenn Parameter- und Mitgliedsvariablen denselben Namen haben.


2. Wenn Parameter- und Mitgliedsnamen identisch sind

Im folgenden Beispiel haben die Parameter des Konstruktors dieselben Namen wie die Klassenmitglieder. In diesem Fall muss this verwendet werden, um Mehrdeutigkeiten zu vermeiden.


class Book {
private:
    string title;
    double price;

public:
    Book(string title, double price) {
        this->title = title; // Ohne "this" würde die lokale Variable überschrieben
        this->price = price;
    }

    void Show() const {
        cout << "Buch: " << title << " | Preis: " << price << " EUR" << endl;
    }
};

int main() {
    Book b("Modernes C++", 120.5);
    b.Show();
}

Der Ausdruck this->title verweist auf das title-Mitglied der Klasse. Ohne this könnte der Compiler die Variable nicht eindeutig zuordnen.


3. Speicheradresse des this-Zeigers

Jedes Objekt hat eine eigene this-Adresse, da jede Instanz an einer anderen Speicherstelle liegt.


#include <iostream>
using namespace std;

class Book {
private:
    string title;
public:
    Book(string t) : title(t) {}

    void PrintAddress() const {
        cout << "Objektadresse (this): " << this << endl;
    }
};

int main() {
    Book b1("C++ Primer");
    Book b2("Effektives C++");

    b1.PrintAddress();
    b2.PrintAddress();
}

Die Ausgabe wird für jedes Objekt unterschiedlich sein, da this die individuelle Adresse jedes Objekts enthält.


4. Method Chaining (Verkettete Methodenaufrufe)

Der this-Zeiger kann von Methoden zurückgegeben werden, um verkettete Aufrufe zu ermöglichen. Dadurch können mehrere Methoden in einer einzigen Anweisung aufgerufen werden.


#include <iostream>
#include <string>
using namespace std;

class Book {
private:
    string title;
    double price;
    int pageCount;

public:
    Book() : title(""), price(0), pageCount(0) {}

    Book* SetTitle(string t) {
        this->title = t;
        return this; // Gibt die eigene Adresse zurück
    }

    Book* SetPrice(double p) {
        this->price = p;
        return this;
    }

    Book* SetPageCount(int c) {
        this->pageCount = c;
        return this;
    }

    void Show() const {
        cout << title << " (" << pageCount << " Seiten) - " 
             << price << " EUR" << endl;
    }
};

int main() {
    Book b;
    b.SetTitle("Objektorientierte Programmierung mit C++")
     ->SetPrice(149.90)
     ->SetPageCount(580)
     ->Show();
}

Diese Technik wird als Method Chaining bezeichnet und wird häufig in Builder- oder Fluent Interface-Entwurfsmustern verwendet.


5. Operatorüberladung mit this

Der this-Zeiger wird auch häufig bei der Operatorüberladung verwendet. Zum Beispiel, um zwei Book-Objekte anhand ihres Preises zu kombinieren:


#include <iostream>
#include <string>
using namespace std;

class Book {
private:
    string title;
    double price;

public:
    Book(string t, double p) : title(t), price(p) {}

    // Operatorüberladung (+)
    Book operator+(const Book &other) const {
        double totalPrice = this->price + other.price;
        return Book("Paket: " + this->title + " & " + other.title, totalPrice);
    }

    void Show() const {
        cout << title << " - " << price << " EUR" << endl;
    }
};

int main() {
    Book b1("C++ Primer", 180.0);
    Book b2("Effektives Modernes C++", 220.0);

    Book combo = b1 + b2;
    combo.Show();
}

Hier steht this->price für den Preis des linken Operanden. Dies ist nützlich, wenn mehrere Objekte kombiniert oder verglichen werden müssen.


6. Verwendung von this im Konstruktor

Innerhalb eines Konstruktors kann this verwendet werden, um auf die Adresse des Objekts zuzugreifen, bevor seine Initialisierung abgeschlossen ist. Es wird häufig für Logging- oder Debug-Zwecke verwendet.


class Book {
public:
    Book() {
        cout << "Ein neues Book-Objekt wird erstellt... Adresse: " << this << endl;
    }
};

Dies ist besonders nützlich in komplexen Objektstrukturen (z. B. Book → Author → Publisher), um den Lebenszyklus eines Objekts während der Laufzeit zu verfolgen.


7. this kann in statischen Funktionen nicht verwendet werden

Statische Funktionen gehören zur Klasse selbst, nicht zu einer bestimmten Instanz. Daher existiert der this-Zeiger in statischen Funktionen nicht.


class Book {
public:
    static void Info() {
        // cout << this; // FEHLER! In statischen Methoden ist this nicht erlaubt
        cout << "Dies ist eine statische Funktion." << endl;
    }
};

8. TL;DR

  • Der this-Zeiger repräsentiert die Adresse des aktuellen Objekts.
  • this->member → wird verwendet, um auf die Daten des Objekts zuzugreifen.
  • Wenn Parameter- und Mitgliedsnamen identisch sind, ist this erforderlich.
  • return this; → ermöglicht verkettete Methodenaufrufe (Method Chaining).
  • this kann auch in Operatorüberladungen verwendet werden.
  • In statischen Funktionen ist this nicht verfügbar.
  • Alle Beispiele können in Visual Studio 2022 oder GCC 11+ ausgeführt werden.

Ähnliche Artikel