this: Zeiger und Referenz
Jede nicht-statische Methode erhält als versteckten Parameter einen Zeiger auf das Objekt, in dessen Kontext sie aufgerufen wurde. Dieser Zeiger wird this-Zeiger genannt. Er ist immer vom Typ 'Zeiger auf eigene Klasse'.
Sehen wir uns einmal das nachfolgende Beispiel an, das eine Klasse mit einer Methode PrintThis() definiert.
#include <print>
// Klassendefinition
class CAny
{
int number; // Objektnummer
public:
// ctor
CAny(int _number): number(_number)
{ }
// Ausgabe this-Zeiger
void PrintThis();
};
// Defínition der Memberfunktion
void CAny::PrintThis()
{
// Inhalt des this-Zeigers ausgeben
std::println("Objekt {}: this = {}", number,
reinterpret_cast<void*>(this));
}
int main()
{
// 2 Objekte definieren
CAny obj1{1}, obj2{2};
// Adressen der Objekte ausgeben
std::println("Adr. obj1 = {}",
reinterpret_cast<void*>(&obj1));
std::println("Adr. obj2 = {}",
reinterpret_cast<void*>(&obj2));
// this-Zeiger der Objekte ausgeben
std::println("this-Zeiger ausgeben:");
obj1.PrintThis();
obj2.PrintThis();
}
Adr. obj1 = 0x35a87ff9c4
Adr. obj2 = 0x35a87ff9c0
this-Zeiger ausgeben:
Objekt 1: this = 0x35a87ff9c4
Objekt 2: this = 0x35a87ff9c0
In main() werden zwei Objekte definiert und anschließend deren Adressen ausgegeben.
Danach rufen beide Objekte die Methode PrintThis() auf, die den Inhalt des this-Zeigers ausgibt. Und da dieser Zeiger laut obiger Aussage auf das aufrufende Objekt verweist, werden dieselben Adressen wie in main() ausgegeben.
Ab C++23 kann this auch als erster Parameter einer Methode definiert werden. In diesem Fall ist this kein Zeiger sondern eine Referenz auf das aktuelle Objekt. Wird this auf diese Weise verwendet, ist bei allen Zugriffen innerhalb der Methode auf die eigenen Member die Referenz zu verwenden.
Die Methode PrintThis() im vorherigen Beispiel sieht dann wie folgt aus:
// Defínition der einzigen Memberfunktion
void CAny::PrintThis(this CAny& self)
{
// Inhalt des this-Zeigers ausgeben
std::println("Objekt {}: self = {}", self.number,
reinterpret_cast<void*>(&self));
}
Vielleicht fragen Sie sich, wofür this eingesetzt wird? Nun, this wird immer dann benötigt, wenn ein Zeiger oder eine Referenz auf das aktuelle Objekt innerhalb einer Methode benötigt wird, wie z.B. bei dem später beschriebenen Kopierkonstruktor.
Übungen
this_01:
Es ist eine Klasse mit einer beliebigen Eigenschaft, einem Konstruktor (zur Initialisierung der Eigenschaft) und einer Methode Copy() zu erstellen.
Die Methode Copy() erhält als Parameter ein Objekt seiner Klasse übergeben, dessen Eigenschaft zu übernehmen ist. Um unnötiges Kopieren zu vermeiden, soll ein kopieren auf sich selbst unterbunden werden, d.h., die Anweisung
obj1.Copy(obj1);
soll keinen Kopiervorgang durchführen. Geben Sie in Copy() eine Meldung aus, ob der Kopiervorgang durchgeführt wurde oder nicht.
Erstellen Sie in main() zwei Objekte vom Typ der Klasse. Kopieren Sie zuerst das zweite Objekt ins erste Objekt und anschließend das zweite Objekt auf sich selbst.
Wert kopiert
Kein kopieren notwendig