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

Größe: px
Ab Seite anzeigen:

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

Transkript

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

2 Inhaltsverzeichnis 10 Operator-Überladung Übersicht aller Operatoren Motivation zur Operatorüberladung Überladbare und nicht überladbare Operatoren Syntax der Operatorüberladung Beispiele zur Operator-Überladung: Die Klasse "Geld" Arithmetische Operatoren Vergleichsoperatoren Inkrement- und Dekrement-Operator Ein- und Ausgabeoperatoren Typumwandlungsoperatoren Spezielle Operatoren: Die Klasse Vector Zuweisung und Kopie Der Indexoperator [ ] Der Funktion-Operator () Der Dereferenzierungsoperator -> Prof. Dr. Manfred Beham, FH Amberg-Weiden Seite 2

3 10 Operator-Überladung Die Verwendung der arithmetischen Operatoren +, -, * oder \ ist uns allen geläufig. Darüber hinaus kennt C++ noch eine ganze Menge weiterer Operatoren. Doch damit nicht genug, wir können Operatoren für unsere eigenen Klassen neu definieren. Zuerst werden wir uns einen Überblick aller C++ Operatoren verschaffen und Ordnung in die große Menge von verschiedenen Operationen bringen. Wir werden dann einen Mechanismus zum Überladen von Operatoren kennen lernen. Ausgehend von einem neu zu definierenden Zahlentyp der Festkommazahl werden wir alle benötigten Operatoren neu definieren. Auch elementare Vorgänge, wie Zuweisung und Initialisierung, können vom Programmierer selbst definiert werden, wenn das für spezielle Klassen nötig ist Übersicht aller Operatoren C++ kennt eine große Menge an Operatoren, die mit allen möglichen Sonderzeichen abgekürzt werden. Offensichtlich waren die Erfinder von C bzw. C++ schreibfaul. Anstatt sinnreiche Namen für die jeweilige Operation zu verwenden, haben sie alle Sonderzeichen verwendet, die auf der Tastatur zu finden sind. Und damit nicht genug, sie haben auch noch Kombinationen dieser Sonderzeichen verwendet. Wir können mit Hilfe der Operatoren beliebig komplexe Ausdrücke in unserem Programm aufbauen. Es gibt hier sogar Programmierer die Spaß daran haben, möglichst viele Operationen in eine Programmzeile zu schreiben, was nicht gerade die Lesbarkeit eines Programms erhöht. Zum Verständnis eines komplexen Ausdrucks sind folgende Eigenschaften eines Operators hilfreich: Die Stelligkeit eines Operators gibt die Anzahl der an der Operation beteiligten Operanden an. Es gibt: o unäre Operatoren: - (Vorzeichen), ++, --, o binäre Operatoren: +, -, *, /, &&,, o einen tertiären Operator:? : Die Priorität eines Operators legt in Ausdrücken mit verschiedenen Operatoren die Reihenfolge fest, in der die einzelnen Operationen ausgeführt werden. Bei mehreren Operatoren gleicher Priorität muß man wissen ob der Ausdruck von links nach rechts oder rechts nach links ausgewertet wird (Assoziativität). Außerdem muß man natürlich die Bedeutung eines Operators und die Datentypen auf die er angewandt werden kann kennen. Folgende Tabelle zeigt alle C++ Operatoren unter Angabe ihrer Eigenschaften und Funktionalität: Prof. Dr. Manfred Beham, FH Amberg-Weiden Seite 3

4 Prof. Dr. Manfred Beham, FH Amberg-Weiden Seite 4

5 10.2 Motivation zur Operatorüberladung Idee: Verwende die einheitliche Notation für das Verknüpfen bzw. Manipulieren von Standarddatentypen auch für Klassenobjekte. int ia = 1, ib = 2, ic; ic = ia + ib; Geld A(1.12), B(2.34), C; C = A + B; Vorteil: Programme werden übersichtlicher und verständlicher. Prinzip: Die Operator- oder Infix-Notation ist in C++ nur eine Kurzschreibweise für eine spezielle Funktions- Notation: Operatoren können deshalb ähnlich wie Funktionen über die Parametertypen überladen werden Überladbare und nicht überladbare Operatoren Prof. Dr. Manfred Beham, FH Amberg-Weiden Seite 5

6 Einschränkungen: Die Priorität und die Ausführungsreihenfolge der Operatoren kann nicht geändert werden. Binäre Operatoren bleiben binär und unäre Operatoren bleiben unär. Neue Operatorsymbole können nicht definiert werden. Ein Operand muß immer ein Klassentyp sein, d.h. man kann die Operatoren für die Standardtypen nicht umdefinieren. Operatorfunktionen dürfen keine default-parameter haben Syntax der Operatorüberladung Operatorüberladung: // Deklaration: RückgabeTyp operator op (Parameterliste); // Definition: RückgabeTyp [KlassenName::]operator op (Parameterliste) // Funktionsrumpf (op steht als Platzhalter für den zu überladenden Operator) Grundsätzlich hat der Programmierer die Wahl, einen Operator als Memberfunktion (Elementfunktion) einer Klasse oder als externe Funktion zu definieren. Um diesen wichtigen Unterschied zu demonstrieren, wollen wir den Operator + (Addition) für eine selbst definierte Klasse Currency (Währung) überladen und anwenden 1. Klasse "Currency" operator + als externe Funktion: class Currency //... Attribute, sonstige Methoden ; // externe Funktion (non Member of Currency) Currency operator + (Currency leftop, Currency rightop) // Funktionsrumpf int main () Currency a, b, c; //... c = a + b; // Infix Notation c = operator + (a, b); // Funktions Notation Prof. Dr. Manfred Beham, FH Amberg-Weiden Seite 6

7 2. Klasse "Currency" operator + als Memberfunktion: class Currency //... Attribute, sonstige Methoden ; // Memberfunktion Deklaration Currency operator + (Currency rightop) const; // Memberfunktion Definiton Currency Currency::operator + (Currency rightop) const // Funktionsrumpf, leftop *this int main () Currency a, b, c; //... c = a + b; c = a.operator+ (b); // Infix Notation // Funktions Notation Beachte: Die Infix- und die Funktions-Notation sind vollkommen gleichartig und können nebeneinander verwendet werden. Natürlich kommt uns die Infix-Notation entgegen und sollte bevorzugt werden. Syntaxübersicht 1. Externe Funktion: Ist die Funktion keine Methode der Klasse, so hat die Funktion so viele Parameter wie der Operator Operanden. 2. Memberfunktion: Ist die Funktion eine Methode der Klasse, so ist der linke Operand immer das aktuelle Objekt (this-zeiger). Ist der linke Operand, d.h. der 1. Parameter kein Klassenobjekt, so kann die Überladung nicht als Memberfunktion deklariert werden. Sie muß, falls trotzdem auf private-komponenten zugegriffen werden soll, als friend-funktion deklariert werden. Prof. Dr. Manfred Beham, FH Amberg-Weiden Seite 7

8 Folgende Operatoren müssen als Memberfunktionen der Klasse deklariert werden: = Zuweisung [] Indexoperator () Funktionsaufruf -> Zugriffsoperator ->* Zeigerzugriffsoperator (1. Parameter ist damit garantiert ein lvalue.) 10.5 Beispiele zur Operator-Überladung: Die Klasse "Geld" Wir werden einen neuen Zahlentyp definieren, den es so noch nicht in C++ gibt. Wir haben bisher den Datentyp float verwendet, um unseren Kontostand zu speichern. Das ist sicher sinnvoll, da der Kontostand auch krumme Beträge von DM und Pfennigen bzw. Euro und Cent annehmen kann. Der Datentyp float ergibt aber eine Genauigkeit von ca. 7 Dezimalstellen nach dem Komma, was für unsere Anwendung etwas übertrieben ist. Der Kontostand sollte durch eine sogenannte Festkommazahl repräsentiert werden, die immer nur 2 Stellen nach dem Komma berücksichtigt Arithmetische Operatoren Definition der Klasse "Geld" #include <iostream.h> class Geld private: int Euro; int Cent; void normalize (); public: // Konstruktor Geld (int eur=0, int cnt=0) : Euro(eur), Cent(cnt) normalize (); // Zusammengesetzte arithmetische Operatoren const Geld& operator += (const Geld& r) const Geld& operator -= (const Geld& r) // Zugriff auf Attribute int geteuro () const return Euro; int getcent () const return Cent; ; // externe Operator-Funktionen Geld operator + (const Geld& l, const Geld& r); Geld operator - (const Geld& l, const Geld& r); Geld operator - (const Geld& l); Die Methode "normalize" dient der normalisierten Darstellung eines Geldbetrages. Sie sorgt dafür, daß der Cent-Wert 0 Cent < 100 ist. Größere Beträge an Cent werden in ganze Euro umgerechnet. Die zusammengesetzten Zuweisungsoperatoren += und -= werden als Memberfunktionen der Klasse Geld definiert (Zuweisung!). Die "normale" Addition, Subtraktion und Negation werden als externe Funktion deklariert. Sie verwenden die bereits definierten zusammengesetzten Zuweisungsoperatoren. Prof. Dr. Manfred Beham, FH Amberg-Weiden Seite 8

