Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Tutorium Software-Engineering SS14 Florian Manghofer.

Ähnliche Präsentationen


Präsentation zum Thema: "Tutorium Software-Engineering SS14 Florian Manghofer."—  Präsentation transkript:

1 Tutorium Software-Engineering SS14 Florian Manghofer

2 Überladen von Operatoren (SS11 6) Gegben ist folgendes Programm. #include using namespace std; class Klausur { private: int i; string s; public: Klausur() {} Klausur(int ii) { i = ii; s = "";} Klausur(int ii, string ss) : i(ii), s(ss) {} void zeigDich() { cout << i << " " << s << endl;} friend Klausur operator+ (const Klausur &links, const Klausur &rechts); }; Klausur operator+(const Klausur &links, const Klausur &rechts) { Klausur tmp; tmp.i = links.i + rechts.i; tmp.s = links.s + rechts.s; return(tmp); } int main() { Klausur x(1, " Klausur "); Klausur y(9, " Zeit "); x = x + y; x.zeigDich(); y = y + x; x.zeigDich(); x = x + y; x.zeigDich(); system("PAUSE"); return(0); }

3 Überladen von Operatoren (SS11 6.1) 1.1 Was gibt das Programm auf dem Bildschirm aus? Skizzieren Sie die Bildschirmausgabe. int main() { Klausur x(1, " Klausur "); Klausur y(9, " Zeit "); x = x + y; x.zeigDich(); y = y + x; x.zeigDich(); x = x + y; x.zeigDich(); system("PAUSE"); return(0); } Ausgabe: 10 KlausurZeit 10 KlausurZeit 29 KlausurZeitZeitKlausurZeit x = i(1+9), s(Klausur + Zeit) Ausgabe x y = i(9+10), s(Zeit + KlausurZeit) Ausgabe x x = i(10+19), s(KlausurZeit + ZeitKlausurZeit) Ausgabe x

4 Überladen von Operatoren (SS11 6.2) 1.2 Kommentieren Sie Syntax und Semantik der im Programm fett markierten Zeilen und verwenden Sie dabei programmiersprachliche Fachbegriffe. Klausur operator+(const Klausur &links, const Klausur &rechts) Funktion die den Operator + für Objekte vom Typ Klausur überlädt. Sie gibt ein Objekt vom Typ Klausur zurück und erwartet 2 Parameter, jeweils Referenzen vom Typ Klausur { Klausur tmp; Lokales Klausur Objekt, entsteht aus den Werten der Parameter-Objekte tmp.i = links.i + rechts.i; Attribut i des lokalen Objektes ist Summe der beiden Attribute i der Parameter-Objekte tmp.s = links.s + rechts.s; Attribut s des lokalen Objektes ist Summe der beiden Attribute s der Parameter-Objekte return(tmp); Lokales Objekt, befüllt mit Werten, wird zurückgegeben und ist Ergebnis der + Operation }

