robert filatow logo
this in c++

this in C++, leicht erklärt

Einleitung

this is verwirrend, denn this sounds like es wäre ein englishword, but mit this ist nicht das englische das gemeint, sondern dabei handelt es sich um ein Konzept aus der Objekt-Orientierten-Programmierung.

Keine Sorge du kriegst nicht wirklich einen Schlaganfall. Was mit this gemeint ist, erkläre ich dir im folgenden:

Voraussetzung

Du solltest wissen

  • was Klassen und Objekte sind.
  • was Pointer sind, dereferenzieren bedeutet und der Adressoperator macht.
  • was Konstruktoren und Destruktoren sind.
  • was cout und endl sind.
  • was const, bzw. Konstanten in C++ sind.
  • was die Begriffe: Attribut, Member, Methoden, Parameter und Argumente, bedeuten.

Solltest du diese Konzepte nicht kennen, würden wir empfehlen, dass du zunächst die Lücken schließt.


this

this is ein Konzept aus der Objekt-Orientierten-Programmierung, welches dem Entwickler ermöglicht auf das Objekt zuzugreifen, indem du dich gerade befindest. Dabei handelt es sich bei this um einen Zeiger.

Der  this Zeiger ist ein Zeiger, auf den nur innerhalb der nicht statischen Member-Funktionen eines- class ,-oder-Typs zugegriffen werden kann . Er zeigt auf das Objekt, für das die Memberfunktion aufgerufen wird. Statische Member-Funktionen verfügen nicht über einen- this Zeiger.

https://docs.microsoft.com/de-de/cpp/cpp/this-pointer?view=msvc-160

Member-Funktion:
Eine Member-Funktion ist eine Funktion die zu einer Klasse gehört. Eine freie Funktion hingegen, gehört nicht zu einer Klasse. Man nennt, Member-Funktionen auch Methoden oder Elementfunktionen.

Was ist this?

this

Mit Hilfe von this, erhalten wir die Adresse des Objekts in dem wir uns befinden.

this ist ein Zeiger

Zeiger Exkurs:
Ein Zeiger ist eine Variable, in der eine Speicheradresse gespeichert wird.
Er heißt deswegen Zeiger, weil er sozusagen auf die eine Speicherzelle zeigt.

#include <iostream>
using namespace std;

  class Auto{
    public:
        void printAutoAdresse(){
           cout << this << endl;
        }
    };

int main()
{
    Auto bmw; //erzeugen des Objekts "bmw"
    cout << &bmw << endl; //Konsole gibt aus: 0x61fe1f
    bmw.printAutoAdresse(); //Konsole gibt aus: 0x61fe1f

    return 0;
}

Auf der Konsole wird zwei mal die Adresse 0x61fe1f ausgegeben.

0x61fe1f
0x61fe1f
Process returned 0 (0x0) execution time : 0.025 s
Press any key to continue.

Woran liegt das? Bei 0x61fe1f handelt es sich um die Adresse des Objekts bmw im Speicher.
Mit dem Adressoperator & bei &bmw, erhalten wir die Adresse vom Objekt und geben es mit cout auf der Konsole aus.

In der Member-Funktion printAutoAdresse geben wir this auf der Konsole aus.

  void printAutoAdresse(){
           cout << this << endl;
        }

Auch hier erhalten wir wieder die Adresse, da this ein konstanter Zeiger auf das Objekt ist, indem wir uns befinden.
this zeigt nicht auf die Klasse, sondern das konkrete Objekt. Deswegen müssen wir das Objekt auch zunächst erzeugen.

Die Deklaration des this-Zeigers kannst du dir so vorstellen:

Klassenname* const this = &Objekt;

Was ist ein konstanter Zeiger?

Wie mehrmals erwähnt handelt es sich bei this um einen konstanten Zeiger. Das bedeutet, das seine Position nicht mittels Zeigerarithmetik verändert werden kann. Er zeigt also immer auf die Adresse des Objekts. Stell dir einfach vor, der Zeiger wäre eingefroren.