9 Implementation der Klasse "Geld" #include "geld.h" // Normalisieren der Zahlendarstellung (0 <= Cent < 100) void Geld::normalize () if (Cent >= 100 Cent <= -100) int eur = Cent / 100; Euro += eur; Cent -= eur * 100; if (Cent < 0) Cent += 100; Euro -= 1; // Addition und Zuweisung const Geld& Geld::operator += (const Geld& r) Euro += r.euro; Cent += r.cent; normalize (); return *this; // Subtraktion und Zuweisung const Geld& Geld::operator -= (const Geld& r) Euro -= r.euro; Cent -= r.cent; normalize (); return *this; // externe Funktionen // Addition Geld operator + (const Geld& l, const Geld& r) return Geld(l) += r; // Subtraktion Geld operator - (const Geld& l, const Geld& r) return Geld(l) -= r; // Vorzeichen Geld operator - (const Geld& l) return Geld (0) -= l; Beachten sie bitte die Vorgehensweise: Definieren sie zuerst die zusammengesetzten Zuweisungsoperatoren als Memberfunktion: const Geld& operator += (const Geld& rechterop); Prof. Dr. Manfred Beham, FH Amberg-Weiden Seite 9

10 Damit können sie dann die einfachen Operatoren als externe Funktion implementieren: Geld operator + (const Geld& linkerop, const Geld& rechterop) return Geld(linkerOp) += rechterop; Der Ausdruck hinter dem return erzeugt eine namenlose Kopie des linken Operanden, addiert den rechten Operanden dazu und gibt das Ergebnis als Kopie (by value) zurück Vergleichsoperatoren Die Vergleichsoperatoren liefern als Ergebnis einen boolschen Wert. Sie sollten immer als externe Funktionen nach folgenden Muster definiert werden: Deklaration der Vergleichsoperatoren: #include <iostream.h> class Geld //... ; bool operator == (const Geld&, const Geld&); bool operator!= (const Geld&, const Geld&); bool operator < (const Geld&, const Geld&); bool operator <= (const Geld&, const Geld&); //... etc. Üblicherweise werden nur == und < implementiert und die anderen Operatoren davon abgeleitet. Implementation der Vergleichsoperatoren: #include "geld.h" bool operator == (const Geld& li, const Geld& re) return li.geteuro() == re.geteuro() && li.getcent() == re.getcent(); bool operator!= (const Geld& li, const Geld& re) return!(li == re); bool operator < (const Geld& li, const Geld& re) return li.geteuro() == re.geteuro()? li.getcent() < re.getcent() : li.geteuro() < re.geteuro(); bool operator <= (const Geld& li, const Geld& re) return li < re li == re; // etc. Prof. Dr. Manfred Beham, FH Amberg-Weiden Seite 10

11 Inkrement- und Dekrement-Operator C++ kennt spezielle Operatoren um ganze Zahlen um eins zu erhöhen (increment) oder eins zu erniedrigen (decrement). Der Incrementoperator '++' ist nichts anderes als eine verkürzte Schreibweise: int a = 5; a++; // entspricht: a = a + 1; Den In- / Decrementoperator gibt es in einer Pre- und Postfix Version. Sie unterscheiden sich lediglich durch den Rückgabewert. Folgender Programmausschnitt int a = 5; cout << a++ << endl; cout << a << endl; cout << ++a << endl; cout << a << endl; liefert die Ausgabe: Vorüberlegung zur Überladung: Eine Unterscheidung zwischen Prefix und Postfix wird durch einen nicht verwendeten (dummy) int- Parameter ermöglicht. Die unäre Operation wird als Memberfunktion deklariert: RückgabeTyp operator++(); //Prefix: ++A RückgabeTyp operator++(int); //Postfix: A++ Prefix: Rückgabewert ist die um 1 erhöhte Zahl (vom Typ CRatio) Postfix: Rückgabewert ist die noch unveränderte Zahl Deklaration und Implementation von Increment- / Decrementoperator: (Fortsetzung) #include <iostream.h> class Geld... // Prefix Increment (plus ein Euro) const Geld& operator++ () return *this += Geld(1); // Postfix Increment Geld operator++ (int) Geld t = *this; *this += Geld(1); return t; ; Prof. Dr. Manfred Beham, FH Amberg-Weiden Seite 11

12 Ein- und Ausgabeoperatoren Strenggenommen kennt die Programmiersprache C++ gar keine Ein- und Ausgabeoperatoren. Zusätzlich zum C++ Sprachumfang gibt es noch eine sogenannte Standardbibliothek, die umfangreiche Funktionalität geschrieben in C++ zur Verfügung stellt unter anderem Ein- und Ausgabe (siehe auch Folge 13). Die standardisierte Ein- und Ausgabe erfolgt über zeichenorientierte Datenströme (streams). Die Standardbibliothek definiert zwei Basisklassen für die beiden Richtungen des Datenverkehrs: ostream: Zeichenweise Ausgabe istream: Zeichenweise Eingabe Da die einzelnen ASCII-Zeichen der Datenströme in interne Datentypen gewandelt werden müssen, stellen die beiden Klassen ostream und istream Aus- bzw. Eingabeoperatoren zur Verfügung. Da C++ selbst keinen besonderen Operator für die Ein- und Ausgabe kennt, mußte ein bestehender Operator 'mißbraucht' (überladen) werden. Man entschied sich für operator << den bitshift-left-operator zur Ausgabe und für operator >> den bitshift-right-operator zur Eingabe. Damit können wir die bereits verwendete Schreibweise zur Ein- / Ausgabe verstehen. In folgendem Programmfragment int a = 5; cout << a; handelt es sich bei cout um eine Objekt vom Typ ostream. Auf der linken Seite des Operators << steht also ein ostream, auf der rechten ein int. Der entsprechende Operator ist ebenso wie für alle anderen eingebauten Standarddatentypen bereits in der Klasse ostream wie folgt definiert: class ostream ostream& operator << (int);... Interessant ist, daß der Operator << selbst wieder einen ostream als Ergebnis liefert. Da dieser Operator links assoziativ ist, kann man mehrere Ausgaben in einem Ausdruck aneinanderreihen: int a; double b; char c; cout << a << b << c << endl; // entspricht (((cout << a) << b) << c) << endl; Überladen von << und >> für selbst definierte Klassen Idee: Die gleiche Form der Eingabe wie für die Standarddatentypen soll auch für eigene Klassen möglich sein. Beispiel: Geld a; cin >> a; cout << a; Beachten sie: Auf der linken Seite des Ausdrucks befindet sich ein Objekt vom Typ ostream bzw. istream. Deshalb kann der linke Operand kein Klassenobjekt vom Typ Geld sein und damit können Einoder Ausgabeoperatoren nicht Memberfunktionen der Klasse sein! => Ein- bzw. Ausgabeoperatoren als externe Funktionen Falls diese externe Funktion Zugriff auf private Elemente der Klasse benötigt, müssen diese Operatoren als friend der Klasse deklariert werden Prof. Dr. Manfred Beham, FH Amberg-Weiden Seite 12

