C++ - Code verstehen

mihe7

Top Contributor
In 19 wird der <-Operator überladen. Dabei handelt es sich um eine Operation, die nichts an this verändert (das const am Ende der Zeile). Der Operator erwartet eine Referenz auf ein Person-Objekt, das ebenfalls nicht verändert wird.

In 20 wird nun das Alter von this mit dem Alter von rhs verglichen und das Ergebnis (ein Wahrheitswert) zurückgegeben.

Die Zeilen 24 - 26 überladen den <<-Operator für die Ausgabe in einen Ausgabestrom (ostream). Der ist nicht Teil der Klasse (bzw. des Structs), so dass er zwei Parameter erhält. Den ostream, in den geschrieben werden soll und die Person, die geschrieben werden soll. In 25 erfolgt das Schreiben und in 26 wird der übergebene osream zurückgegeben, damit Verkettungen weiter möglich sind: os << p << p << p;
 

Devanther

Top Contributor
Danke erstmal!
Warum müssen wir hier den operator< bzw den operator<< überladen?
Was bedeutet this->age?
This ist doch ein Pointer?

Zeile 25 und 26:
Den Namen der Person speichern wir in os und geben den anschließend mit return wieder?
Man muss das von rechts nach links lesen?
 

mihe7

Top Contributor
Warum müssen wir hier den operator< bzw den operator<< überladen?
Müssen tut man gar nix - es ist nur einfach praktisch.

Nimm mal an, Du hast zwei Person-Instanzen p1 und p2. Statt jedesmal "p1.age < p2.age" zu schreiben, kannst Du jetzt einfach p1 < p2 schreiben.

Bei der Ausgabe ist es genauso. Statt os << p1.name << p1.age schreiben zu müssen, um eine Person auszugeben, kannst Du den <<-Operator überladen und brauchst nur noch os << p1 zu schreiben.
 

Devanther

Top Contributor
OK, danke.

Was bedeutet aber this->age?

In diesem Beispiel ist a eine Person und es gibt keinen overloaded insertion operator für Person.
Deswegen geht das nicht.
Also, deswegen musste man selbst den overloaded insertion operator schreiben!
 
Zuletzt bearbeitet:

mihe7

Top Contributor
this ist hier der Pointer auf das Objekt auf der linken Seite des Operators. Schreibst Du p1 < p2, dann zeigt this auf p1.
 

mihe7

Top Contributor
Stell Dir einfach eine Methode
C++:
struct Person {
    // ...
    bool youngerThan(const Person &otherPerson) const {
        int myAge = this->age;
        int otherPersonsAge = otherPerson.age;
        return myAge < otherPersonsAge;
    }
}
vor. Wenn Du die Methode auf einem Objekt aufrufst, ist this der Zeiger auf dieses Objekt, z. B.
C++:
Person myself, you;

myself.youngerThan(you);
wird youngerThan auf dem Objekt myself aufgerufen, damit zeigt in der Methode youngerThan das this auf das Objekt myself. otherPerson ist dagegen eine Referenz für das Objekt you.

EDIT: Das this hat eine analoge Bedeutung in Java.
 

sascha-sphw

Top Contributor
Mit dieser Struktur
C++:
struct Person {
    std::string name;
    int age;
    
    bool operator<(const Person &rhs)const {
        return this->age < rhs->age;
    }
};

kannst Du Dir eine Instanz von Person erstellen, soweit verstehst Du das, oder?
C++:
Person einePerson;

Jetzt hat Person 2 Member variablen, einmal name und einmal age, auf die Du wie folgt zugreifen kannst. Soweit auch noch klar?
C++:
einePerson.name;
einePerson.age;

Mit dem überladen des operators < kannst Du wie @mihe7 Dir schon erklärt hat einfach angenehmer vergleichen.
Aus:
C++:
if(einePerson.age < eineAnderePerson.age){
    // mach was
}
wird einfach
C++:
if(einePerson < eineAnderePerson) {
    // mach was
}

Und das this ist in meinem Beispiel einfach einePerson. This innerhalb eines Objects referenziert immer die Instanz selbst.

Wie z.B. das Wort ich. Ich ist immer relativ zu dem der es sagt. Von Außen bin ich Sascha eine Instanz von Mensch von innen bin ich einfach ich. Weiß nicht ob Dir das besser hilft.
 

Devanther

Top Contributor
Also, this->age ist ein Personen Objekt und rhs.age ist auch ein Personen Objekt?

Wir vergleichen das Alter 2er Personen Objekte?

Vor allem:
This-> ist ein Pointer zu einem Person Objekt?
Deswegen habe ich mich so schwer getan.

Sind meine Gedanken richtig?
 

mihe7

Top Contributor
Also, this->age ist ein Personen Objekt und rhs.age ist auch ein Personen Objekt?
Nein, this ist ein Zeiger auf ein Person-Objekt und rhs ist eine Referenz für ein Person-Objekt. Das Person-Objekt hat ein Attribut age. Damit ist rhs.age der Wert des Attributs age des Objekts, das mit rhs referenziert wird und this->age der Wert des Attributs age des Objekts auf das this zeigt.
This-> ist ein Pointer zu einem Person Objekt?
this ist ein Pointer (Person *). Mit -> wird der Pointer dereferenziert.
 

Devanther

Top Contributor
Ja, so meine ich das, dass this-> ein Zeiger auf ein Person-Objekt ist.
Mit -> wird der Pointer dereferenziert, wir holen uns das, auf dass der Zeiger zeigt,
indem Fall age.

Man muss auch unterscheiden zwischen dem Pointer selbst und dem wohin der Pointer zeigt.
 
Zuletzt bearbeitet:

mihe7

Top Contributor
Mit -> wird der Pointer dereferenziert, wir holen uns das, auf dass der Zeiger zeigt,
indem Fall age.
Fast :) Der Zeiger zeigt nicht auf age sondern auf ein Person-Objekt. Wir dereferenzieren also den Zeiger mit "->", um hier auf das Attribut age des Person-Objekts zuzugreifen.

Eine andere Form der Dereferenzierung wäre *this. Es würde also auch (*this).age statt this->age funktionieren.
 

Devanther

Top Contributor
Fast :) Der Zeiger zeigt nicht auf age sondern auf ein Person-Objekt. Wir dereferenzieren also den Zeiger mit "->", um hier auf das Attribut age des Person-Objekts zuzugreifen.

So, hab ich es gemeint^^

Vielen Dank für die Hilfe.
Paar Zeilen Code die schwer zu verstehen waren...
 

mihe7

Top Contributor
Normalerweise bin ich ja ein Freund salopper Formulierungen aber gerade wenn man eine neue Sprache lernt, sollte man genau(er) hinschauen. C/C++ verzeiht nichts :)
 

Devanther

Top Contributor
Wie kommst es eigentlich, dass du dich so gut mit Java/C++ und vielleicht auch Python(ich weiss es nicht) auskennst^^?

Hast du Informatik studiert? Was machst du beruflich?
Du kannst mir auch per PN antworten.
 

Ähnliche Java Themen

Neue Themen


Oben