Überblick. 7. Überladen von Operatoren

Ähnliche Dokumente
4. Objektorientierte Programmierung mit C++

Überblick. 6. Konstruktor und Destruktor - obligatorische Elementfunktionen einer Klasse

Überblick. 5. Objekt und Klasse, Elementfunktionen

4. Objektorientierte Programmierung mit C++

Überblick. R.Grossmann / P. Sobe 1

Überblick. Überblick. Abstrakte Klassen - rein virtuelle Funktionen Beispiele

4. Objektorientierte Programmierung mit C++

4. Objektorientierte Programmierung mit C++

Überblick. Überblick zum weiteren Inhalt

3. Exkurs in weitere Arten der Programmierung

4. Objektorientierte Programmierung mit C++

C++ - Objektorientierte Programmierung Polymorphie

4. Objektorientierte Programmierung mit C++

4. Objektorientierte Programmierung mit C++

Verwendung von Klassen in C++

Thema heute: Vererbung und Klassenhierarchien. Abgeleitete Klassen. Vererbung von Daten und Funktionen. Virtuelle Funktionen

Polymorphie. Überladen. Definition Methodennamen überladen Konstruktoren überladen Operatoren überladen Beispiele. Dr.

Vokabeln. 4.1 Benutzer definierte Datentypen. Kapitel 4. Prof. Dr. Gerhard Berendt C++ oop? SS 2002 Arbeitsblatt 4

Institut für Programmierung und Reaktive Systeme. Java 6. Markus Reschke

Thema heute: Vererbung und Klassenhierarchien. Abgeleitete Klassen. Vererbung von Daten und Funktionen. Virtuelle Funktionen

Einführung in C++ Operatoren überladen (Klassen)

Grundlagen der Informatik

Programmieren in C++ Überladen von Methoden und Operatoren

6 ZEIGER UND REFERENZEN - ALLGEMEINES

Teil 10: Operator Überladung. Prof. Dr. Herbert Fischer Fachhochschule Deggendorf Prof. Dr. Manfred Beham Fachhochschule Amberg-Weiden

10.4 Konstante Objekte

Überblick. Peter Sobe 1

Angewandte Mathematik in OOP WS 2011/12. Abschluss-Test

DAP2-Programmierpraktikum Einführung in C++ (Teil 2)

Überblick. 1. Einführung C++ / Entwicklung / Sprachfamilie

Überblick. Exkurs: Organisation des Quellcodes (1)

Institut für Programmierung und Reaktive Systeme. Java 7. Markus Reschke

C++ - Operatoren. Eigene Klassen mit neuen Funktionen

Einstieg in die Informatik mit Java

C++ - Objektorientierte Programmierung Konstruktoren und Destruktoren

Mapra: C++ Teil 6. Felix Gruber, Sven Groß. IGPM, RWTH Aachen. 13. Juni 2017

Info-2, Klausurvorbereitung, SS 2016

Konzepte der Programmiersprachen

HSR Rapperswil 2001 Markus Rigling. Programmieren: Smart Pointer Auflage

5. Behälter und Iteratoren. Programmieren in C++ Überblick. 5.1 Einleitung. Programmieren in C++ Überblick: 5. Behälter und Iteratoren

Übersicht. Bisherige Verwendung von Klassen Vererbung. Zeiger auf Objekte (abgeleiteter) Klassen Virtuelle Funktionen Konstruktoren/Destruktoren

Programmieren in C++ Überblick

Programmieren 2 C++ Überblick

Objektorientierte Anwendungsentwicklung

7 Funktionen. 7.1 Definition. Prototyp-Syntax: {Speicherklasse} {Typ} Name ({formale Parameter});

C++ - Objektorientierte Programmierung Konstante und statische Elemente

Rückblick: Benutzerdefinierte Datentypen Definition der Klasse Vektor als Container für 2-dimensionale Vektoren

Funktionen: Rückgabewert

Vorlesung Datenstrukturen

11 Vererbung und Klassenhierarchie