13 Deklaration von Ein- / Ausgabeoperator: #include <iostream.h> class Geld... // Ein- und Ausgabe friend ostream& operator<< (ostream&, const Geld&); friend istream& operator>> (istream&, Geld&); ; Implementation von Ein- / Ausgabeoperator: #include "geld.h" // Ausgabe Operator ostream& operator << (ostream& os, const Geld& r) int cnt; if (r.euro >= 0 r.cent == 0) os << r.euro << '.'; cnt = r.cent; else os << '-' << -(r.euro + 1) << '.'; cnt = -(r.cent - 100); if (cnt < 10) os << '0' << cnt; else os << cnt; return os; // Eingabe Operator istream& operator >> (istream& is, Geld& r) Typumwandlungsoperatoren C++ ist eine sehr streng typorientierte Sprache. Alle Objekte, die wir in unseren Programmen verwenden, haben einen bestimmten Datentyp. Und C++ wacht penibel darüber, dass einem Objekt eines Datentyps nur gleichartige Werte zugewiesen werden. Diese strenge Regel, kann der Programmierer aufweichen, indem er sogenannte Typumwandlungs-Operatoren für seine eigenen Klassen definiert. Wie auch in anderen Bereichen ist C++ hier höchst flexibel. Grundsätzlich ist es zwar verboten Datentypen wild zu vermengen. Aber der Programmierer kann dort, wo es ihm sinnvoll erscheint, wohl definierte Umwandlungen zulassen. Prof. Dr. Manfred Beham, FH Amberg-Weiden Seite 13

14 Wir müssen zwei Arten der Konvertierung von Typen für eine von uns selbst definierte Klasse unterscheiden. Für unsere Klasse Geld käme zum Beispiel eine Umwandlung von und in den Standarddatentyp double in Frage: 1. andere Typen Klassentyp; mit Typumwandlungs-Konstruktor 2. Klassentyp andere Typen; mit Cast-Operator Zu 1.: Wir haben einen neuen Typ in unserem Fall die Klasse Geld geschaffen und wollen andere Datentypen in unsere Klasse wandeln. Also die Umwandlung anderer Datentypen in unsere selbst definierte Klasse Geld. Diese Umwandlung von double nach Geld kann ein passender Konstruktor, den wir dann auch Typumwandlungskonstruktor nennen, übernehmen. Er muss aus einem double -Wert ein Objekt vom Typ Geld konstruieren. Der Konstruktor hat also genau einen Parameter vom Typ double. Zu 2.: In der anderen Richtung müssen wir einen geeigneten Umwandlungsoperator schreiben, den wir auch Cast-Operator nennen. Angewandt auf ein Objekt vom Typ Geld liefert er einen double -Wert als Ergebnis zurück. Die Syntax zur Deklaration des Cast-Operators sehen sie nachfolgend. Bei der Deklaration eines Cast-Operators muss man beachten, dass der Name des Operators sich aus dem Schlüsselwort Operator und dem Zieldatentyp zusammensetzt. Eine weitere Angabe eines Ergebnistyps ist nicht nötig. Deklaration der Typumwandlungsoperatoren : (Fortsetzung) #include <iostream.h> class Geld... // Konstruktor Geld (double); // cast-operator operator double () const; ; Sobald ein geeignete Typumwandlungs-Operatoren existieren können wir vielfältig zwischen float und Geld wandeln. Dabei ist die Konstruktorschreibweise und die Cast-Operator-Schreibwiese vollkommen gleichartig: Prof. Dr. Manfred Beham, FH Amberg-Weiden Seite 14

15 Anwendung der Typumwandlungsoperatoren : (Ausschnitt) double d; Geld a; Geld b = 3.14; // Typumwandlungskonstruktor > Geld a = b + Geld (2.50); // Typumwandlungskonstruktor > Geld a = b + (Geld) 2.50; // Typumwandlungskonstruktor > Geld d = (double) b; // Cast-Operator b -> 3.55 d = double(b); // Cast-Operator b -> 3.55 d = sqrt (b); // Implizite Typwandlung b -> 3.55 d = b // Ups! Mehrdeutig: Geld + Geld / double + double Beachte: Generell ist es klug, Konvertierungsoperatoren sparsam einzusetzen. 1. Die meisten Umwandlungen machen gar keinen Sinn oder führen zu Informationsverlust. 2. Es kann zu Mehrdeutigkeiten kommen, falls mehrere verschiedene Typumwandlungen existieren Spezielle Operatoren: Die Klasse Vector Neben den bereits überladenen Operatoren der Klasse 'Geld' kann man in C++ auch sehr spezielle Operatoren überladen. Für bestimmte Klassen ist es essentiell einen eigenen Zuweisungsoperator = zu definieren. Da dies für unsere Klasse Geld nicht unbedingt nötig ist, wollen wir im folgenden eine Klasse 'Vector' zur Repräsentation von eindimensionalen Feldern von double-werten realisieren. Bevor wir uns an die Realisierung der Klasse 'Vector' machen, wollen wir einige Vorüberlegungen zur Verwendung dieser Klasse anstellen: Vektoren sollen wie andere elementare Datentypen verwendbar sein, z.b.: #include "vector.h" int main () Vector a(3); // 3 dim. Vektor Vector b(3); // 3 dim. Vektor Vector c; // 1 dim. Vektor cin >> a >> b; // Eingabe zweier 3 dim. Vektoren c = a * b; // Scalarprodukt der Vektoren und Zuweisung Die Klasse 'Vector' muß also einen Konstruktor der Art Matrix (dim) besitzen, um dynamisch den nötigen Speicher zu reservieren. Die arithmetischen Operatoren können falls definiert auf Objekte vom Typ 'Vector' angewandt werden. Ebenso muß die Zuweisung das gewünschte Ergebnis liefern. Der Zugriff auf ein Element des Vektors erfolgt mit dem [] Operator: cout << c[1]; // Element 1 (= zweites) des Vektor c Ein Teilvektor von einem Startindex bis zu einem Endindex kann wie folgt gebildet werden: c = a(1,2); // Elemente von 1 bis 2 (einschließlich) Prof. Dr. Manfred Beham, FH Amberg-Weiden Seite 15

16 Definition der Klasse Vector: #include <iostream.h> class Vector private: unsigned int vecdim; // Anzahl der Elemente double * vecptr; // Zeiger auf erstes Element (Feld) public: Vector (unsigned int dim = 1); // Konstruktor ~Vector (); // Destruktor //... ; Zuweisung und Kopie C++ läßt dem Programmierer größtmögliche Freiheiten bei der Gestaltung seiner Objekte. Deshalb legt C++ auch nicht die Art und Weise fest, wie Objekte einander zugewiesen werden. Da nur der Programmierer die Bedeutung seiner Objekte kennt, kann auch nur er entscheiden, welches Resultat eine Zuweisung ergibt. Das macht C++ unter anderem so universell einsetzbar. Dieser Vorteil hat wie so vieles leider auch eine Kehrseite. Der Programmierer muss die Mechanismen kennen und er muss sehr sorgfältig damit umgehen. Würden wir eine Checkliste zur Klassendefinition aufstellen, dürfen folgende zwei Punkte nie fehlen: Braucht meine Klasse einen besonderen Zuweisungsoperator Benötigt meine Klasse eine spezielle Initialisierung durch Kopie Um den Unterschied zwischen Zuweisung und Kopie zu verstehen, sehen wir uns folgenden Programmausschnitt an. Vector a; Vector b(3); Vector c = b; a = b + c; // Konstruktion ohne explizite Initialisierung // Initialisierung mit spez. Konstruktor // Initialisierung durch Kopie // Zuweisung Offensichtlich erfolgt die Initialisierung nur wenn neue Objekte angelegt werden. Sie erhalten mit der initialen Zuweisung einen Startwert. Während die Zuweisung für bereits bestehende Objekte erfolgt und für ein Objekt beliebig oft wiederholt werden kann. C++ unterscheidet diese beiden Arten, da die Zuweisung im allgemeinen komplexer ist als die Initialisierung. Damit kann die Initialisierung unabhängig von der Zuweisung optimiert werden. Initialisierung durch Kopie Der Compiler sorgt standardmäßig dafür, das Kopieren eines Objekts möglich ist. Er kopiert dafür einfach alle einzelnen Elemente eines Objekts. Falls dies nicht das gewünschte Verhalten ist, kann der Programmierer den sogenannten "Copy-Konstructor" selbst definieren. Für unsere Klasse 'Vector' ist dieser Copy-Konstruktor unbedingt nötig, da eine elementweise Kopie nur den Zeiger auf die Elemente, nicht aber die Elemente selbst kopiert. Prof. Dr. Manfred Beham, FH Amberg-Weiden Seite 16

