C++ - Operatoren. Eigene Klassen mit neuen Funktionen

Ähnliche Dokumente
Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

Java Einführung Operatoren Kapitel 2 und 3

Vorkurs C++ Programmierung

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

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

Einführung in die Java- Programmierung

Klausur C++ #1 Jahr: 2001; Dozent: Dipl.Ing. Sorber

Objektorientierte Programmierung

Java: Vererbung. Teil 3: super()

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Programmieren in Java

Objektorientierte Programmierung. Kapitel 12: Interfaces

Einführung in die C++ Programmierung für Ingenieure

Java Kurs für Anfänger Einheit 5 Methoden

Programmieren. 10. Tutorium 4./ 5. Übungsblatt Referenzen

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

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

Methoden. von Objekten definiert werden, Methoden,, Zugriffsmethoden und Read-Only

3 Objektorientierte Konzepte in Java

Zählen von Objekten einer bestimmten Klasse

Tutorium Rechnerorganisation

Objektbasierte Entwicklung

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2

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

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala

Übungen zu C++ Kapitel 1

Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Gute Lösung:

Prinzipien Objektorientierter Programmierung

5. Abstrakte Klassen. Beispiel (3) Abstrakte Klasse. Beispiel (2) Angenommen, wir wollen die folgende Klassenhierarchie implementieren:

Einführung in die Programmierung

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Pädagogische Hochschule Thurgau. Lehre Weiterbildung Forschung

Computeranwendung und Programmierung (CuP)

Einführung in die Programmierung

Professionelle Seminare im Bereich MS-Office

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Grundlagen. Kapitel 1

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

Unterprogramme. Funktionen. Bedeutung von Funktionen in C++ Definition einer Funktion. Definition einer Prozedur

5. Abstrakte Klassen

Objektorientiertes Programmieren für Ingenieure

Algorithmen und Datenstrukturen

Programmieren I. Strategie zum Entwurf von Klassen. Beispiele. Design von Klassen. Dr. Klaus Höppner. Beispiel: Bibliothek

Fachdidaktik der Informatik Jörg Depner, Kathrin Gaißer

Diana Lange. Generative Gestaltung Operatoren

Delegatesund Ereignisse

Klausurteilnehmer. Wichtige Hinweise. Note: Klausur Informatik Programmierung, Seite 1 von 8 HS OWL, FB 7, Malte Wattenberg.

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Einführung in die Java- Programmierung

C++-Zusammenfassung. H. Schaudt. August 18, 2005

Programmiertechnik Operatoren, Kommentare, Ein-/Ausgabe

Programmieren Tutorium

Java Einführung Collections

Prof. Dr. Uwe Schmidt. 21. August Aufgaben zur Klausur Objektorientierte Programmierung im SS 2007 (IA 252)

5. Tutorium zu Programmieren

Objektorientierte Programmierung mit C++ Zusammenfassung der wichtigsten Topics rund um die objektorientierte Programmierung mit C++11

C++ - Einführung in die Programmiersprache Polymorphismus und Vererbung. Eltern

Javakurs zu Informatik I. Henning Heitkötter

Deklarationen in C. Prof. Dr. Margarita Esponda

Software Engineering Interaktionsdiagramme

Der Zwei-Quadrate-Satz von Fermat

Programmierkurs Java

Diplomvorprüfung in Datenverarbeitung EBS Sommersemester 2002

2. Semester, 2. Prüfung, Lösung

Javakurs 2013 Objektorientierung

Hello World. Javakurs 2014, 1. Vorlesung. Sebastian Schuck. basierend auf der Vorlage von Arne Kappen. wiki.freitagsrunde.org. 3.

1. Übung zu "Numerik partieller Differentialgleichungen"

Java Einführung Abstrakte Klassen und Interfaces

Programmieren in C++ Überladen von Methoden und Operatoren

Grundlagen von Python

.NET Code schützen. Projekt.NET. Version 1.0

Scala kann auch faul sein

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6

6.2 Scan-Konvertierung (Scan Conversion)

L6. Operatoren und Ausdrücke

Zeichen bei Zahlen entschlüsseln

Grundlagen der Programmiersprache C++

Excel Funktionen durch eigene Funktionen erweitern.