Warum funktioniert this?

Immer wenn eine Elementfunktion aufgerufen wird, dann wird dieser ein unsichtbares Argument mit der Adresse der jeweiligen Instanz übergeben. Wir können auf diese Adresse mit this zugreifen.

Wann braucht man this?

In der Regel braucht man this nicht. Denn wenn wir eine Member-Funktion von einem Objekt abrufen, dann geht der Compiler davon aus, das es sich um das Objekt handelt, von dem die Member-Funktion abgerufen wird.

Hier ein Beispiel:

#include <iostream>
using namespace std;

  class Auto{
    public:
        int tueren = 4;
        void printAuto();
    };

    void Auto::printAuto(){
        //ob wir einfach direkt das Attribut abrufen wie in folgender Zeile:
            cout << "Anzahl der Tueren: " << tueren << endl;
        //oder ob wir this verwenden wie hier:
            cout << "Anzahl der Tueren: " << this->tueren << endl;
        //macht keinen Unterschied
}

int main()
{
    Auto bmw;
    bmw.printAuto();

    return 0;
}

Anzahl der Tueren: 4
Anzahl der Tueren: 4

In diesem Beispiel sehen wir, dass es keinen Unterschied macht, ob wir tueren, oder this->tueren schreiben. Jedoch sagen wir dem Compiler mit this->tueren das es sich auch tatsächlich um diese Instanz handel. Also um dieses Objekt!

Eine wichtige Aufgabe eines Entwickler ist es lesbaren Code zu schreiben. Daher verwendet man im besten Fall immer lesbare Variablen, die durch ihren Namen eindeutig ausdrücken wofür sie gedacht sind. Jetzt ist es aber so, dass wir manchmal den gleichen Namen gerne mehrmals einsetzen möchten. Zum Beispiel wenn wir ein Attribut namens tueren haben und dann diesem den Parameter – der sinnvollerweise ebenfalls tueren heißt – zuweisen wollen. Hier ein Beispiel:


  class Auto{
    public:
      int tueren; //unser Attribut
      Auto(int tueren){ //Konstruktor, mit dem Parameter: tueren
        tueren = tueren;
      }
    };

In dieser Situation haben wir einmal einen Parameter und ein Attribut mit dem gleichen Namen. Eine mögliche Lösung wäre es, die Variablen namentlich zu unterscheiden. So könnten wir den Parameter auch t nennen, oder tueren_ , oder xXtuerenXx, oder xXDragonslayer_tuerenXx, du merkst worauf ich hinaus will. Wir würden dadurch den Code verunstalten.

Möchten wir dem Compiler klar machen, dass wir dem Attribut das Argument zuweisen möchten, dann müssten wir ihm eindeutig sagen, dass das Erste tueren, ein Attribut von diesem Objekt ist:


  class Auto{
    public:
      int tueren; //unser Attribut
      Auto(int tueren){//Konstruktor, mit dem Parameter: tueren
        this->tueren = tueren;
      }
    };

Jetzt kann der Compiler eindeutig zwischen dem Attribut und der lokalen Variable(dem Parameter) unterscheiden.

In diesem Artikel auf Stackoverflow kannst du weitere Infos darüber lesen wann man this benötigt: https://stackoverflow.com/questions/993352/when-should-i-make-explicit-use-of-the-this-pointer

Zusammenfassung

Gott wie sehr ich mir wünsche, dass man this stattdessen self genannt hätte.

Hat dir der Inhalt gefallen?

Falls du mehr zu Themen der Informatik lesen willst, kannst du die Suche dafür verwenden:


Du bist der Meinung, das war der Beste Beitrag zum Thema Informatik den du jemals gelesen hast? Dann ist die einzig logische Schlussfolgerung, diesen Beitrag mit deinen Kommilitonen zu teilen. Oder auch nicht mach was du willst, ich bin nicht dein Dad.

TAGS

© 2023. All rights reserved. Website made by Robert Filatow