C++ Teil 9. Sven Groß. 17. Juni Sven Groß (IGPM, RWTH Aachen) C++ Teil Juni / 17

C++ Teil 10. Sven Groß. 17. Dez IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Dez / 14

OOP und Angewandte Mathematik. Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik

Programmierkurs C/C++

Java Methoden. Informatik 1 für Nebenfachstudierende Grundmodul. Kai-Steffen Hielscher Folienversion: 1. Februar 2017

Algorithmen und Datenstrukturen

Begriffe 1 (Wiederholung)

Klassen. Kapitel Klassendeklaration

Algorithmen und Datenstrukturen Sommersemester Übung Abgabe bis , 10:00 Uhr

Vorlesung Objektorientierte Programmierung Klausur

Grundlagen der Informatik Vererbung von Klassen

Kapitel 11: Vererbung Ziele von Klassen Einführung in die Informatik für struct Naturwissenschaftler und Ingenieure

Probeklausur Java Einführung in die Informatik. Wintersemester 2014/2015

Grundlagen Polymorphismus Eigenschaften virtueller Klassen Mehrfachvererbung bei ROOT. Mehrfache Vererbung. Daniel Beneckenstein. 21.

Objektorientierte Programmierung

Programmierkurs C/C++

Die abstrakte Klasse Expression:

Programmiertechnik Klassenvariablen & Instantiierung

Grundzüge der objektorientierten Programmierung

4. Objektorientierte Programmierung mit C++

12 Abstrakte Klassen, finale Klassen und Interfaces

MARKO MEYER IM KLARTEXT. ein Imprint von Pearson Education

Prinzipien der objektorientierten Programmierung (OOP)

Objektorientierte Programmierung mite**

Einführung in die Programmierung mit C++

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

OMSI / Teil 1 / C++ Andreas Blunk. 5. April 2006, Berlin

Klassen als Datenstrukturen

OOP. Kapselung: Gruppierung von Daten und Funktionen als Objekte. Definieren eine Schnittstelle zu diesen Objekten.

Prof. W. Henrich Seite 1

Vorkurs Informatik WiSe 15/16

3. Objektorientierung Ergänzungen

Objektorientierte Programmierung mit C++ SS 2007

Informatik I (D-MAVT)

Abend 4 Übung : Erweitern von Klassen durch Vererbung

Einstieg in die Informatik mit Java

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 12

7. Objektorientierung. Informatik II für Verkehrsingenieure

Einführung in die Programmierung mit C++

Einführung in die Programmierung I. 11. Vererbung. Stefan Zimmer

Einführung in das Objektorientierte Programmieren mit C++

Einstieg in die Informatik mit Java

3 VERERBUNG ALLGEMEINES

Programmierung Nachklausurtutorium

Grundkurs C++ IDE Klassenhierarchien

Objektorientiertes Programmieren

Grundkurs C++ IDE Klassenhierarchien

Vorlesung Datenstrukturen

Einstieg in die Informatik mit Java

Transkript:

Überblick 1. Einführung C++ / Entwicklung/ Sprachfamilie 2. Nicht objektorientierte Erweiterungen von C 2.1 Das Ein-/Ausgabekonzept von C++ 2.2 Referenzen in C++ 2.3 Heap-Allokatoren in C++ 3. Grundlagen des Typkonzepts von C++ 4. Ziele der Objektorientierung 5. Objekt und Klasse, Elementfunktionen (Methoden) 6. Konstruktoren, Copy-Konstruktor, Destruktor und Wertzuweisung 7. Operatoren, Überladen von Operatoren 8. Elementobjekte und Elementobjektkonstruktoren 9. Klassenhierarchien und Vererbung 10. Polymorphie 11. Abstrakte Klassen R.Grossmann / P. Sobe 1 7. Überladen von Operatoren Betrachten wir noch einmal die Methode add vektor add(vektor a) {return vektor(x+a.x,y+a.y,z+a.z);} und ihre Nutzung z.b. neu = n.add(a).add(b).add(d); Jetzt möchte man statt dieser etwas umständlichen Notation die übliche Schreibweise mit Infix-Operatoren benutzen: neu = n + a + b + d; Dies erreicht man mit dem Konzept des Überladens von Operatoren. Dazu braucht man die obige Definition nur geringfügig ändern: vektor operator +(vektor a) {return vektor(x+a.x,y+a.y,z+a.z);} R.Grossmann / P. Sobe 2