Übungsblatt 3: Algorithmen in Java & Grammatiken

Klassenbeziehungen & Vererbung

Klausur in Programmieren

Meeting C++ C++11 R-Value Referenzen

Überblick. Lineares Suchen

Ziel, Inhalt. Programmieren in C++ Wir lernen wie man Funktionen oder Klassen einmal schreibt, so dass sie für verschiedene Datentypen verwendbar sind

Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden.

Java Einführung Methoden in Klassen

13. Tutorium zu Programmieren

Objektorientierte Programmierung mit C++ Vector und List

ubasic Port für STM32F4 von Uwe Becker

Klassenentwurf. Wie schreiben wir Klassen, die leicht zu verstehen, wartbar und wiederverwendbar sind? Objektorientierte Programmierung mit Java

Fakultät Angewandte Informatik Lehrprofessur für Informatik

Bauteilattribute als Sachdaten anzeigen

FB Informatik. Fehler. Testplan

2. Negative Dualzahlen darstellen

Mathematik. UND/ODER Verknüpfung. Ungleichungen. Betrag. Intervall. Umgebung

Dieses Tutorial gibt eine Übersicht der Form Klassen von Struts, welche Besonderheiten und Unterschiede diese aufweisen.

Programmiersprache 2 (C++) Prof. Dr. Stefan Enderle NTA Isny

Um ein solches Dokument zu erzeugen, muss eine Serienbriefvorlage in Word erstellt werden, das auf die von BüroWARE erstellte Datei zugreift.

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Transkript:

C++ - Operatoren Eigene Klassen mit neuen Funktionen

Übersicht Klassen bisher Eigene Operatoren definieren 2

Bisher Durch Kapselung, Vererbung und Polymorphy können nun eigene Klassen definiert werden, die Eigenschaften anderer Klassen nutzen und erweitern. Es können neue Methoden hinzugefügt werden, mit denen die original Methoden überladen werden. Jedoch was ist mit den durch die Sprache C++ vorgegebenen Operatoren wie: + +=, class Point private: double X, Y; public: Point(double xx, double yy) X=xx; Y=yy; main() Point A, B ; A += B; //??? A++; //??? 3

Überladung von Operatoren Für die Verarbeitung von Objekten einer Klasse lassen sich eigene Operatoren (Operatorfunktionen) definieren, die den Operatoren auf intrinsische Datentypen überladen sind. Eigenschaften überladener Operatoren: Operatoren, die Basisvariablen verknüpfen, lassen sich nicht überladen, d.h. wenigstens ein Operand muss Objekt einer Klasse sein. Nicht alle Operatoren können überladen werden. Es können keine neuen Symbole für Operationen kreiert werden, sondern nur bestehende überladen werden. Die Hierarchie der Operatoren ist unveränderbar. Die Stelligkeit (unär, binär) der Operatoren ist unveränderbar. Die unären Inkrement (++)- und Dekrementoperatoren (--) erfahren eine Differenzierung als Prä- oder Postfix-Operator durch Verwendung eines Dummy- Arguments (int) für die Postfix-Variante. Die Operatoren [ ], ( ), = und -> müssen Mitglieder einer Klasse sein und dürfen nicht als static deklariert werden. 4

Überladung von Operatoren Prio. Operatoren Ass. Stell. Überl. Wirkung 1 :: rechts 1 N globaler Bezug 1 :: links 2 N Klassenbezug 2. links 2 N Memberzugriff mit Objekt 2 -> links 2 J Memberzugriff mit Objektzeiger 2 [ ] links 1 J Feldindex 2 ( ) links 1 J Funktionsaufruf 2 typ (variable) links 1 J Typkonvertierung 2 ++, -- rechts 1 J Inkrement, Dekrement 3 sizeof links 1 N Speicherbedarf 3! rechts 1 J Negation logisch 3 ~ rechts 1 J Negation bitweise 3 +, - rechts 1 J Vorzeichen (unär) 3 * rechts 1 J Derefenzierung 3 & rechts 1 J Adresse 3 new rechts 1 J Speicherallokation 3 delete rechts 1 J Speicherfreigabe 3 (typ) rechts 1 J Typkonvertierung 4 ->* links 2 J Memberzeiger mit Objektzeiger 4.* links 2 N Memberzeiger mit Objekt 5