17 Die Deklarations-Syntax eines Copy-Constructors sollten sie sich gut einprägen. Deklaration eines Copy-Konstruktors: (Fortsetzung) class Vector public: Vector (const Vector&); ; Der Parameter des Copy-Constructors muß als Referenz übergeben werden. Ansonsten müßte bereits bei der Parameterübergabe eine Kopie des Wertes angelegt werden. Aber genau dieses Kopieren wollen wir ja gerade mit diesem Copy-Construktur definieren. Deshalb darf hier der Vector nicht als Kopie (by value), sondern muß als Referenz übergeben werden. Der Zuweisungsoperator Ähnlich wie der Operator + ist auch die Zuweisung ein zweistelliger Operator. Dem Operanden auf der linken Seite des "=Zeichens" wird der Wert der rechten Seite zugewiesen. Das ist ja bereits bekannt. Genau wie beim Operator + ist der Operand der linken Seite das Objekt auf den der Zuweisungsoperator angewandt wird. Der Wert der rechten Seite wird als Parameter übergeben. Mit diesem Wissen können wir uns an die Deklaration des Zuweisungsoperators wagen. Deklaration eines Zuweisungsoperators: (Fortsetzung) class Vector public: const Vector& operator = (const Vector&); ; Das Ergebnis einer Zuweisung ist der Wert, der gerade zugewiesen wurde. Diesen Wert kann man in Ausdrücken weiter verwenden, um z.b. Ketten von Zuweisungen zu ermöglichen. Wir dürfen in C++ in einem Ausdruck gleich mehreren Variablen einen Wert zuweisen: a = b = c = 1. Alle drei Variablen erhalten hier den Wert 1. Und das funktioniert nur deshalb, weil dieser Ausdruck von rechts nach links ausgewertet wird; und das Ergebnis der Zuweisung von der rechten Seite weiter nach links gereicht wird. Beachte: Zuweisung und Initialisierung müssen nicht für alle Klassen definiert werden. Sie werden von C++ automatisch definiert, falls wir keinen dieser Operatoren definieren. Da der Compiler aber nicht die Bedeutung eines Objekts und seiner Attribute kennt, werden stur die einzelnen Attribute elementweise kopiert. Wenn das für uns o.k. ist, können wir diese Standard-Zuweisung verwenden. Leider ergeben sich daraus oft schwerwiegende Programmierfehler: Wenn der Programmierer vergisst einen speziellen Zuweisungsoperator zu definieren. Meldet der Compiler keinen Fehler, sondern verwendet statt dessen die Standard-Zuweisung Der Indexoperator [ ] Der Indexoperator [] wird meist überladen, wenn indizierungsähnliche Operationen an Objekten, die sich aus mehreren Elementen zusammensetzen, vorgenommen werden sollen, wie z.b. der Zugriff auf ein Element unseres Vektors. Die Deklaration sieht dabei wie folgt aus: RückgabeTyp operator[](indextyp); Prof. Dr. Manfred Beham, FH Amberg-Weiden Seite 17

18 Der IndexTyp ist beliebig und muß nicht unbedingt ganzzahlig sein. Deklaration eines Indexoperators: class Vector public: double& operator [] (unsigned int); const double& operator [] (unsigned int) const; ; Hinweise: Der Indexoperator muß als Memberfunktion überladen werden. Über VectorObj[Index] soll auf den double-wert des entsprechenden Elements lesend und schreibend zugegriffen werden können. Der lesende Zugriff sollte auch für konstante Objekte const Vector möglich sein. Es sollten die Indexgrenzen automatisch überwacht werden. Rückgabewert soll im Fehlerfall eine Referenz auf das letzte Element des Vektors sein (willkürlich festgelegt) Der Funktion-Operator () Die Operator-Funktion () ist eine Elementfunktion und kann im Gegensatz zu vielen anderen Operatoren eine beliebige Anzahl von Argumenten entgegennehmen: RückgabeTyp operator() (Parameter1, Parameter2,... ); Anwendungen für das Überladen des ()-Operators sind z.b. Der Zugriff auf mehrdimensionale Arrays in der Form Matrix(1,4,6);. Klassen als Funktionsobjekte in der Form Function less; less(x,y); Für unsere Klasse 'Vector' wollen wir diesen Operator mißbrauchen, um aus einem Vector-Objekt einen Teilvektor beginnend ab einem Startindex bis einschließlich eines Endindex zu bilden. Deklaration eines Funktionsoperators: class Vector public: Vector operator () (unsigned int von, unsigned int bis) const; ; Das Ergebnis des ()-Operators ist hier ein neuer Vektor, der by-value zurückgegeben werden muß Der Dereferenzierungsoperator -> Das Hauptanwendungsgebiet für das Überladen von -> ist die Realisierung von Smart Pointers (sicheren Zeigern). Dies sind Zeigerobjekte, die die Indirektion, d.h. den Zugriff auf Objektkomponenten oder Objekte über Zeiger sicher gestalten (keine undef. Werte, keine 0-Zeiger,...). Der Operator muß als Elementfunktion überladen werden. Der Operator ist als einstelliger Postfixoperator zu deklarieren: RückgabeTyp operator->(); Prof. Dr. Manfred Beham, FH Amberg-Weiden Seite 18

19 Bei der Verwendung wird A->B ggf. interpretiert als (A.operator->())->B. Beachte: Die Operatorfunktion muß entweder einen Zeiger auf ein Klassenobjekt oder ein Objekt einer Klasse, für die der Operator -> definiert ist zurückgeben. Die Interpretation von A->B läuft folgendermaßen ab: a) Ist A ein Zeiger auf ein Klassenobjekt, dann wird der "normale" Dereferenzierungsoperator verwendet. b) Ist A jedoch ein Klassenobjekt, dann wird die Operatorfunktion der entsprechenden Klasse aufgerufen. Auf das Ergebnis wird wiederum nach a) oder b) verfahren. Prof. Dr. Manfred Beham, FH Amberg-Weiden Seite 19

Programmieren in C++ Überladen von Methoden und Operatoren

Programmieren in C++ Überladen von Methoden und Operatoren Programmieren in C++ Überladen von Methoden und Operatoren Inhalt Überladen von Methoden Überladen von Operatoren Implizite und explizite Konvertierungsoperatoren 7-2 Überladen von Methoden Signatur einer

Mehr

Projekt 3 Variablen und Operatoren

Projekt 3 Variablen und Operatoren Projekt 3 Variablen und Operatoren Praktisch jedes Programm verarbeitet Daten. Um mit Daten programmieren zu können, muss es Möglichkeiten geben, die Daten in einem Programm zu verwalten und zu manipulieren.

Mehr

10.4 Konstante Objekte

10.4 Konstante Objekte 10.4 Konstante Objekte Genau wie bei einfachen Datentypen (int,double,...) kann man auch Objekte als const deklarieren. Eine solche Deklaration bedeutet, daß alle Attribute so behandelt werden, als wären

Mehr

Was Mathematiker schon vor Jahrhunderten erfunden haben, gibt es jetzt endlich in ihrer Programmiersprache:

Was Mathematiker schon vor Jahrhunderten erfunden haben, gibt es jetzt endlich in ihrer Programmiersprache: Kapitel 8 Operatoren Was Mathematiker schon vor Jahrhunderten erfunden haben, gibt es jetzt endlich in ihrer Programmiersprache: Operatoren definieren Es ist in C++ möglich, Operatoren wie +, oder für

Mehr

Angewandte Mathematik und Programmierung

Angewandte Mathematik und Programmierung Angewandte Mathematik und Programmierung Einführung in das Konzept der objektorientierten Anwendungen zu mathematischen Rechnens WS 2013/14 Operatoren Operatoren führen Aktionen mit Operanden aus. Der

Mehr

C++ - Operatoren. Eigene Klassen mit neuen Funktionen

C++ - Operatoren. Eigene Klassen mit neuen Funktionen 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,

Mehr

5.3 Auswertung von Ausdrücken