Überladen von Operatoren Demonstration einer Klasse mit klassischen Methoden und mit Operatoren zur Verdeutlichung des Unterschieds: vektor_4.cpp und vektor_5.cpp Probleme: 1. Man darf nur Operatoren überladen, die der Compiler bereits für Standardtypen kennt. Es können keinen neuen Symbole hinzugefügt werden. Beispiel Kreuzprodukt von Vektoren: Man hätte auf die Idee kommen können zu schreiben vektor operator #(vektor a){return...} Das geht nicht, da # kein Operator ist, wie auch, $ usw. Deshalb wurde im Beispielprogramm der Modulo-Operator % für das Kreuzprodukt verwendet. R.Grossmann / P. Sobe 3 Probleme (Fortsetzung): Überladen von Operatoren 2. Die Priorität des Operators bleibt laut Definition erhalten und kann nicht verändert werden. 3. Man darf folgende Operatoren nicht überladen:..* ::? : (.* bedeutet Zugriff auf ein Element als Zeiger und gleichzeitige Dereferenzierung, selten benutzt!) 4. Überladene binäre Operatoren als Elementfunktionen dürfen nur einen Parameter besitzen, eine Definition wie vektor add(float f,vektor a) {return vektor(f*a.x,f*a.y,f*a.z);} falsch! ist verboten. Solche Überladungen sind nur als Nicht- Elementfunktionen außerhalb der Klasse gestattet. R.Grossmann / P. Sobe 4

Überladen von Operatoren Beispiel: Überladung des <<-Operators in der Klasse ostream Die Ausgabenotation ist bekannt. int x; x=5; cout << x; Der Compiler weiß, was er tun muss. Wollen Sie aber schreiben: vektor x(-2,3,5); cout << x; dann weiß der Compiler nicht, wie er einen Vektor ausgeben soll! Dann muss der <<-Operator überschrieben werden. Dazu sind aber zwei Parameter nötig, da das cout-objekt vom Typ ostream ist, aber x vom Typ vektor. R.Grossmann / P. Sobe 5 Überladen von Operatoren Deshalb muss der <<-Operator als Nicht-Elementfunktion außerhalb der Klasse überladen werden, zum Beispiel: // Ausgabe eines Vektors in der Form ( x, y, z ) ostream& operator << (ostream& s, vektor v) { return s << ( <<v.i()<<, <<v.j()<<, <<v.k()<< ) ;} Beachten Sie dabei, dass Sie von außerhalb keinen direkten Zugriff auf die privaten Daten innerhalb vektor v haben, also auf x, y und z. Es müssen deshalb Methoden (hier i(), j() und k()) geschrieben werden, die Zugriff auf die Komponenten des vektor v zulassen. Siehe dazu Programmcode vektor_6.cpp. R.Grossmann / P. Sobe 6

Überladen von einstelligen Operatoren Einstellige Operatoren können als Präfix- oder als Postfix- Operatoren entworfen werden. Beispiel: Das Vorzeichen (-,+) einer komplexen Zahl als Präfix. Präfix-Operatoren werden parameterlos überladen complex operator -() { return complex(-real(),-imag() );} complex a(-3,9),x; x = - a ; Achtung: Im Beispiel wird der Wert der komplexen Zahl nicht geändert. Es gibt auch Prefix-Operatoren, die den Wert des Objekts ändern, z.b. -- zahl; für Integer-Werte. Dann unterscheidet sich ein Prefix-Operator von einem Postfix-Operator, z.b. zahl--; R.Grossmann / P. Sobe 7 Überladen von einstelligen Operatoren Beispiel: Der Inkrementierungsoperator ++ als Postfix-Operator. Postfix-Operatoren werden mit Parameter int überladen. int ist dabei nur ein Dummy-Parameter, um eine Unterscheidung zwischen Präfix-++ und Postfix-++ zu ermöglichen. Im Beispiel vektor soll der Postfix-++ Operator den alten Wert des vektor-objektes übergeben und danach zum alten Wert den Einheitsvektor addieren. vektor operator ++( int ) { vektor h=*this; ++x; ++y; ++z; return h; } Die Bedeutung von *this wird auf den nächsten Folien erklärt! R.Grossmann / P. Sobe 8