Überladung von Operatoren Prio. Operatoren Ass. Stell. Überl. Wirkung 5 *, / links 2 J Multiplikation, Division 5 % links 2 J modulo 6 +, - links 2 J Summe, Differenz 7 <<, >> links 2 J bitweises Schieben 8 <, <=, >, >= links 2 J Relation 9 ==,!= links 2 J Gleichheit, Ungleichheit 10 & links 2 J bitweises AND 11 ^ links 2 J bitweises XOR 12 links 2 J bitweises OR 13 && links 2 J logisches AND 14 links 2 J logisches OR 15?: links 3 N arithmetisches IF 16 +=, -=, *=, /=, %=, &=, ^=, =, <<=, >>= rechts 2 J Zuweisung 17, links 2 J Komma-Operator 6

Optionen zur Definition eines Operators Der Operator ist Member einer Klasse Syntax: rückgabetyp klassenname:: operator operatorsymbol (formalparameterliste) Anweisungen; Der Operator ist nicht Member einer Klasse Syntax: rückgabetyp operator operatorsymbol (formalparameterliste) Anweisungen; Der Operator ist nicht Member einer Klasse aber friend einer Klasse Syntax: rückgabetyp operator operatorsymbol (formalparameterliste) Anweisungen; 7

Umsetzung der Operatorsyntax in einen Operatorfunktionsaufruf: Klassenmember Syntax Operatorfunktion nein x y operator (x, y) nein x operator (x) nein x operator (x,0) ja x y x.operator (y) ja x x.operator ( ) ja x x.operator (0) ja x = y x.operator = (y) ja x(y) x.operator ( ) (y) ja x[y] x.operator [ ] (y) ja x-> (x.operator >( )) > 8

Beispiel: Klasse Point class Point friend Point operator (const Point &obj); //unär - friend Point operator * (double z, const Point &obj); //binär * private: double x, y; public: Point(void) x=0.; y=0.; //Standard-Konstruktor Point(const Point &obj) x=obj.x; y=obj.y; //Kopier-Konstruktor ; Point(double xx, double yy) x=xx; y=yy; //generischer Konstruktor Point operator ++ (void); //unär ++ (prefix) Point operator + (const Point &obj); //binär + (return object) Point Point::operator ++ (void) //Definition Klassenmember 1 x += 1.; y += 1.; return *this; //Übergabe des aufrufenden //Objekts durch Dereferenzierung 9

Beispiel: Klasse Point Point Point::operator + (const Point &obj) //Definition Klassenmember 2 return Point(x + obj.x, y + obj.y); //Rückgabe mit Konstruktoraufruf Point operator - (const Point &obj) //Definition friend-funktion 1 return Point(-obj.x, -obj.y); //Rückgabe mit Konstruktoraufruf Point operator * (double z, const Point &obj) return Point(z*obj.x, z*obj.y); //Definition friend- //Funktion 2 //Rückgabe mit Konstruktoraufruf... Point p1(1., 2.), p2(3., 4.); p1++; //p1.x = 2., p1.y = 3. Point p3 = -p1 + p2; //unär -, binär + Point p4 = 2.* p1; //p4.x = 4., p4.y = 6. 10

Eigenschaften des Zuweisungsoperators = Der Zuweisungsoperator kann einem Objekt ein anderes Objekt der gleichen oder einer anderen Klasse zuweisen. Ist der Zuweisungsoperator nicht explizit definiert und ein Objekt der gleichen Klasse wird zugewiesen, dann kopiert der Compiler die Daten des einen Objekts in das zweite Objekt. Die Konsequenzen sind vergleichbar denen bei fehlendem Kopier-Konstruktor. Die Operatorfunktion muss als Member der Klasse definiert werden. Für die Zuweisung muss das Zielobjekt bereits definiert sein. Wird das Operatorsymbol = bei der Definition verwendet, erfolgt der Aufruf des Kopier-Konstruktors, nicht der Aufruf der Operatorfunktion. Für die Verwendung kombinierter Zuweisungen muss das Objekt, das den Aufruf tätigt, mit *this zurückgegeben werden. Beispiel: Point p5 = p1 += p2 11