5.3 Auswertung von Ausdrücken 5.3 Auswertung von Ausdrücken Funktionen in Java bekommen Parameter/Argumente als Input, und liefern als Output den Wert eines vorbestimmten Typs. Zum Beispiel könnte man eine Funktion i n t min ( i n

Mehr

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

Vokabeln. 4.1 Benutzer definierte Datentypen. Kapitel 4. Prof. Dr. Gerhard Berendt C++ oop? SS 2002 Arbeitsblatt 4 4.1 Benutzer definierte Datentypen C++ unterstützt die Einführung benutzer definierter Datentypen (auch Abstrakte Datentypen (ADT) genannt). ADTs bieten einen guten Einstieg in das Paradigma der objekt

Mehr

Überladen von Operatoren

Überladen von Operatoren - Überladen des Indexoperators [] - Überladen des Ausgabeoperators > Programmieren in C++ Informatik FH Trier C++12-1 ähnlich dem Überladen von Funktionen Überladen

Mehr

Objektorientiertes Programmieren mit C++ für Fortgeschrittene

Objektorientiertes Programmieren mit C++ für Fortgeschrittene BEREICH DATENTECHNIK I CQ 200 00 TH 02 Objektorientiertes Programmieren mit C++ für Fortgeschrittene Kapitel 2 2. Ergänzungen zum Überladen von Operatoren 2.1. Increment- und Decrement-Operator 2.2. Funktionsaufruf-Operator

Mehr

Einführung in die Programmierung mit C++

Einführung in die Programmierung mit C++ 1 Seite 1 Einführung in die Programmierung mit C++ Teil III - Objektorientierte Programmierung 9. Klassen und Methoden Was sind Klassen? Seite 2 sprachliches Mittel von C++ um objektorientierte Programmierung

Mehr

Überblick. 7. Überladen von Operatoren

Überblick. 7. Überladen von Operatoren Ü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

Mehr

7. Übung Informatik II - Objektorientierte Programmierung

7. Übung Informatik II - Objektorientierte Programmierung 7. Übung Informatik II - Objektorientierte Programmierung 29. Mai 2015 Inhalt 1 2 3 Übersicht 1 2 3 Idee Menschen nehmen die Welt in Form von Objekten wahr manche Objekte haben gleiche Eigenschaften, hierüber

Mehr

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java 1 / 26 Einstieg in die Informatik mit Java Felder Gerd Bohlender Institut für Angewandte und Numerische Mathematik Gliederung 2 / 26 1 Was sind Felder? 2 Vereinbarung von Feldern 3 Erzeugen von Feldern

Mehr

11. Übung Informatik II - Operatorfunktionen

11. Übung Informatik II - Operatorfunktionen Stand: 26. Juni 2015 Inhalt 1 2 3 Übersicht 1 2 3 Warum Operatoren überladen? Großteil der Operatoren (Arithmetik, Logik, Vergleiche) nur für Standarddatentypen (Zahlen, Zeiger) implementiert vergleichbare

Mehr

Programmierung mit C Zeiger

Programmierung mit C Zeiger Programmierung mit C Zeiger Zeiger (Pointer)... ist eine Variable, die die Adresse eines Speicherbereichs enthält. Der Speicherbereich kann... kann den Wert einer Variablen enthalten oder... dynamisch

Mehr

9. Vektoren. (auch Felder/array)

9. Vektoren. (auch Felder/array) 9. Vektoren (auch Felder/array) Motivation Hat man mehrere Objekte gleichen Datentyps, so kann man sie explizit deklarieren, wenn die Anzahl bekannt ist double x1,x2,x3,x4; Nachteile: versagt, -wenn die

Mehr

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

Thema heute: Vererbung und Klassenhierarchien. Abgeleitete Klassen. Vererbung von Daten und Funktionen. Virtuelle Funktionen 1 Thema heute: Vererbung und Klassenhierarchien Abgeleitete Klassen Vererbung von Daten und Funktionen Virtuelle Funktionen 2 Vererbung oft besitzen verschiedene Datentypen einen gemeinsamen Kern Beispiel:

Mehr

C++ - Objektorientierte Programmierung Polymorphie

C++ - Objektorientierte Programmierung Polymorphie C++ - Objektorientierte Programmierung Polymorphie hat eine Kantenlänge hat eine Füllfarbe Kantenlänge setzen Füllfarbe lesen Volumen berechnen C++ - Objektorientierte Programmierung 21.06.16 Seite 1 Polymorphie

Mehr

Themen. Statische Methoden inline Methoden const Methoden this Zeiger Destruktor Kopierkonstruktor Überladen von Operatoren

Themen. Statische Methoden inline Methoden const Methoden this Zeiger Destruktor Kopierkonstruktor Überladen von Operatoren Themen Statische Methoden inline Methoden const Methoden this Zeiger Destruktor Kopierkonstruktor Überladen von Operatoren Statische Methoden Klassenmethoden Merkmal der Klasse nicht eines einzelnen Objekts

Mehr

4. Objektorientierte Programmierung mit C++

4. Objektorientierte Programmierung mit C++ 4. Objektorientierte Programmierung mit C++ Einführung C++ / Entwicklung/ Sprachfamilie Nicht objektorientierte Erweiterungen von C Grundlagen des Typkonzepts von C++ Ziele der Objektorientierung Objekt

Mehr

C++ Klassen weitere Funktionen

C++ Klassen weitere Funktionen C++ Klassen weitere Funktionen Übersicht static Elemente const Elemente Zusätzliches zu Konstruktoren Kopier-Konstruktor Konvertierung-Konstruktor Initialisierungslisten Friend Funktionen 2 Statische Klassenkomponenten

Mehr

PROCESSING EINE ZUSAMMENFASSUNG. Created by Michael Kirsch & Beat Rossmy

PROCESSING EINE ZUSAMMENFASSUNG. Created by Michael Kirsch & Beat Rossmy PROCESSING EINE ZUSAMMENFASSUNG Created by Michael Kirsch & Beat Rossmy INHALT 1. Typen und Operatoren 1. Datentypen 3. Klassen und Objekte 1. Klassen und Objekte 2. Operatoren 2. Konstruktor 3. Typkonversion

Mehr

Javaprogrammierung mit NetBeans. Variablen, Datentypen, Methoden

Javaprogrammierung mit NetBeans. Variablen, Datentypen, Methoden Javaprogrammierung mit NetBeans Variablen, Datentypen, Methoden Programmieren 2 Java Bezeichner Bezeichner: Buchstabe _ $ Buchstabe _ $ Ziffer Groß- und Kleinbuchstaben werden strikt unterschieden. Schlüsselwörter

Mehr

Dr. Monika Meiler. Inhalt

Dr. Monika Meiler. Inhalt Inhalt 3 C-Ausdrücke...3-2 3.1 Arithmetische Ausdrücke...3-3 3.2 Wertzuweisungen...3-5 3.3 Inkrementieren und Dekrementieren...3-6 3.4 Logische Ausdrücke (Bedingungen)...3-7 3.5 Bedingte Ausdrücke...3-8

Mehr

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java 1 / 21 Einstieg in die Informatik mit Java Felder, eindimensional Gerd Bohlender Institut für Angewandte und Numerische Mathematik Gliederung 2 / 21 1 Überblick: Was sind Felder? 2 Vereinbarung von Feldern

Mehr

C++ Teil 12. Sven Groß. 18. Jan Sven Groß (IGPM, RWTH Aachen) C++ Teil Jan / 11

C++ Teil 12. Sven Groß. 18. Jan Sven Groß (IGPM, RWTH Aachen) C++ Teil Jan / 11 C++ Teil 12 Sven Groß 18. Jan 2016 Sven Groß (IGPM, RWTH Aachen) C++ Teil 12 18. Jan 2016 1 / 11 Themen der letzten Vorlesung Wiederholung aller bisherigen Themen: Datentypen und Variablen Operatoren Kontrollstrukturen

Mehr

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

Einführung in C++ Operatoren überladen (Klassen) Einführung in C++ Operatoren überladen (Klassen) Operatoren überladen Die Überladung von Operatoren ermöglicht es, vorhandene Operatoren (+,-,...) auch auf Objekte von Klassen anzuwenden. Die meisten der

Mehr

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

DAP2-Programmierpraktikum Einführung in C++ (Teil 2) DAP2-Programmierpraktikum Einführung in C++ (Teil 2) Carsten Gutwenger 18. April 2008 Lehrstuhl 11 Algorithm Engineering Fakultät für Informatik, TU Dortmund Überblick Dynamischer Speicher Klassen und

Mehr

Polymorphismus 179. Function.h. #include <string>

Polymorphismus 179. Function.h. #include <string> Polymorphismus 179 #include Function.h class Function { public: virtual ~Function() {}; virtual std::string get_name() const = 0; virtual double execute(double x) const = 0; }; // class Function

Mehr

1. Referenzdatentypen: Felder und Strings. Referenz- vs. einfache Datentypen. Rückblick: Einfache Datentypen (1) 4711 r

1. Referenzdatentypen: Felder und Strings. Referenz- vs. einfache Datentypen. Rückblick: Einfache Datentypen (1) 4711 r 1. Felder und Strings Eigenschaften von Referenzdatentypen 1. Referenzdatentypen: Felder und Strings Referenzdatentypen sind Konstrukte, mit deren Hilfe wir aus einfachen Datentypen neue eigene Typen erzeugen

Mehr

1. Referenzdatentypen: Felder und Strings

1. Referenzdatentypen: Felder und Strings 1. Felder und Strings Eigenschaften von Referenzdatentypen 1. Referenzdatentypen: Felder und Strings Referenzdatentypen sind Konstrukte, mit deren Hilfe wir aus einfachen Datentypen neue eigene Typen erzeugen

Mehr

Vorlesungsprüfung Programmiersprache 1

Vorlesungsprüfung Programmiersprache 1 Vorlesungsprüfung Programmiersprache 1 Termin der Prüfung: 1) Di 20.03.2018 16:15 17:00 HSB 3 2) Di 15.05.2018 16:15 17:00 HSB 3 3) Di 12.06.2018 16:15 17:00 HSB 3 Stoffgebiete: 1) Ganzzahltypen: char,