Zweistellige Operatoren: Übersicht (1) werden mit einem Parameter definiert, der den Typ des jeweiligen zweiten Operanden (hier obj2) angibt. Benutzung: erg = obj + obj2; Definition am Beispiel vektor: vektor operator +(vektor a) {return vektor(x+a.x,y+a.y,z+a.z);} Einstellige Operatoren: Prefix-Operatoren: ++x werden mit einer leeren Parameterliste definiert. Postfix-Operatoren: x++ werden mit einem Dummy- int in der Parameterliste definiert. R.Grossmann / P. Sobe 9 Übersicht (2) Einstellige Prefix-Operatoren: werden mit einer leeren Parameterliste definiert. Benutzung: erg = ++obj; Definition am Beispiel vektor: vektor operator ++( ) { ++x; ++y; ++z; return *this;} Einstellige Postfix-Operatoren: werden mit einem Dummy- int in der Parameterliste definiert. Benutzung: erg = obj++; Definition am Beispiel vektor: vektor operator ++( int ) { vektor h=*this; ++x; ++y; ++z; return h; } R.Grossmann / P. Sobe 10

Der *this - Zeiger Nachdem wir den <<-Operator als Nicht-Elementfunktion außerhalb der Klasse überladen haben, wollen wir diesen gleich in der Elementfunktion drucke() so verwenden. Da aber die Definition des Überladens ostream& operator << (ostream& s, vektor v)... in der Klasse nicht bekannt ist, müssen wir drucke() auch außerhalb, hinter der ostream& operator << -Definition plazieren: void vektor::drucke(){ cout << \n <<??? ; } An der Stelle??? müsste eigentlich das auszugebende Objekt stehen! Wie heißt aber das Objekt in der Klasse selbst? Dafür wurde der this-zeiger eingeführt. Durch Dereferenzierung kommt man zum Wert des Objekts: void vektor::drucke(){ cout << \n << *this ; } R.Grossmann / P. Sobe 11 Der *this - Zeiger Erklärung zu Programm vektor_7.cpp! Da in jeder Klasse zwar die Datenstruktur (private-teil) definiert ist, aber das Objekt als Ganzes innerhalb der Klasse keinen Namen hat, wurde dafür der this-zeiger eingeführt. Über *this kann man auf den Wert des Objektes zugreifen. Der this-zeiger kann auch bei Element-Funktionen eingesetzt werden, die sonst den Typ void zurückbringen würden. Durch return *this; kann jetzt der klassenspezifische Typ zurückgegeben werden. Beispiel: Klasse complex Sie haben eine Methode konj(), die den konjugiert komplexen Wert des Objektes erzeugen soll und man kann in der Klasse complex definieren void konj() {i=-i;} // i sei der Imaginärteil in der Klasse R.Grossmann / P. Sobe 12

Der *this - Zeiger Besser wäre die Nutzung des this-zeigers, also: statt void konj() {i=-i;} kann man schreiben complex konj() { i=-i; return *this; } Das ist wesentlich eleganter, da jetzt die Methoden auf Objekte mehrfach hintereinander ausgeführt werden können, da sie den Klassentyp zurückbringen, was wir bereits bei den Element-Funktionen add, sub,... erörtert haben! Hinweis: Das Programm vektor_8.cpp implementiert einige interessante Methoden, Einheitsvektor, Parallelität, Senkrechtstehen und die Gleichheit von Vektoren unter Nutzung des this- Zeigers. R.Grossmann / P. Sobe 13