Definition eines Konversionsoperators (cast) Für die Konversion eines Objekts in ein anderes kann ein Konversionsoperator definiert werden. Beispiel: class Demo private: double xxd; public: Demo(double x) xxd = x; // Konversions -Konstruktor operator int(void) return (int) xxd; //Konversionsoperator ;... Demo objdemo = 3.1; //Instanzierung + Initialisierung int n; n = objdemo; //impliziter Aufruf von int( ) n = (int) objdemo; //expliziter Aufruf (cast-variante) n = int (objdemo); //expliziter Aufruf (function-variante) 12

Eigenschaften eines Konversionsoperators (cast) Die Konversionsoperatorfunktion muss Member der Quellklasse sein. Ein return-typ darf nicht angegeben werden, da dieser automatisch aus dem Operatornamen ermittelt wird. Eine return-anweisung muss in der Definition angegeben werden. Der Datentyp des Formalparameters muss void sein. Die Quellklasse muss eine vom Anwender definierte Klasse sein. Konversionsoperatoren für Basisvariablentypen können nicht überladen werden. Die Zielklasse kann eine vom Anwender definierte Klasse oder ein Basisvariablentyp sein. Für den gleichen Zweck können nicht gleichzeitig ein Konversions-Operator und ein Konversions-Konstruktor eingesetzt werden. Ist die Zielklasse ein Basisvariablentyp, muss ein Konversions-Operator verwendet werden. 13

Empfehlungen für die Auswahl unter den Optionen zur Operatordefinition: Steht der Quellcode der Klasse nicht zur Verfügung, muss die Operatordefinition als Nicht-Member-Funktion realisiert werden. Muss auf private-member-daten unterschiedlicher Klassen zugegriffen werden, empfiehlt sich die Verwendung von friend-funktionen. Ist ein binärer Operator zu definieren und der erste Operand ist ein Basisvariablentyp, kann eine Member-Funktion zur Operatordefinition nicht verwendet werden. Beispiel: Point p4 = 2.* p1 Die Operatoren [ ], ( ), = und -> müssen als Mitglieder einer Klasse definiert werden. Für die Verwendung kombinierter Zuweisungen muss das Objekt, das den Aufruf tätigt, mit *this zurückgegeben werden. Beispiel: Point p5 = ++p1 + p2 14

Beispiel: Point Ausgabe << Gesucht ist der Operator << in Verbindung mit dem Ausgabestrom ostream Zunächst muss geklärt werden ob sich der Operator überladen lässt und wenn ja was für ein Typ er ist JA, binär istream ostream Klassen iostream In welcher Form kann ein binärer Operator geschrieben werden 2 Möglichkeiten Klassenmember Ja und Nein Aber (siehe oben) es geht nicht um die Erweiterung von Point sondern um ostream o Nur eine Nicht Member Funktion bleibt 15

Beispiel: Point Ausgabe << D.h. die Operatorfunktion muss nach dem Muster operator<< (x,y) gebildet werden Damit eine Verkettung von Streamoperation funktioniert cout << x << y << z muss jeder Operator selbst wieder eine Referenz auf das Objekt liefern d.h. Der Rückgabewert ist : ostream& operator << Der erste Parameter ist eine Referenz des Streams selbst (i.e. genau der Wert, den ein vorhergehender Operator liefert ostream& operator << (ostream& Ausgabe, Der zweite Parameter benötigt ein Point Objekt in diesem Fall (als kompl. Objekt) eine Referenz auf ein Point Objekt ostream& operator << (ostream& Ausgabe, Point& P) 16

Beispiel: Point Ausgabe << Als letztes ist zu entscheiden was die Operatorfunktion machen soll: ostream& operator<< (ostream &Ausgabe, const Point &P ) Ausgabe << "P(" << P.x << "," << P.y << ")"; return Ausgabe; in diesem Fall greift sie auf die "privaten" Attribute x und y zu D.h.Die Operatorfunktion muss ein Freund der Klasse Point sein: friend ostream& operator<< (ostream &Ausgabe, const Point &P ); muss in der Klasse Point definiert sein. 17