Mehr

4.2 Programmiersprache C

4.2 Programmiersprache C 4.2.1. Elementare Datentypen (signed) int, unsigned int, (signed) short (int), unsigned short (int), (signed) long (int), unsigned long (int) Elementare Datentypen für ganze Zahlen mit oder ohne Vorzeichen.

Mehr

Objektorientierte Programmierung mit C++ SS 2007

Objektorientierte Programmierung mit C++ SS 2007 Objektorientierte Programmierung mit C++ SS 2007 Andreas F. Borchert Universität Ulm 5. Juni 2007 Polymorphismus #include Function.h class Function { public: virtual ~Function() {}; virtual std::string

Mehr

Systemnahe Programmierung in C/C++

Systemnahe Programmierung in C/C++ Systemnahe Programmierung in C/C++ Peter Piehler peter.piehler@symetrion.com Lehrstuhl für Datenbanken und Informationssysteme Fakultät für Mathematik und Informatik 2006 12 13 Peter Piehler (DBIS) C/C++

Mehr

Grundlagen der Informatik

Grundlagen der Informatik Grundlagen der Informatik Musterklausur 1. Dynamische Datenstrukturen und objektorientierte Programmierung Zur Verwaltung einer digitalen Fotogalerie sollen Techniken der objektorientierten Programmierung

Mehr

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) Wintersemester 2005/06 Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich Informatik Lehrstuhl

Mehr

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java 1 / 27 Einstieg in die Informatik mit Java Klassen als Datenstrukturen Gerd Bohlender Institut für Angewandte und Numerische Mathematik Gliederung 2 / 27 1 Überblick: Klassen als Datenstruktur 2 Vereinbarung

Mehr

6 ZEIGER UND REFERENZEN - ALLGEMEINES

6 ZEIGER UND REFERENZEN - ALLGEMEINES 6 ZEIGER UND REFERENZEN - ALLGEMEINES Leitideen: Zeiger sind Adressen mit zusätzlicher Typinformation über das dort gespeicherte Objekt. Die Vereinbarungssyntax soll der Ausdruckssyntax entsprechen und

Mehr

Programmiertechnik. Teil 4. C++ Funktionen: Prototypen Overloading Parameter. C++ Funktionen: Eigenschaften

Programmiertechnik. Teil 4. C++ Funktionen: Prototypen Overloading Parameter. C++ Funktionen: Eigenschaften Programmiertechnik Teil 4 C++ Funktionen: Prototypen Overloading Parameter C++ Funktionen: Eigenschaften Funktionen (Unterprogramme, Prozeduren) fassen Folgen von Anweisungen zusammen, die immer wieder

Mehr

1 KLASSENKOMPONENTEN. Leitideen: Klassen sind aus Datenkomponenten und Komponentenfunktionen

1 KLASSENKOMPONENTEN. Leitideen: Klassen sind aus Datenkomponenten und Komponentenfunktionen 1 KLASSENKOMPONENTEN Leitideen: Klassen sind aus Datenkomponenten und Komponentenfunktionen zusammengesetzt. Die Komponentenfunktionen haben über eine Zeigervariable direkten Zugriff auf das Objekt. Die

Mehr

Implementieren von Klassen

Implementieren von Klassen Implementieren von Klassen Felder, Methoden, Konstanten Dr. Beatrice Amrhein Überblick Felder/Mitglieder (Field, Member, Member-Variable) o Modifizierer Konstanten Methoden o Modifizierer 2 Felder und

Mehr

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

Mapra: C++ Teil 6. Felix Gruber, Sven Groß. IGPM, RWTH Aachen. 13. Juni 2017 Mapra: C++ Teil 6 Felix Gruber, Sven Groß IGPM, RWTH Aachen 13. Juni 2017 Felix Gruber, Sven Groß (IGPM, RWTH Aachen) Mapra: C++ Teil 6 13. Juni 2017 1 / 22 Was bisher geschah Klassen I Attribute und Methoden

Mehr

C++ - Objektorientierte Programmierung Konstruktoren und Destruktoren

C++ - Objektorientierte Programmierung Konstruktoren und Destruktoren C++ - Objektorientierte Programmierung Konstruktoren und Destruktoren hat eine Kantenlänge hat eine Füllfarbe Kantenlänge setzen Füllfarbe lesen Volumen berechnen Leibniz Universität IT Services Anja Aue

Mehr

Polymorphismus 44. Function.hpp. #include <string>

Polymorphismus 44. Function.hpp. #include <string> Polymorphismus 44 #include Function.hpp class Function { public: virtual ~Function() {}; virtual const std::string& get_name() const = 0; virtual double execute(double x) const = 0; }; // class

Mehr

Teil 8: Dynamische Speicherverwaltung. Prof. Dr. Herbert Fischer Fachhochschule Deggendorf Prof. Dr. Manfred Beham Fachhochschule Amberg-Weiden

Teil 8: Dynamische Speicherverwaltung. Prof. Dr. Herbert Fischer Fachhochschule Deggendorf Prof. Dr. Manfred Beham Fachhochschule Amberg-Weiden Teil 8: Dynamische Speicherverwaltung Prof. Dr. Herbert Fischer Fachhochschule Deggendorf Prof. Dr. Manfred Beham Fachhochschule Amberg-Weiden Inhaltsverzeichnis 8 Dynamische Speicherverwaltung... 3 8.1

Mehr

F Zeiger, Felder und Strukturen in C

F Zeiger, Felder und Strukturen in C F Zeiger, Felder und Strukturen in C F Zeiger, Felder und Strukturen in C F.1 Zeiger(-Variablen) 1 Einordnung Konstante: Bezeichnung für einen Wert a 0110 0001 Variable: Bezeichnung eines Datenobjekts

Mehr

Ausdrücke (1) Grundlegende Eigenschaften

Ausdrücke (1) Grundlegende Eigenschaften Ausdrücke () Grundlegende Eigenschaften bestehen aus Literalen, Konstanten, Variablen und Operatoren einfachster Ausdruck ist das Semikolon, es bewirkt nichts. Ausdrücke werden mit einem Semikolon abgeschlossen.

Mehr

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

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf  Seite 1 von 29 Kapitel 12 Strings Seite 1 von 29 Konstante Zeichenfolgen - Zeichenfolgen, die in char-arrays abgelegt werden, werden C- String genannt. - Dies ist in der Programmiersprache C die einzige Möglichkeit Zeichenfolgen

Mehr

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

Institut für Programmierung und Reaktive Systeme. Java 2. Markus Reschke Java 2 Markus Reschke 07.10.2014 Datentypen Was wird gespeichert? Wie wird es gespeichert? Was kann man mit Werten eines Datentyps machen (Operationen, Methoden)? Welche Werte gehören zum Datentyp? Wie

Mehr

Programmieren II Abstrakte Klassen / Virtuelle Methoden. Programmieren II Abstrakte Klassen / Virtuelle Methoden

Programmieren II Abstrakte Klassen / Virtuelle Methoden. Programmieren II Abstrakte Klassen / Virtuelle Methoden Einleitende Bemerkungen Einleitende Bemerkungen Aspekte Aufbau von sinnvollen Klassenhierarchien Verwaltung von Objekten unterschiedlichen Typs Mitarbeiter Besonderheiten der Anwendung jeder Angehörige

Mehr

