C++ Tutorial

 this-Zeiger

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());
}