5 Überladen von Operatoren (SS11 6.3) 1.3 Erweitern Sie das Programm um den ==-Operator als externe Funktion. In dieser Funktion sollen die Attribute i und s beider Objekte miteinander verglichen werden. Die Ausgabe „gleich“ oder „nicht gleich“ soll direkt in der Methode erfolgen. Des Weiteren rufen Sie diesen Operator für die Objekte x und y im Hauptprogramm (main) auf. bool operator== (Klausur a, Klausur b){ if(a.i == b.i && a.s == b.s){ cout << „gleich“ << endl; return true; }else{ cout << „ungleich“ << endl; return false; } Nicht vergessen, in Klasse Klausur diese Funktion als friend deklarieren! class Klausur { private: … public: … friend bool operator==(Klausur,Klausur); … (Rückgabetyp: void oder bool möglich)

6 Überladen von Operatoren (SS11 6.3) 1.3 Erweitern Sie das Programm um den ==-Operator als externe Funktion. In dieser Funktion sollen die Attribute i und s beider Objekte miteinander verglichen werden. Die Ausgabe „gleich“ oder „nicht gleich“ soll direkt in der Methode erfolgen. Des Weiteren rufen Sie diesen Operator für die Objekte x und y im Hauptprogramm (main) auf. int main() { Klausur x(1, " Klausur "); Klausur y(9, " Zeit "); x = x + y; x.zeigDich(); y = y + x; x.zeigDich(); x = x + y; x.zeigDich(); x == y; system("PAUSE"); return(0); }

7 Überladen von Operatoren (WS10/11 5) 2. Gegeben ist folgende Klassendefinition class Geld { private: int Euro; public: int getEuro () { return Euro; } friend ostream& operator<< (ostream&, const Geld&); friend istream& operator>> (istream&, Geld&); Geld operator += (Geld r); }; istream& operator >> (istream& is, Geld& r) { cout<<"Euro eingeben "<<endl; cin>>r.Euro; return is;} ostream& operator<<(ostream& stream, Geld const& obj) { stream<<obj.Euro<<endl; return stream;} Geld Geld::operator += ( Geld r) { Euro += r.Euro; return *this;} bool operator == (Geld, Geld);

8 Überladen von Operatoren (WS10/11 5.1) 2.1 Wozu dient bei der Überladung des <<-Operators das Schlüsselwort friend ? Sonst könnte bei der Implementierung der Funktion nicht auf das Attribut Euro eines Objektes direkt zugegriffen werden, da dies als private definiert ist. (stream<<obj.Euro<<endl;)

9 Überladen von Operatoren (WS10/11 5.2) 2.2 Kommentieren Sie die fett gedruckten Programmzeilen. Erklären Sie dabei das Schlüsselwort this und gehen Sie darauf ein, warum bei der Überladung des +=- Operators nur ein Operand in der Parameterliste enthalten ist, bei der Überladung des Vergleichsoperators jedoch zwei Operanden angegeben werden müssen. Geld operator += (Geld r); Definition der Methode bzw. Prototyp der Methode in der Klasse Geld. Sie überschreibt den Operator +=, liefert ein Geld Objekt als Rückgabewert und verlangt ein Geld Objekt als Parameter. Geld Geld::operator += ( Geld r) Überladen des Operator += definiert in der Klasse(gehört zur Klasse Geld) { Euro += r.Euro; dem Attribut Euro des aktuellen Objektes wird der Wert des Attributes Euro vom Parameterobjekt r hinzuaddiert. return *this; Es wird über den Referenzzeiger this auf das aktuelle Objekt dieses Zurückgegeben }

10 Überladen von Operatoren (WS10/11 5.2) 2.2 Kommentieren Sie die fett gedruckten Programmzeilen. Erklären Sie dabei das Schlüsselwort this und gehen Sie darauf ein, warum bei der Überladung des +=- Operators nur ein Operand in der Parameterliste enthalten ist, bei der Überladung des Vergleichsoperators jedoch zwei Operanden angegeben werden müssen. Das Schlüsselwort this ist der Referenzzeiger auf das aktuelle Objekt. D.h. er zeigt auf das Objekt, „indem man sich gerade befindet“. Hier in der Methode operator+= zeigt der this Zeiger auf das Objekt, auf welches Diese Methode aufgerufen wurde. Da die Überladung von += innerhalb der Klasse geschieht, ist das Objekt vom Typ dieser Klasse immer der „linke“ Operand(this). Der „rechte“ Operand ist dann der Parameter/das Parameter-Objekt. Bei der Überladung von == ist die Methode außerhalb der Klasse definiert und kann somit nicht auf this als „linken“ Operand zurückgreifen, sondern braucht die Operanden jeweils als Parameter.


Herunterladen ppt "Tutorium Software-Engineering SS14 Florian Manghofer."

Ähnliche Präsentationen


Google-Anzeigen