Mapra: C++ Teil 4. Felix Gruber. 6. Mai IGPM, RWTH Aachen. Felix Gruber (IGPM, RWTH Aachen) Mapra: C++ Teil 4 6.

Mapra: C++ Teil 4. Felix Gruber. 6. Mai IGPM, RWTH Aachen. Felix Gruber (IGPM, RWTH Aachen) Mapra: C++ Teil 4 6. Mapra: C++ Teil 4 Felix Gruber IGPM, RWTH Aachen 6. Mai 2015 Felix Gruber (IGPM, RWTH Aachen) Mapra: C++ Teil 4 6. Mai 2015 1 / 22 Themen vom letzten Mal Kompilieren mit Makefiles Ein-/Ausgabe über Dateien

Mehr

Felder. Gerd Bohlender. Einstieg in die Informatik mit Java, Vorlesung vom

Felder. Gerd Bohlender. Einstieg in die Informatik mit Java, Vorlesung vom Einstieg in die Informatik mit Java, Vorlesung vom 9.5.07 Übersicht 1 Was sind? 2 Vereinbarung von n 3 Erzeugen von n 4 Zugriff auf Feldkomponenten 5 Mehrdimensionale 6 als Objekte, Referenzen Kopieren

Mehr

Prüfung aus PROGRAMMIEREN (2) (C++) (WS 2002/03)

Prüfung aus PROGRAMMIEREN (2) (C++) (WS 2002/03) Fachhochschule München Bereich Datentechnik Fachbereich Elektrotechnik und Informationstechnik A. Irber / R. Thomas Prüfung aus PROGRAMMIEREN (2) (C++) (WS 2002/03) Arbeitszeit 90 Minuten 27.Januar 2003

Mehr

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

7 Funktionen. 7.1 Definition. Prototyp-Syntax: {Speicherklasse} {Typ} Name ({formale Parameter}); S. d. I.: Programieren in C Folie 7-1 7 Funktionen 7.1 Definition Prototyp-Syntax: Speicherklasse Typ Name (formale Parameter); der Funktions-Prototyp deklariert eine Funktion, d.h. er enthält noch nicht

Mehr

Repetitorium Programmieren I + II

Repetitorium Programmieren I + II Repetitorium Programmieren I + II Stephan Gimbel Johanna Mensik Michael Roth 6. März 2012 Agenda 1 Operatorüberladung 2 Pointer Zeigervariable 3 CopyConstructor 4 Listen 5 Array String 6 STL Container

Mehr

Kapitel 13. Definition von Klassen. OOP Thomas Klinker 1

Kapitel 13. Definition von Klassen. OOP Thomas Klinker 1 Kapitel 13 Definition von Klassen OOP Thomas Klinker 1 OOP Thomas Klinker 2 Datenabstraktion Der Mensch abstrahiert, um komplexe Sachverhalte darzustellen. Dinge und Vorgänge werden auf das wesentliche

Mehr

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

Thema heute: Vererbung und Klassenhierarchien. Abgeleitete Klassen. Vererbung von Daten und Funktionen. Virtuelle Funktionen 1 Thema heute: Vererbung und Klassenhierarchien Abgeleitete Klassen Vererbung von Daten und Funktionen Virtuelle Funktionen 2 Vererbung oft besitzen verschiedene Datentypen einen gemeinsamen Kern Beispiel:

Mehr

Repetitorium Programmieren I + II

Repetitorium Programmieren I + II Repetitorium Programmieren I + II Stephan Gimbel Johanna Mensik Michael Roth 6. März 2012 Agenda 1 Operatoren 2 Datentypen Gleitpunkt Zahl Typkonvertierung 3 Strommanipulatoren 4 Bedingungen if-else switch-case

Mehr

Programmieren 1 C Überblick

Programmieren 1 C Überblick Programmieren C Überblick. Einleitung 2. Graphische Darstellung von Algorithmen 3. Syntax und Semantik 4. Einstieg in C: Einfache Sprachkonstrukte und allgemeiner Programmaufbau 5. Skalare Standarddatentypen

Mehr

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

C++ Teil 9. Sven Groß. 17. Juni Sven Groß (IGPM, RWTH Aachen) C++ Teil Juni / 17 C++ Teil 9 Sven Groß 17. Juni 2016 Sven Groß (IGPM, RWTH Aachen) C++ Teil 9 17. Juni 2016 1 / 17 Themen der letzten Vorlesung Objektorientierung und Klassen Attribute / Datenelemente Methoden / Elementfunktionen

Mehr

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java Vorlesung vom 5.11.07, Weitere Ausdrücke Übersicht 1 Vergleichsoperatoren 2 Kombinierte Zuweisungsoperatoren 3 Logische Operatoren 4 Weitere Operatoren 5 Klassifizierung von Operatoren 6 Typumwandlungen

Mehr

Klassen. Kapitel Klassendeklaration

Klassen. Kapitel Klassendeklaration Kapitel 4 Klassen Wir kommen nun zu einem sehr wichtigen Aspekt der OOT: zu den Klassen. Eine Klasse ist eine vom Benutzer definierte Datenstruktur, eine Sammlung von Variablen (unterschiedlichen Typs)

Mehr

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

Überblick. 6. Konstruktor und Destruktor - obligatorische Elementfunktionen einer Klasse Ü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

Mehr

C-Programmierung: Ausdrücke und Operatoren#Division.2F

C-Programmierung: Ausdrücke und Operatoren#Division.2F C-Programmierung: Ausdrücke und Operatoren#Division.2F http://de.wikibooks.org/wiki/c-programmierung:_ausdrücke_und_operatoren#division_.2f This Book Is Generated By Wb2PDF using RenderX XEP, XML to PDF

Mehr

Vorkurs Informatik WiSe 16/17

Vorkurs Informatik WiSe 16/17 Java Ausdrücke und Variablen Dr. Werner Struckmann / Stephan Mielke, Jakob Garbe, 05.10.2016 Technische Universität Braunschweig, IPS Überblick Ausdrücke, Datentypen und Variablen Kontrollstrukturen 05.10.2016

Mehr

magnum C++ WALTER SAUMWEBER kompakt komplett kompetent

magnum C++ WALTER SAUMWEBER kompakt komplett kompetent magnum C++ WALTER SAUMWEBER kompakt komplett kompetent Quickview... 5 Liebe Leserin, lieber Leser... 13 Teil 1 Grundlagen... 15 1 Was ist Programmieren?... 17 1.1 Was ist eigentlich ein Computerprogramm?...

Mehr

Abend 4 Übung : Erweitern von Klassen durch Vererbung

Abend 4 Übung : Erweitern von Klassen durch Vererbung Abend 4 Übung : Erweitern von Klassen durch Vererbung Ziel, Inhalt Wir erweitern die Klassen, die wir zum Zeichnen mit TsuZeichnen verwenden. Dabei wenden wir die Vererbung an um die Klassen zu spezialisieren

Mehr

Kapitel 4. Programmierkurs. Datentypen. Arten von Datentypen. Datentypen und Operatoren Ganzzahlige Numerische Datentypen Logischer Datentyp

Kapitel 4. Programmierkurs. Datentypen. Arten von Datentypen. Datentypen und Operatoren Ganzzahlige Numerische Datentypen Logischer Datentyp Kapitel 4 Programmierkurs Birgit Engels, Anna Schulze Datentypen und Operatoren Ganzzahlige Numerische Datentypen Logischer Datentyp ZAIK Universität zu Köln WS 07/08 1 / 6 Datentypen Arten von Datentypen

Mehr

Datenkapselung: public / private

Datenkapselung: public / private 627 18. Klassen Klassen, Memberfunktionen, Konstruktoren, Stapel, verkettete Liste, dynamischer Speicher, Copy-Konstruktor, Zuweisungsoperator, Destruktor, Konzept Dynamischer Datentyp Datenkapselung:

Mehr

7.2 Dynamischer Speicher in Objekten/Kopierkonstruktor

7.2 Dynamischer Speicher in Objekten/Kopierkonstruktor 7.2 Dynamischer Speicher in Objekten/Kopierkonstruktor Das Programmbeispiel aus dem letzten Abschnitt läßt sich bisher nicht zufriedenstellend zu Ende bringen. Unerklärliche Abstürze und Fehlverhalten

Mehr

C++ Teil 5. Sven Groß. 12. Nov IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Nov / 16

