Der this-Zeiger ist ein 'versteckter' Parameter, der an jede nicht-statische Memberfunktion übergeben wird. Er zeigt auf das Objekt, in dessen Kontext die Memberfunktion aufgerufen wurde.
Der Zugriff auf den this-Zeiger erfolgt über das Schlüsselwort this.
Dieser zunächst etwas abstrakte Sachverhalt lässt sich am besten an einem Beispiel demonstrieren. Angenommen es gibt eine Memberfunktion Copy(), die die Eigenschaften eines übergebenen Objekts vom gleichen Typ übernimmt. Um unnötige Kopierarbeit zu sparen, soll ein Kopieren auf sich selbst unterbunden werden. Damit könnte eine Copy() Memberfunktion wie folgt aussehen:
#include <iostream>
#include <format>
class Any
{
int value; // beliebige Eigenschaft
public:
// ctor
Any(int val): value(val)
{}
// Uebernahme der Eigenschaften des uebergebenen Objekts obj
void Copy(const Any& obj)
{
std::cout << std::format("Kopiere Objekt {} auf {}: ",
reinterpret_cast<const void*>(&obj),
reinterpret_cast<void*>(this));
// Wenn aktuelles Objekt und zu kopierendes
// Objekt identisch sind ist keine Kopiervorgang notwendig
if (&obj == this)
{
std::cout << "Kein Kopieren notwendig!\n";
}
// Objekte sind unterschiedlich, dann Eigenschaften kopieren
else
{
value = obj.value;
std::cout << "Eigenschaften kopiert!\n";
}
}
// Liefert Inhalt der Eigenschaft zurueck
int GetValue() const
{
return value;
}
};
// main()
int main()
{
// Zwei Objekte definieren
Any obj1{1},obj2{2};
// Adressen und Eigenschaften der Objekte ausgeben
std::cout << std::format("Objekt auf der Adresse {} hat die Eigenschaft {}\n",
reinterpret_cast<void*>(&obj1),obj1.GetValue());
std::cout << std::format("Objekt auf der Adresse {} hat die Eigenschaft {}\n",
reinterpret_cast<void*>(&obj2),obj2.GetValue());
// Objekt kopieren
obj1.Copy(obj1); // obj1 auf obj1 kopieren?!
obj1.Copy(obj2); // obj2 auf obj1 kopieren
// obj1 nochmals ausgeben
std::cout << std::format("Objekt auf der Adresse {} hat die Eigenschaft {}\n",
reinterpret_cast<void*>(&obj1),obj1.GetValue());
}