C++ Teil 5. Sven Groß. 12. Nov IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Nov / 16 C++ Teil 5 Sven Groß IGPM, RWTH Aachen 12. Nov 2014 Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 12. Nov 2014 1 / 16 Themen der letzten Vorlesung Eingabestrom, Verhalten von cin Namensräume Live Programming

Mehr

11 Vererbung und Klassenhierarchie

11 Vererbung und Klassenhierarchie 11 Vererbung und Klassenhierarchie Bestandteile objektorientierter Programmierung: Bestehende Klassen können durch Spezialisierung und Erweiterung weiterentwickelt werden, ohne den Programmcode der alten

Mehr

17. Klassen. Überladen von Funktionen. Funktionsüberladung. Operator-Überladung (Operator Overloading) operatorop

17. Klassen. Überladen von Funktionen. Funktionsüberladung. Operator-Überladung (Operator Overloading) operatorop Überladen von Funktionen 17. Klassen Funktions- und Operatorüberladung, Datenkapselung, Klassen, Memberfunktionen, Konstruktoren Funktionen sind durch Ihren Namen im Gültigkeitsbereich ansprechbar Es ist

Mehr

C++ Teil 4. Sven Groß. 30. Apr IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Apr / 16

C++ Teil 4. Sven Groß. 30. Apr IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Apr / 16 C++ Teil 4 Sven Groß IGPM, RWTH Aachen 30. Apr 2015 Sven Groß (IGPM, RWTH Aachen) C++ Teil 4 30. Apr 2015 1 / 16 Themen der letzten Vorlesung Funktionen: Definition und Aufruf Wert- und Referenzparameter,

Mehr

Objektorientierte Programmierung mit C++

Objektorientierte Programmierung mit C++ 2. Neudefinition von globalen Operatoren // Beispiel: allocation trace void* operator new (std::size_t s, const char* info = 0) { if (info) printf("%s\n", info); // NOT cout

Mehr

Hello World! Eine Einführung in das Programmieren Variablen

Hello World! Eine Einführung in das Programmieren Variablen Hello World! Eine Einführung in das Programmieren Variablen Görschwin Fey Institute of Embedded Systems Hamburg University of Technology Slide 2 Wie werden Daten in Programmen gespeichert und manipuliert?

Mehr

Dynamische Datentypen. Destruktor, Copy-Konstruktor, Zuweisungsoperator, Dynamischer Datentyp, Vektoren

Dynamische Datentypen. Destruktor, Copy-Konstruktor, Zuweisungsoperator, Dynamischer Datentyp, Vektoren Dynamische Datentypen Destruktor, Copy-Konstruktor, Zuweisungsoperator, Dynamischer Datentyp, Vektoren Probleme mit Feldern (variabler Länge) man kann sie nicht direkt kopieren und zuweisen Probleme mit

Mehr

Programmieren in C+ Einführung in den Sprachstandard C++ Springer-Verlag Berlin Heidelberg New York London Paris Tokyo Hong Kong Barcelona Budapest

Programmieren in C+ Einführung in den Sprachstandard C++ Springer-Verlag Berlin Heidelberg New York London Paris Tokyo Hong Kong Barcelona Budapest Martin Schader Stefan Kuhlins Programmieren in C+ Einführung in den Sprachstandard C++ Zweite, verbesserte und erweiterte Auflage Mit 25 Abbildungen Springer-Verlag Berlin Heidelberg New York London Paris

Mehr

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

C++ Teil 10. Sven Groß. 17. Dez IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Dez / 14 C++ Teil 10 Sven Groß IGPM, RWTH Aachen 17. Dez 2014 Sven Groß (IGPM, RWTH Aachen) C++ Teil 10 17. Dez 2014 1 / 14 Themen der letzten Vorlesung Objektorientierung und Klassen Attribute / Datenelemente

Mehr

9 Programmieren von Klassen

9 Programmieren von Klassen 9 Programmieren von Klassen 9.1 Einführung Zentrales Konzept in der Objektorientierten Programmierung ist die Kapselung von Daten und Elementfunktionen, die sogenannte Encapsulation. In Objektorientierten

Mehr

C++ Teil 5. Sven Groß. 13. Mai Sven Groß (IGPM, RWTH Aachen) C++ Teil Mai / 18

C++ Teil 5. Sven Groß. 13. Mai Sven Groß (IGPM, RWTH Aachen) C++ Teil Mai / 18 C++ Teil 5 Sven Groß 13. Mai 2016 Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 13. Mai 2016 1 / 18 Themen der letzten Vorlesung Funktionen Funktionsüberladung, Signatur Rekursion const-deklaration Referenzen

Mehr

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

Einführung in die C++ Programmierung für Ingenieure Einführung in die C++ Programmierung für Ingenieure MATTHIAS WALTER / JENS KLUNKER Universität Rostock, Lehrstuhl für Modellierung und Simulation 14. November 2012 c 2012 UNIVERSITÄT ROSTOCK FACULTY OF

Mehr

Ausdrücke der Programmiersprache Java

Ausdrücke der Programmiersprache Java Ausdrücke der Programmiersprache Java Hamburg 1 Ablauf des Vortrags 01. Eigenschaften von Ausdrücken 02. Arithmetische Operatoren 03. Relationale Operatoren 04. Logische Operatoren 05. Bitweise Operatoren

Mehr

C++ - Objektorientierte Programmierung Konstante und statische Elemente

C++ - Objektorientierte Programmierung Konstante und statische Elemente C++ - Objektorientierte Programmierung Konstante und statische Elemente hat eine Kantenlänge hat eine Füllfarbe Kantenlänge setzen Füllfarbe lesen Volumen berechnen Leibniz Universität IT Services Anja

Mehr

Arrays. Einleitung. Deklarieren einer Array Variablen

Arrays. Einleitung. Deklarieren einer Array Variablen Arrays Einleitung bisher jede Variable einzeln deklariert: 12 3 14 12 32 32 3 32 5 3 double sum; int count; ÿ Sie können Zweck und Aufbau von Array-Datentypen erklären ÿ Sie können einen Array korrekt

Mehr

Wertebereich und Genauigkeit der Zahlendarstellung

Wertebereich und Genauigkeit der Zahlendarstellung Wertebereich und Genauigkeit der Zahlendarstellung Sowohl F als auch C kennen bei ganzen und Floating Point-Zahlen Datentypen verschiedener Genauigkeit. Bei ganzen Zahlen, die stets exakt dargestellt werden

Mehr

Programmierung und Angewandte Mathematik

Programmierung und Angewandte Mathematik Programmierung und Angewandte Mathematik C++ /Scilab Programmierung und Einführung in das Konzept der objektorientierten Anwendungen zu wissenschaftlichen Rechnens SS 2012 Ablauf Was sind Funktionen/Methoden

Mehr

Operatoren und Ausdrücke

Operatoren und Ausdrücke Informatik für Elektrotechnik und Informationstechnik Benedict Reuschling benedict.reuschling@h-da.de Hochschule Darmstadt Fachbereich Informatik WS 2013/14 Überblick 1 2 / 11 Motivation Es gibt eine Reihe

Mehr

Verwendung von Klassen in C++

Verwendung von Klassen in C++ Verwendung von Klassen in C++ Heute: Benutzerdefinierte Datentypen (Konkrete Klassen) Vektoren Komplexe Zahlen Adressdatei Morgen: Objektorientierte Programmierung (Abstrakte Klassen) Vererbung Polymorphie

Mehr

Klassen als Datenstrukturen

Klassen als Datenstrukturen Einstieg in die Informatik mit Java, Vorlesung vom 27.11.07 Übersicht 1 Klassen als Datenstruktur 2 Vereinbarung von Klassen 3 Erzeugen von Objekten - Instanzen einer Klasse 4 Zugriff auf Attribute 5 Initialisierung

Mehr

Programmierung und Angewandte Mathematik

Programmierung und Angewandte Mathematik Programmierung und Angewandte Mathematik C++ /Scilab Programmierung und Einführung in das Konzept der objektorientierten Anwendungen zu wissenschaftlichen Rechnens SS 2012 Inhalt Compiler/Editor Klassendeklaration

Mehr

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

Methoden. von Objekten definiert werden, Methoden,, Zugriffsmethoden und Read-Only Methoden Wie Konstruktoren und Destruktoren zum Auf- und Abbau von Objekten definiert werden, Wie inline-methoden Methoden,, Zugriffsmethoden und Read-Only Only- Methoden einzusetzen sind, Der this-pointer

Mehr