Datenkapselung: public / private

Größe: px
Ab Seite anzeigen:

Download "Datenkapselung: public / private"

Transkript

1 Klassen Klassen, Memberfunktionen, Konstruktoren, Stapel, verkettete Liste, dynamischer Speicher, Copy-Konstruktor, Zuweisungsoperator, Destruktor, Konzept Dynamischer Datentyp

2 Datenkapselung: public / private 628 class rational { int n; int d; // INV: d!= 0 ; Anwendungscode: rational r; r.n = 1; // error: n is private r.d = 2; // error: d is private int i = r.n; // error: n is private

3 Datenkapselung: public / private 628 class rational { int n; int d; // INV: d!= 0 ; Anwendungscode: rational r; r.n = 1; // error: n is private r.d = 2; // error: d is private int i = r.n; // error: n is private Gute Nachricht: r.d = 0 aus Versehen geht nicht mehr

4 Datenkapselung: public / private 628 class rational { int n; int d; // INV: d!= 0 ; Anwendungscode: rational r; r.n = 1; // error: n is private r.d = 2; // error: d is private int i = r.n; // error: n is private Gute Nachricht: r.d = 0 aus Versehen geht nicht mehr Schlechte Nachricht: Der Kunde kann nun gar nichts mehr machen...

5 Datenkapselung: public / private 628 class rational { int n; int d; // INV: d!= 0 ; Anwendungscode: rational r; r.n = 1; // error: n is private r.d = 2; // error: d is private int i = r.n; // error: n is private Gute Nachricht: r.d = 0 aus Versehen geht nicht mehr Schlechte Nachricht: Der Kunde kann nun gar nichts mehr machen und wir auch nicht (kein operator+,... )

6 629 Memberfunktionen: Deklaration class rational { public: // POST: return value is the numerator of this int numerator () const { return n; // POST: return value is the denominator of this int denominator () const { return d; private: int n; int d; // INV: d!= 0 ;

7 629 öffentlicher Bereich Memberfunktionen: Deklaration class rational { public: // POST: return value is the numerator of this int numerator () const { return n; // POST: return value is the denominator of this int denominator () const { return d; private: int n; int d; // INV: d!= 0 ;

8 629 öffentlicher Bereich Memberfunktionen: Deklaration class rational { public: // POST: return value is the numerator of this int numerator () const { return n; Memberfunktion // POST: return value is the denominator of this int denominator () const { return d; private: int n; int d; // INV: d!= 0 ;

9 629 öffentlicher Bereich Memberfunktionen: Deklaration class rational { public: // POST: return value is the numerator of this int numerator () const { Memberfunktion return n; // POST: return value is the denominator of this int denominator () const { Memberfunktionen haben return d; Zugriff auf private Daten private: int n; int d; // INV: d!= 0 ;

10 Memberfunktionen: Aufruf 630 // Definition des Typs class rational {... ;... // Variable des Typs rational r; Member-Zugriff int n = r.numerator(); // Zaehler int d = r.denominator(); // Nenner

11 Memberfunktionen: Definition 631 // POST: returns numerator of *this int numerator () const { return n;

12 Memberfunktionen: Definition??? 631 // POST: returns numerator of *this int numerator () const { return n;

13 Memberfunktionen: Definition 631 // POST: returns numerator of *this int numerator () const { return n; r.numerator() Eine Memberfunktion wird für einen Ausdruck der Klasse aufgerufen.

14 Memberfunktionen: Definition 631 // POST: returns numerator of *this int numerator () const { return n; r.numerator() Eine Memberfunktion wird für einen Ausdruck der Klasse aufgerufen. In der Funktion: *this ist der Name dieses impliziten Arguments.

15 Memberfunktionen: Definition 631 // POST: returns numerator of *this int numerator () const { return n; r.numerator() Eine Memberfunktion wird für einen Ausdruck der Klasse aufgerufen. In der Funktion: *this ist der Name dieses impliziten Arguments. Das const bezieht sich auf *this

16 Memberfunktionen: Definition 631 // POST: returns numerator of *this int numerator () const { return n; r.numerator() Eine Memberfunktion wird für einen Ausdruck der Klasse aufgerufen. In der Funktion: *this ist der Name dieses impliziten Arguments. Das const bezieht sich auf *this n ist Abkürzung für (*this).n

17 This rational vs. dieser Bruch 632 class rational { int n;... ; int numerator () const { return.n; rational r;... std::cout << r.numerator();

18 This rational vs. dieser Bruch 632 class rational { int n;... ; int numerator () const { return (*this).n; rational r;... std::cout << r.numerator();

19 632 This rational vs. dieser Bruch So würde es aussehen... class rational { int n;... ; int numerator () const { return (*this).n; rational r;... std::cout << r.numerator();

20 632 This rational vs. dieser Bruch So würde es aussehen... class rational { int n;... ; int numerator () const { return (*this).n;... ohne Memberfunktionen struct bruch { int n;... ; int numerator (const bruch dieser) { return ( dieser).n; rational r;... std::cout << r.numerator(); bruch r;.. std::cout << numerator(&r);

21 Member-Definition: In-Class 633 class rational { int n;... ; int numerator () const { return n;... Keine Trennung zwischen Deklaration und Definition (schlecht für Bibliotheken)

22 Member-Definition: In-Class vs. Out-of-Class 633 class rational { int n;... class rational { int n;... ; int numerator () const { return n;... Keine Trennung zwischen Deklaration und Definition (schlecht für Bibliotheken) ; int numerator () const;... int rational::numerator () const { return n; So geht s auch.

23 Initialisierung? Konstruktoren! 635 class rational { public: rational ( int num, int den) : n (num), d (den) { assert (den!= 0);... ;... rational r (2,3); // r = 2/3

24 Initialisierung? Konstruktoren! 635 class rational { public: rational ( int num, int den) : n (num), d (den) { assert (den!= 0);... ;... rational r (2,3); // r = 2/3 Initialisierung der Membervariablen Funktionsrumpf.

25 Initialisierung rational = int? 637 class rational { public: rational ( int num) : n (num), d (1) {... ;... rational r (2); // Explizite Initialisierung mit 2 rational s = 2; // Implizite Konversion

26 Initialisierung rational = int? 637 class rational { public: rational ( int num) : n (num), d (1) { Leerer Funktionsrumpf... ;... rational r (2); // Explizite Initialisierung mit 2 rational s = 2; // Implizite Konversion

27 Der Default-Konstruktor 639 class rational { public: Leere Argumentliste... rational () : n (0), d (1) {... ;... rational r; // r = 0

28 Der Default-Konstruktor 639 class rational { public: Leere Argumentliste... rational () : n (0), d (1) {... ;... rational r; // r = 0 Es gibt keine uninitialisierten Variablen vom Typ rational mehr!

29 RAT PACK R Reloaded Kundenprogramm sieht nun so aus: // POST: double approximation of r double to_double (const rational r) { double result = r.numerator(); return result / r.denominator();

30 RAT PACK R Reloaded Kundenprogramm sieht nun so aus: // POST: double approximation of r double to_double (const rational r) { double result = r.numerator(); return result / r.denominator(); Wir können die Memberfunktionen zusammen mit der Repräsentation anpassen.

31 RAT PACK R Reloaded vorher class rational {... private: int n; int d; ;

32 RAT PACK R Reloaded vorher class rational {... private: int n; int d; ; int numerator () const { return n;

33 RAT PACK R Reloaded vorher class rational {... private: int n; int d; ; int numerator () const { return n; nachher class rational {... private: unsigned int n; unsigned int d; bool is_positive; ;

34 RAT PACK R Reloaded... vorher class rational {... private: int n; int d; ; int numerator () const { return n; nachher class rational {... private: unsigned int n; unsigned int d; bool is_positive; ; int numerator () const{ if (is_positive) return n; else { int result = n; return result; 642

35 RAT PACK R Reloaded? 643 class rational {... private: unsigned int n; unsigned int d; bool is_positive; ; int numerator () const { if (is_positive) return n; else { int result = n; return result;

36 RAT PACK R Reloaded? 643 class rational {... private: unsigned int n; unsigned int d; bool is_positive; ; int numerator () const { if (is_positive) return n; else { int result = n; return result; Wertebereich von Zähler und Nenner wieder wie vorher

37 643 RAT PACK R Reloaded? class rational {... private: unsigned int n; unsigned int d; bool is_positive; ; int numerator () const { if (is_positive) return n; else { int result = n; return result; Wertebereich von Zähler und Nenner wieder wie vorher Dazu noch möglicher Überlauf

38 Datenkapselung noch unvollständig 644 Die Sicht des Kunden (rational.h): class rational { public: // POST: returns numerator of this int numerator () const;... private: // none of my business ;

39 Datenkapselung noch unvollständig 644 Die Sicht des Kunden (rational.h): class rational { public: // POST: returns numerator of this int numerator () const;... private: // none of my business ; Wir legen uns auf Zähler-/Nennertyp int fest.

40 Datenkapselung noch unvollständig Die Sicht des Kunden (rational.h): class rational { public: // POST: returns numerator of this int numerator () const;... private: // none of my business ; Wir legen uns auf Zähler-/Nennertyp int fest. Lösung: Nicht nur Daten, auch Typen kapseln (Handout). 644

41 Motivation: Stapel 648

42 Motivation: Stapel

43 Motivation: Stapel push(4)

44 Motivation: Stapel push(4) pop()

45 Motivation: Stapel push(4) pop() pop() 5 1 2

46 Motivation: Stapel push(4) pop() pop() push(1)

47 Motivation: Stapel push(4) pop() pop() push(1) top() 3

48 Motivation: Stapel ( push, pop, top, empty ) push(4) pop() pop() push(1) top() empty() false

49 Motivation: Stapel ( push, pop, top, empty ) push(4) pop() pop() push(1) top() empty() false Ziel: Bau einer Stapel-Klasse!

50 Motivation: Stapel ( push, pop, top, empty ) push(4) pop() pop() push(1) top() empty() false Ziel: Bau einer Stapel-Klasse! Frage: wie schaffen wir bei push neuen Platz auf dem Stapel?

51 Wir brauchen einen neuen Container! 650 Unser Haupt-Container bisher: Array (T[])

52 Wir brauchen einen neuen Container! 650 Unser Haupt-Container bisher: Array (T[]) Zusammenhängender Speicherbereich, wahlfreier Zugriff (auf i-tes Element)

53 Wir brauchen einen neuen Container! 650 Unser Haupt-Container bisher: Array (T[]) Zusammenhängender Speicherbereich, wahlfreier Zugriff (auf i-tes Element) Simulation eines Stapels durch ein Array? top

54 Wir brauchen einen neuen Container! 650 Unser Haupt-Container bisher: Array (T[]) Zusammenhängender Speicherbereich, wahlfreier Zugriff (auf i-tes Element) Simulation eines Stapels durch ein Array? Nein, irgendwann ist das Array voll. top Hier kein push(3) möglich!

55 Arrays können wirklich nicht alles Einfügen oder Löschen von Elementen in der Mitte ist aufwändig Wollen wir hier einfügen, müssen wir alles rechts davon verschieben (falls da überhaupt noch Platz ist!)

56 Arrays können wirklich nicht alles Einfügen oder Löschen von Elementen in der Mitte ist aufwändig Wollen wir hier einfügen, müssen wir alles rechts davon verschieben (falls da überhaupt noch Platz ist!)

57 Arrays können wirklich nicht alles Einfügen oder Löschen von Elementen in der Mitte ist aufwändig Wollen wir hier einfügen, müssen wir alles rechts davon verschieben (falls da überhaupt noch Platz ist!)

58 Arrays können wirklich nicht alles Einfügen oder Löschen von Elementen in der Mitte ist aufwändig Wollen wir hier löschen, müssen wir alles rechts davon verschieben

59 Arrays können wirklich nicht alles Einfügen oder Löschen von Elementen in der Mitte ist aufwändig Wollen wir hier löschen, müssen wir alles rechts davon verschieben

60 Arrays können wirklich nicht alles Einfügen oder Löschen von Elementen in der Mitte ist aufwändig Wollen wir hier löschen, müssen wir alles rechts davon verschieben

61 653 Der neue Container: Verkettete Liste Kein zusammenhängender Speicherbereich und kein wahlfreier Zugriff

62 653 Der neue Container: Verkettete Liste Kein zusammenhängender Speicherbereich und kein wahlfreier Zugriff Jedes Element kennt seinen Nachfolger

63 653 Der neue Container: Verkettete Liste Kein zusammenhängender Speicherbereich und kein wahlfreier Zugriff Jedes Element kennt seinen Nachfolger Zeiger

64 653 Der neue Container: Verkettete Liste Kein zusammenhängender Speicherbereich und kein wahlfreier Zugriff Jedes Element kennt seinen Nachfolger Einfügen und Löschen beliebiger Elemente ist einfach, auch am Anfang der Liste Zeiger

65 653 Der neue Container: Verkettete Liste Kein zusammenhängender Speicherbereich und kein wahlfreier Zugriff Jedes Element kennt seinen Nachfolger Einfügen und Löschen beliebiger Elemente ist einfach, auch am Anfang der Liste Ein Stapel kann als verkettete Liste realisiert werden Zeiger

66 Verkettete Liste: Zoom

67 Verkettete Liste: Zoom 654 Element (Typ struct list_node) 1 5 6

68 Verkettete Liste: Zoom 654 Element (Typ struct list_node) key (Typ int)

69 Verkettete Liste: Zoom 654 Element (Typ struct list_node) key (Typ int) next (Typ list_node*)

70 Verkettete Liste: Zoom 654 Element (Typ struct list_node) key (Typ int) next (Typ list_node*) struct list_node { int key; list_node next; // constructor list_node (int k, list_node n) : key (k), next (n) { ;

71 Stapel = Zeiger aufs oberste Element 655 Element (Typ struct list_node) key (Typ int) next (Typ list_node*) class stack { public: void push (int value) { private: list_node top_node; ;

72 Sneak Preview: push(4) 656 void push (int value) { top_node = new list_node (value, top_node); top_node 1 5 6

73 Sneak Preview: push(4) 656 void push (int value) { top_node = new list_node (value, top_node); top_node 1 5 6

74 Sneak Preview: push(4) 656 void push (int value) { top_node = new list_node (value, top_node); top_node

75 Sneak Preview: push(4) 656 void push (int value) { top_node = new list_node (value, top_node); top_node

76 Der new-ausdruck 658 zugrundeliegender Typ new T (...) Typ T* new-operator Konstruktor-Argumente

77 Der new-ausdruck 658 zugrundeliegender Typ new T (...) Typ T* new-operator Konstruktor-Argumente Effekt: Neues Objekt vom Typ T wird im Speicher angelegt...

78 658 Der new-ausdruck zugrundeliegender Typ new T (...) Typ T* new-operator Konstruktor-Argumente Effekt: Neues Objekt vom Typ T wird im Speicher angelegt und mit Hilfe des passenden Konstruktors initialisiert.

79 658 Der new-ausdruck zugrundeliegender Typ new T (...) Typ T* new-operator Konstruktor-Argumente Effekt: Neues Objekt vom Typ T wird im Speicher angelegt und mit Hilfe des passenden Konstruktors initialisiert. Wert: Adresse des neuen Objekts

80 Der new-ausdruck: push(4) 660 top_node = new list_node (value, top_node); top_node 1 5 6

81 Der new-ausdruck: push(4) 660 Effekt: Neues Objekt vom Typ T wird im Speicher angelegt... top_node = new list_node (value, top_node); top_node 1 5 6

82 Der new-ausdruck: push(4) 660 Effekt: Neues Objekt vom Typ T wird im Speicher angelegt und mit Hilfe des passenden Konstruktors initialisiert. top_node = new list_node (value, top_node); top_node

83 Der new-ausdruck: push(4) 660 Effekt: Neues Objekt vom Typ T wird im Speicher angelegt und mit Hilfe des passenden Konstruktors initialisiert. Wert: Adresse des neuen Objekts top_node = new list_node (value, top_node); top_node

84 Der delete-ausdruck 661 Objekte, die mit new erzeugt worden sind, haben dynamische Speicherdauer: sie leben, bis sie explizit gelöscht werden.

85 Der delete-ausdruck 661 Objekte, die mit new erzeugt worden sind, haben dynamische Speicherdauer: sie leben, bis sie explizit gelöscht werden. delete expr Typ void delete-operator Zeiger vom Typ T*, der auf ein vorher mit new erzeugtes Objekt zeigt

86 Der delete-ausdruck 661 Objekte, die mit new erzeugt worden sind, haben dynamische Speicherdauer: sie leben, bis sie explizit gelöscht werden. delete expr Typ void delete-operator Zeiger vom Typ T*, der auf ein vorher mit new erzeugtes Objekt zeigt Effekt: Objekt wird gelöscht, Speicher wird wieder freigegeben

87 Wer geboren wird, muss sterben Richtlinie Dynamischer Speicher Zu jedem new gibt es ein passendes delete!

88 Wer geboren wird, muss sterben Richtlinie Dynamischer Speicher Zu jedem new gibt es ein passendes delete! Nichtbeachtung führt zu Speicherlecks:

89 Wer geboren wird, muss sterben Richtlinie Dynamischer Speicher Zu jedem new gibt es ein passendes delete! Nichtbeachtung führt zu Speicherlecks: Alte Objekte, die den Speicher blockieren...

90 664 Wer geboren wird, muss sterben... Richtlinie Dynamischer Speicher Zu jedem new gibt es ein passendes delete! Nichtbeachtung führt zu Speicherlecks: Alte Objekte, die den Speicher blockieren bis er irgendwann voll ist (heap overflow)

91 Weiter mit dem Stapel: pop() 665 void pop() { assert (!empty()); list_node* p = top_node; top_node = top_node->next; delete p; top_node 1 5 6

92 Weiter mit dem Stapel: pop() void pop() { assert (!empty()); list_node* p = top_node; top_node = top_node->next; delete p; top_node p

93 Weiter mit dem Stapel: pop() void pop() { assert (!empty()); list_node* p = top_node; top_node = top_node->next; delete p; top_node p

94 Weiter mit dem Stapel: pop() void pop() { assert (!empty()); list_node* p = top_node; top_node = top_node->next; delete p; Abkürzung für (*top_node).next top_node p

95 Weiter mit dem Stapel: pop() void pop() { assert (!empty()); list_node* p = top_node; top_node = top_node->next; delete p; top_node p

96 Stapel traversieren: print() void print (std::ostream& o) const { const list_node* p = top_node; while (p!= 0) { o << p->key << " "; p = p->next; top_node

97 Stapel traversieren: print() void print (std::ostream& o) const { const list_node* p = top_node; while (p!= 0) { o << p->key << " "; p = p->next; top_node p

98 Stapel traversieren: print() void print (std::ostream& o) const { const list_node* p = top_node; while (p!= 0) { o << p->key << " "; // 1 p = p->next; top_node p

99 Stapel traversieren: print() void print (std::ostream& o) const { const list_node* p = top_node; while (p!= 0) { o << p->key << " "; // 1 p = p->next; top_node p

100 Stapel traversieren: print() void print (std::ostream& o) const { const list_node* p = top_node; while (p!= 0) { o << p->key << " "; // 1 5 p = p->next; top_node p

101 Stapel traversieren: print() void print (std::ostream& o) const { const list_node* p = top_node; while (p!= 0) { o << p->key << " "; // 1 5 p = p->next; top_node p

102 Stapel traversieren: print() void print (std::ostream& o) const { const list_node* p = top_node; while (p!= 0) { o << p->key << " "; // p = p->next; top_node p

103 Stapel traversieren: print() void print (std::ostream& o) const { const list_node* p = top_node; while (p!= 0) { o << p->key << " "; // p = p->next; top_node p

104 667 Stapel ausgeben: class stack { public: void push (int value) { void print (std::ostream& o) const {... private: list_node top_node; ; operator<<

105 667 Stapel ausgeben: class stack { public: void push (int value) { void print (std::ostream& o) const {... private: list_node top_node; ; operator<< // POST: s is written to o std::ostream& operator<< (std::ostream& o, const stack& s) { s.print (o); return o;

106 Leerer Stapel 668 stack() // default constructor : top_node (0) {

107 Leerer Stapel, empty() 668 stack() // default constructor : top_node (0) { bool empty () const { return top_node == 0;

108 Leerer Stapel, empty(), top() 668 stack() // default constructor : top_node (0) { bool empty () const { return top_node == 0; int top () const { assert (!empty()); return top_node >key;

109 Stapel fertig? 669 stack s1; s1.push (1); s1.push (3); s1.push (2); std::cout << s1 << "\n"; stack s2 = s1; std::cout << s2 << "\n"; s1.pop (); std::cout << s1 << "\n"; s2.pop ();

110 Stapel fertig? 669 stack s1; s1.push (1); s1.push (3); s1.push (2); std::cout << s1 << "\n"; stack s2 = s1; std::cout << s2 << "\n"; s1.pop (); std::cout << s1 << "\n"; s2.pop ();

111 Stapel fertig? 669 stack s1; s1.push (1); s1.push (3); s1.push (2); std::cout << s1 << "\n"; stack s2 = s1; std::cout << s2 << "\n"; s1.pop (); std::cout << s1 << "\n"; s2.pop ();

112 Stapel fertig? 669 stack s1; s1.push (1); s1.push (3); s1.push (2); std::cout << s1 << "\n"; stack s2 = s1; std::cout << s2 << "\n"; s1.pop (); std::cout << s1 << "\n"; s2.pop ();

113 Stapel fertig? 669 stack s1; s1.push (1); s1.push (3); s1.push (2); std::cout << s1 << "\n"; // stack s2 = s1; std::cout << s2 << "\n"; s1.pop (); std::cout << s1 << "\n"; s2.pop ();

114 Stapel fertig? 669 stack s1; s1.push (1); s1.push (3); s1.push (2); std::cout << s1 << "\n"; // stack s2 = s1; std::cout << s2 << "\n"; s1.pop (); std::cout << s1 << "\n"; s2.pop ();

115 Stapel fertig? 669 stack s1; s1.push (1); s1.push (3); s1.push (2); std::cout << s1 << "\n"; // stack s2 = s1; std::cout << s2 << "\n"; // s1.pop (); std::cout << s1 << "\n"; s2.pop ();

116 Stapel fertig? 669 stack s1; s1.push (1); s1.push (3); s1.push (2); std::cout << s1 << "\n"; // stack s2 = s1; std::cout << s2 << "\n"; // s1.pop (); std::cout << s1 << "\n"; s2.pop ();

117 Stapel fertig? 669 stack s1; s1.push (1); s1.push (3); s1.push (2); std::cout << s1 << "\n"; // stack s2 = s1; std::cout << s2 << "\n"; // s1.pop (); std::cout << s1 << "\n"; // 3 1 s2.pop ();

118 Stapel fertig? 669 stack s1; s1.push (1); s1.push (3); s1.push (2); std::cout << s1 << "\n"; // stack s2 = s1; std::cout << s2 << "\n"; // s1.pop (); std::cout << s1 << "\n"; // 3 1 s2.pop ();

119 Stapel fertig? 669 stack s1; s1.push (1); s1.push (3); s1.push (2); std::cout << s1 << "\n"; // stack s2 = s1; std::cout << s2 << "\n"; // s1.pop (); std::cout << s1 << "\n"; // 3 1 s2.pop (); // Oops, Programmabsturz!

120 Stapel fertig? Offenbar noch nicht stack s1; s1.push (1); s1.push (3); s1.push (2); std::cout << s1 << "\n"; // stack s2 = s1; std::cout << s2 << "\n"; // s1.pop (); std::cout << s1 << "\n"; // 3 1 s2.pop (); // Oops, Programmabsturz!

121 Was ist hier schiefgegangen? 670 s stack s2 = s1; std::cout << s2 << "\n"; s1.pop (); std::cout << s1 << "\n"; s2.pop ();

122 Was ist hier schiefgegangen? 670 s s2 Memberweise Initialisierung:... nur den top_node-zeiger stack s2 = s1; std::cout << s2 << "\n"; kopiert s1.pop (); std::cout << s1 << "\n"; s2.pop ();

123 Was ist hier schiefgegangen? 670 s1 s stack s2 = s1; std::cout << s2 << "\n"; // s1.pop (); std::cout << s1 << "\n"; s2.pop ();

124 Was ist hier schiefgegangen? 670 s1 s stack s2 = s1; std::cout << s2 << "\n"; // s1.pop (); std::cout << s1 << "\n"; s2.pop ();

125 Was ist hier schiefgegangen? 670 s1 s stack s2 = s1; std::cout << s2 << "\n"; // s1.pop (); std::cout << s1 << "\n"; // 3 1 s2.pop ();

126 670 Was ist hier schiefgegangen? s1 s Zeiger auf Leiche!... stack s2 = s1; std::cout << s2 << "\n"; // s1.pop (); std::cout << s1 << "\n"; // 3 1 s2.pop ();

127 670 Was ist hier schiefgegangen? s1 s Zeiger auf Leiche!... stack s2 = s1; std::cout << s2 << "\n"; // s1.pop (); std::cout << s1 << "\n"; // 3 1 s2.pop (); // Oops, Programmabsturz!

128 Wir brauchen eine echte Kopie! 671 s stack s2 = s1; std::cout << s2 << "\n"; s1.pop (); std::cout << s1 << "\n"; s2.pop ();

129 Wir brauchen eine echte Kopie! 671 s s stack s2 = s1; std::cout << s2 << "\n"; s1.pop (); std::cout << s1 << "\n"; s2.pop ();

130 Wir brauchen eine echte Kopie! 671 s s stack s2 = s1; std::cout << s2 << "\n"; // s1.pop (); std::cout << s1 << "\n"; s2.pop ();

131 Wir brauchen eine echte Kopie! 671 s s stack s2 = s1; std::cout << s2 << "\n"; // s1.pop (); std::cout << s1 << "\n"; s2.pop ();

132 Wir brauchen eine echte Kopie! 671 s s stack s2 = s1; std::cout << s2 << "\n"; // s1.pop (); std::cout << s1 << "\n"; // 3 1 s2.pop ();

133 Wir brauchen eine echte Kopie! 671 s s stack s2 = s1; std::cout << s2 << "\n"; // s1.pop (); std::cout << s1 << "\n"; // 3 1 s2.pop ();

134 Wir brauchen eine echte Kopie! 671 s s stack s2 = s1; std::cout << s2 << "\n"; // s1.pop (); std::cout << s1 << "\n"; // 3 1 s2.pop (); // ok

135 673 Mit dem Copy-Konstruktor klappt s! Hier wird eine Kopierfunktion des list_node benutzt: // POST: this is initialized with a copy of s stack (const stack& s) : top_node (0) { if (s.top_node!= 0) top_node = s.top_node->copy(); s *this

136 673 Mit dem Copy-Konstruktor klappt s! Hier wird eine Kopierfunktion des list_node benutzt: // POST: this is initialized with a copy of s stack (const stack& s) : top_node (0) { if (s.top_node!= 0) top_node = s.top_node->copy(); s *this 2 3 1

137 Die (rekursive) Kopierfunktion von list node 674 // POST: pointer to a copy of the list starting // at this is returned list_node copy () const { if (next!= 0) return new list_node (key, next->copy()); else return new list_node (key, 0); *this (list_node) 2 3 1

138 Die (rekursive) Kopierfunktion von list node 674 // POST: pointer to a copy of the list starting // at this is returned list_node copy () const { if (next!= 0) return new list_node (key, next->copy()); else return new list_node (key, 0); *this (list_node)

139 Die (rekursive) Kopierfunktion von list node 674 // POST: pointer to a copy of the list starting // at this is returned list_node copy () const { if (next!= 0) return new list_node (key, next->copy()); else return new list_node (key, 0); *this (list_node)

140 Initialisierung Zuweisung! 675 stack s1; s1.push (1); s1.push (3); s1.push (2); std::cout << s1 << "\n"; // stack s2 = s1; // Initialisierung s1.pop (); std::cout << s1 << "\n"; // 3 1 s2.pop (); // ok: Copy-Konstruktor!

141 Initialisierung Zuweisung! 675 stack s1; s1.push (1); s1.push (3); s1.push (2); std::cout << s1 << "\n"; // stack s2; s2 = s1; // Zuweisung s1.pop (); std::cout << s1 << "\n"; // 3 1 s2.pop (); // Oops, Programmabsturz!

142 677 Mit dem Zuweisungsoperator klappt s! Hier wird eine Aufräumfunktion des list_node benutzt: // POST: this (left operand) is getting a copy of s (right operand) stack& operator= (const stack& s) { if (top_node!= s.top_node) { // keine Selbtszuweisung! if (top_node!= 0) { top_node->clear(); // loesche Knoten in this top_node = 0; if (s.top_node!= 0) top_node = s.top_node->copy(); // kopiere s nach this return *this; // Rueckgabe als L Wert (Konvention)

143 677 Mit dem Zuweisungsoperator klappt s! Hier wird eine Aufräumfunktion des list_node benutzt: // POST: this (left operand) is getting a copy of s (right operand) stack& operator= (const stack& s) { if (top_node!= s.top_node) { // keine Selbtszuweisung! if (top_node!= 0) { top_node->clear(); // loesche Knoten in this top_node = 0; if (s.top_node!= 0) top_node = s.top_node->copy(); // kopiere s nach this return *this; // Rueckgabe als L Wert (Konvention)

144 677 Mit dem Zuweisungsoperator klappt s! Hier wird eine Aufräumfunktion des list_node benutzt: // POST: this (left operand) is getting a copy of s (right operand) stack& operator= (const stack& s) { if (top_node!= s.top_node) { // keine Selbtszuweisung! if (top_node!= 0) { top_node->clear(); // loesche Knoten in this top_node = 0; if (s.top_node!= 0) top_node = s.top_node->copy(); // kopiere s nach this return *this; // Rueckgabe als L Wert (Konvention)

145 677 Mit dem Zuweisungsoperator klappt s! Hier wird eine Aufräumfunktion des list_node benutzt: // POST: this (left operand) is getting a copy of s (right operand) stack& operator= (const stack& s) { if (top_node!= s.top_node) { // keine Selbtszuweisung! if (top_node!= 0) { top_node->clear(); // loesche Knoten in this top_node = 0; if (s.top_node!= 0) top_node = s.top_node->copy(); // kopiere s nach this return *this; // Rueckgabe als L Wert (Konvention)

146 677 Mit dem Zuweisungsoperator klappt s! Hier wird eine Aufräumfunktion des list_node benutzt: // POST: this (left operand) is getting a copy of s (right operand) stack& operator= (const stack& s) { if (top_node!= s.top_node) { // keine Selbtszuweisung! if (top_node!= 0) { top_node->clear(); // loesche Knoten in this top_node = 0; if (s.top_node!= 0) top_node = s.top_node->copy(); // kopiere s nach this return *this; // Rueckgabe als L Wert (Konvention)

147 Die (rekursive) Aufräumfunktion des list node 678 // POST: the list starting at this is deleted void clear () { if (next!= 0) next->clear(); delete this; *this 2 3 1

148 Die (rekursive) Aufräumfunktion des list node 678 // POST: the list starting at this is deleted void clear () { if (next!= 0) next->clear(); delete this; *this 2 3 1

149 Die (rekursive) Aufräumfunktion des list node 678 // POST: the list starting at this is deleted void clear () { if (next!= 0) next->clear(); delete this; *this 2 3 1

150 Zombie-Elemente 679 { stack s1; // local variable s1.push (1); s1.push (3); s1.push (2); std::cout << s1 << "\n"; // // s1 has died (become invalid)...

151 Zombie-Elemente 679 { stack s1; // local variable s1.push (1); s1.push (3); s1.push (2); std::cout << s1 << "\n"; // // s1 has died (become invalid) aber die drei Elemente des Stapels s1 leben weiter (Speicherleck)!

152 Zombie-Elemente 679 { stack s1; // local variable s1.push (1); s1.push (3); s1.push (2); std::cout << s1 << "\n"; // // s1 has died (become invalid) aber die drei Elemente des Stapels s1 leben weiter (Speicherleck)! Sie sollten zusammen mit s1 aufgeräumt werden!

153 Mit dem Destruktor klappt s! 681 // POST: the dynamic memory of this is deleted ~stack() { if (top_node!= 0) top_node >clear();

154 Mit dem Destruktor klappt s! 681 // POST: the dynamic memory of this is deleted ~stack() { if (top_node!= 0) top_node >clear(); löscht automatisch alle Stapelemente, wenn der Stapel ungültig wird

155 681 Mit dem Destruktor klappt s! // POST: the dynamic memory of this is deleted ~stack() { if (top_node!= 0) top_node >clear(); löscht automatisch alle Stapelemente, wenn der Stapel ungültig wird Unsere Stapel-Klasse befolgt jetzt die Richtlinie Dynamischer Speicher!

156 Dynamischer Datentyp 682 Typ, der dynamischen Speicher verwaltet (z.b. unsere Klasse für Stapel)

157 Dynamischer Datentyp 682 Typ, der dynamischen Speicher verwaltet (z.b. unsere Klasse für Stapel) Andere Anwendungen: Listen (mit Einfügen und Löschen in der Mitte ) Bäume (nächste Woche) Warteschlangen Graphen

158 Dynamischer Datentyp 682 Typ, der dynamischen Speicher verwaltet (z.b. unsere Klasse für Stapel) Mindestfunktionalität: Konstruktoren Destruktor Copy-Konstruktor Zuweisungsoperator Dreierregel: definiert eine Klasse eines davon, so sollte sie auch die anderen zwei definieren!

Datenkapselung: public / private class rational { r.d = 0 int n; int d; // INV: d!= Klassen rational r; r.n = 1; // error: n is private

Datenkapselung: public / private class rational { r.d = 0 int n; int d; // INV: d!= Klassen rational r; r.n = 1; // error: n is private Datenkapselung: public / private 7. Klassen Klassen, Memberfunktionen, Konstruktoren, Stapel, verkettete Liste, dynamischer Speicher, Copy-Konstruktor, Zuweisungsoperator, Destruktor, Konzept Dynamischer

Mehr

Datenkapselung: public / private

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

Mehr

Datenkapselung: public / private r.d = 0 class rational { int n; int d; // INV: d!= Klassen rational r; r.n = 1; // error: n is private

Datenkapselung: public / private r.d = 0 class rational { int n; int d; // INV: d!= Klassen rational r; r.n = 1; // error: n is private Datenkapselung: public / private 9. Klassen Klassen, Memberfunktionen, Konstruktoren, Stapel, verkettete Liste, dynamischer Speicher, Copy-Konstruktor, Zuweisungsoperator, Destruktor, Konzept Dynamischer

Mehr

17. Klassen. Datenkapselung, Klassen, Memberfunktionen, Konstruktoren

17. Klassen. Datenkapselung, Klassen, Memberfunktionen, Konstruktoren 556 17. Klassen Datenkapselung, Klassen, Memberfunktionen, Konstruktoren Ein neuer Typ mit Funktionalität... 557 struct rational { int n; int d; // INV: d!= 0 // POST: return value is the sum of a and

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

21. Dynamische Datentypen und Speicherverwaltung

21. Dynamische Datentypen und Speicherverwaltung Problem 21. Dynamische Datentypen und Speicherverwaltung Letzte Woche: Dynamischer Datentyp Haben im Vektor dynamischen Speicher angelegt, aber nicht wieder freigegeben. Insbesondere: keine Funktionen

Mehr

16. Dynamische Datenstrukturen

16. Dynamische Datenstrukturen Datenstrukturen 6. Dynamische Datenstrukturen Eine Datenstruktur organisiert Daten so in einem Computer, dass man sie effizient nutzen kann. Verkettete Listen, Abstrakte Datentypen Stapel, Warteschlange

Mehr

13. Dynamische Datenstrukturen

13. Dynamische Datenstrukturen Motivation: Stapel. Dynamische Datenstrukturen Verkettete Listen, Abstrakte Datentypen Stapel, Warteschlange, Sortierte Liste 40 40 Motivation: Stapel ( push, pop, top, empty ) Wir brauchen einen neuen

Mehr

12. Dynamische Datenstrukturen

12. Dynamische Datenstrukturen Motivation: Stapel. Dynamische Datenstrukturen Verkettete Listen, Abstrakte Datentypen Stapel, Warteschlange, Implementationsvarianten der verketteten Liste 0 04 Motivation: Stapel ( push, pop, top, empty

Mehr

16. Structs und Klassen I. Rationale Zahlen, Struct-Definition, Operator-Überladung, Datenkapselung, Klassen-Typen

16. Structs und Klassen I. Rationale Zahlen, Struct-Definition, Operator-Überladung, Datenkapselung, Klassen-Typen 491 16. Structs und Klassen I Rationale Zahlen, Struct-Definition, Operator-Überladung, Datenkapselung, Klassen-Typen Rechnen mit rationalen Zahlen 492 Rationale Zahlen (Q) sind von der Form n d mit n

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

Dynamische Datentypen

Dynamische Datentypen Dynamische Datentypen Tupel und Folgen o Wertebereich eines Structs / einer Klasse: T1 T2... Tk Werte sind k-tupel Tupel und Folgen o Wertebereich eines Structs / einer Klasse: T1 T2... Tk Werte sind k-tupel

Mehr

Verschlüsseln eines Bildes. Visuelle Kryptographie. Verschlüsseln eines Bildes. Verschlüsseln eines Bildes

Verschlüsseln eines Bildes. Visuelle Kryptographie. Verschlüsseln eines Bildes. Verschlüsseln eines Bildes Verschlüsseln eines Bildes Visuelle Kryptographie Anwendung von Zufallszahlen Wir wollen ein Bild an Alice und Bob schicken, so dass Alice allein keine Information über das Bild bekommt Bob allein keine

Mehr

19. Vererbung und Polymorphie

19. Vererbung und Polymorphie 667 19. Vererbung und Polymorphie Ausdrucksbäume, Vererbung, Code-Wiederverwendung, virtuelle Funktionen, Polymorphie, Konzepte des objektorientierten Programmierens (Ausdrucks-)Bäume -(3-(4-5))*(3+4*5)/6

Mehr

Visuelle Kryptographie. Anwendung von Zufallszahlen

Visuelle Kryptographie. Anwendung von Zufallszahlen Visuelle Kryptographie Anwendung von Zufallszahlen Verschlüsseln eines Bildes Wir wollen ein Bild an Alice und Bob schicken, so dass Verschlüsseln eines Bildes Wir wollen ein Bild an Alice und Bob schicken,

Mehr

Container für eine Folge gleichartiger Daten. Dynamische Datentypen. Probleme mit Feldern...aber nicht mit std::vector. ... und auch std::vector

Container für eine Folge gleichartiger Daten. Dynamische Datentypen. Probleme mit Feldern...aber nicht mit std::vector. ... und auch std::vector // Container für eine Folge gleichartiger Daten Dynamische Datentyen Listen; Funktionalität, Coy- Konstruktor, Zuweisungsoerator,, Konzet Dynamischer Datenty n Bisher: Felder (T[],std::array, std::vector)

Mehr

7. Vererbung und Polymorphie

7. Vererbung und Polymorphie 210 7. Vererbung und Polymorphie Ausdrucksbäume, Vererbung, Code-Wiederverwendung, virtuelle Funktionen, Polymorphie, Konzepte des objektorientierten Programmierens (Ausdrucks-)Bäume -(3-(4-5))*(3+4*5)/6

Mehr

18. Vererbung und Polymorphie

18. Vererbung und Polymorphie 590 18. Vererbung und Polymorphie Ausdrucksbäume, Vererbung, Code-Wiederverwendung, virtuelle Funktionen, Polymorphie, Konzepte des objektorientierten Programmierens (Ausdrucks-)Bäume 591 -(3-(4-5))*(3+4*5)/6

Mehr

19. Vererbung und Polymorphie

19. Vererbung und Polymorphie (Ausdrucks-)Bäume 19. Vererbung und Polymorphie Ausdrucksbäume, Vererbung, Code-Wiederverwendung, virtuelle Funktionen, Polymorphie, Konzepte des objektorientierten Programmierens -(3-(4-5))*(3+4*5)/6

Mehr

Fallstudie: Online-Statistik

Fallstudie: Online-Statistik Fallstudie: Online-Statistik Ziel: Klasse / Objekt, welches Daten konsumiert und zu jeder Zeit Statistiken, z.b. Mittelwert, Varianz, Median (etc.) ausgeben kann Statistics s = new Statistics(maxSize);...

Mehr

Felder (Arrays) und Zeiger (Pointers) - Teil I

Felder (Arrays) und Zeiger (Pointers) - Teil I Felder (Arrays) und Zeiger (Pointers) - Teil I Feldtypen, Sieb des Eratosthenes, Iteration, Zeigertypen, Zeigerarithmetik, dynamische Speicherverwaltung Felder: Motivation n Wir können jetzt über Zahlen

Mehr

18. Vererbung und Polymorphie

18. Vererbung und Polymorphie 617 18. Vererbung und Polymorphie Ausdrucksbäume, Vererbung, Code-Wiederverwendung, virtuelle Funktionen, Polymorphie, Konzepte des objektorientierten Programmierens (Ausdrucks-)Bäume -(3-(4-5))*(3+4*5)/6

Mehr

Informatik - Übungsstunde

Informatik - Übungsstunde Informatik - Übungsstunde Jonas Lauener (jlauener@student.ethz.ch) ETH Zürich Woche 12-23.05.2018 Lernziele Klassen Dynamic Memory Jonas Lauener (ETH Zürich) Informatik - Übung Woche 12 2 / 20 Structs

Mehr

Felder (Arrays) und Zeiger (Pointers) - Teil I

Felder (Arrays) und Zeiger (Pointers) - Teil I Felder (Arrays) und Zeiger (Pointers) - Teil I Felder: Motivation Wir können jetzt über Zahlen iterieren: for (int i=0; i

Mehr

Felder (Arrays) und Zeiger (Pointers) - Teil I

Felder (Arrays) und Zeiger (Pointers) - Teil I Felder (Arrays) und Zeiger (Pointers) - Teil I Feldtypen, Sieb des Eratosthenes, Iteration, Zeigertypen, Zeigerarithmetik, dynamische Speicherverwaltung Felder: Motivation Wir können jetzt über Zahlen

Mehr

Klassen. Datenkapselung, Klassen-Typen, Mitgliedsfunktionen, Konstruktoren, Konversionen, Zufallszahlen

Klassen. Datenkapselung, Klassen-Typen, Mitgliedsfunktionen, Konstruktoren, Konversionen, Zufallszahlen Klassen Datenkapselung, Klassen-Typen, Mitgliedsfunktionen, Konstruktoren, Konversionen, Zufallszahlen Datenkapselung: Motivation Erinnern wir uns: struct rational { int n; int d; // INV: d!= 0 }; neuer

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

Datenkapselung: Motivation

Datenkapselung: Motivation Klassen Datenkapselung: Motivation Erinnern wir uns: struct rational { }; int n; int d; // INV: d!= 0 neuer Typ für rationale Zahlen... Datenkapselung: Motivation Erinnern wir uns: struct rational { };

Mehr

Programmierkurs C/C++

Programmierkurs C/C++ Blockkurs: "Einführung in C/C++" Programmierkurs C/C++ Donnerstag Sandro Andreotti andreott@inf.fu-berlin.de WS 2008/09 1 Structs Blockkurs: "Einführung in C/C++" 2 Structs sind Bündel von Variablen (unter

Mehr

Informatik. Pointer (Dynamisch) Vorlesung. 17. Dezember 2018 SoSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 1

Informatik. Pointer (Dynamisch) Vorlesung. 17. Dezember 2018 SoSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 1 Informatik Vorlesung 08 Pointer (Dynamisch) 17. Dezember 2018 SoSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 1 Pointer (Zeiger) Dynam. Speicher Bisher: Speicherbedarf muss

Mehr

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen Algorithmen und Datenstrukturen Dynamische Datenobjekte Pointer/Zeiger, Verkettete Liste Eigene Typdefinitionen 1 Zeigeroperatoren & und * Ein Zeiger ist die Speicheradresse irgendeines Objektes. Eine

Mehr

ALP II Dynamische Datenmengen Datenabstraktion (Teil 2)

ALP II Dynamische Datenmengen Datenabstraktion (Teil 2) ALP II Dynamische Datenmengen Datenabstraktion (Teil 2) O1 O2 O3 O4 SS 2012 Prof. Dr. Margarita Esponda 49 Einfach verkettete Listen O1 O2 O3 50 Einführung Einfach verkettete Listen sind die einfachsten

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

15. Rekursion 2. Motivation: Taschenrechner. Naiver Versuch (ohne Klammern) Analyse des Problems (15 7 3) = Eingabe * 3 = Ergebnis 15

15. Rekursion 2. Motivation: Taschenrechner. Naiver Versuch (ohne Klammern) Analyse des Problems (15 7 3) = Eingabe * 3 = Ergebnis 15 Motivation: Taschenrechner 15. Rekursion 2 Bau eines Taschenrechners, Formale Grammatiken, Extended Backus Naur Form (EBNF), Parsen von Ausdrücken Ziel: Bau eines Kommandozeilenrechners Beispiel Eingabe:

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

Dynamische Datenstrukturen in C++ 150

Dynamische Datenstrukturen in C++ 150 Dynamische Datenstrukturen in C++ 150 In allen bisherigen Beispielen belegten die Objekte entweder statischen Speicherplatz oder sie lebten auf dem Stack. Dies vermied bislang völlig den Aufwand einer

Mehr

Binäre Suchbäume. Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps

Binäre Suchbäume. Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps Binäre Suchbäume Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps Mengen n Ziel: Aufrechterhalten einer Menge (hier: ganzer Zahlen) unter folgenden Operationen: Mengen n Ziel: Aufrechterhalten einer

Mehr

Temporäre Objekte. Referenztypen (II) und Const- Typen. Temporäre Objekte. Temporäre Objekte. Was ist hier falsch? Was ist hier falsch?

Temporäre Objekte. Referenztypen (II) und Const- Typen. Temporäre Objekte. Temporäre Objekte. Was ist hier falsch? Was ist hier falsch? Referenztypen (II) und Const- Typen Temporäre Objekte Was ist hier falsch? int& foo (int i) return i; Temporäre Objekte Was ist hier falsch? Temporäre Objekte Was ist hier falsch? int& foo (int i) return

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

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

Grundlagen der Informatik 12. Strukturen

Grundlagen der Informatik 12. Strukturen 12. Strukturen Strukturen und deren Komponenten Strukturen im Projekt Dynamisch erstellte Strukturen Strukturen und Operatoren Strukturen und Funktionen Einfach verkettete Liste Grundlagen der Informatik

Mehr

Advanced Programming in C

Advanced Programming in C Advanced Programming in C Pointer und Listen Institut für Numerische Simulation Rheinische Friedrich-Wilhelms-Universität Bonn Oktober 2013 Überblick 1 Variablen vs. Pointer - Statischer und dynamischer

Mehr

Übung Algorithmen und Datenstrukturen

Übung Algorithmen und Datenstrukturen Übung Algorithmen und Datenstrukturen Sommersemester 2017 Marc Bux, Humboldt-Universität zu Berlin Agenda 1. (Sortierte) Listen 2. Stacks & Queues 3. Datenstrukturen 4. Rekursion und vollständige Induktion

Mehr

Programmierkurs C++ Templates & STL (1/2)

Programmierkurs C++ Templates & STL (1/2) Programmierkurs C++ Templates & STL (1/2) Prof. Dr. Stefan Fischer Institut für Telematik, Universität zu Lübeck https://www.itm.uni-luebeck.de/people/fischer #2 Templates Die wichtigsten objekt-orientierten

Mehr

7. Verkettete Strukturen: Listen

7. Verkettete Strukturen: Listen 7. Verkettete Strukturen: Listen Java-Beispiele: IntList.java List.java Stack1.java Version: 4. Jan. 2016 Vergleich: Schwerpunkte Arrays verkettete Listen Listenarten Implementation: - Pascal (C, C++):

Mehr

Schwerpunkte. Verkettete Listen. Verkettete Listen: 7. Verkettete Strukturen: Listen. Überblick und Grundprinzip. Vergleich: Arrays verkettete Listen

Schwerpunkte. Verkettete Listen. Verkettete Listen: 7. Verkettete Strukturen: Listen. Überblick und Grundprinzip. Vergleich: Arrays verkettete Listen Schwerpunkte 7. Verkettete Strukturen: Listen Java-Beispiele: IntList.java List.java Stack1.java Vergleich: Arrays verkettete Listen Listenarten Implementation: - Pascal (C, C++): über Datenstrukturen

Mehr

Lindenmayer-Systeme: Fraktale rekursiv zeichnen

Lindenmayer-Systeme: Fraktale rekursiv zeichnen Lindenmayer-Systeme: Fraktale rekursiv zeichnen Lindenmayer-Systeme: Definition o Alphabet Σ ( Beispiel: {F, +, -} ) Lindenmayer-Systeme: Definition o Alphabet Σ ( Beispiel: {F, +, -} ) o Σ * = Menge aller

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

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

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

Numerische Methoden und Algorithmen in der Physik

Numerische Methoden und Algorithmen in der Physik Numerische Methoden und Algorithmen in der Physik Hartmut Stadie, Christian Autermann 04.12.2008 Numerische Methoden und Algorithmen in der Physik Hartmut Stadie 1/ 33 Einführung Klassen Optimierung Vererbung

Mehr

Informatik 1 ( ) D-MAVT F2010. Rekursion, Signaturen. Yves Brise Übungsstunde 8

Informatik 1 ( ) D-MAVT F2010. Rekursion, Signaturen. Yves Brise Übungsstunde 8 Informatik 1 (251-0832-00) D-MAVT F2010 Rekursion, Signaturen Nachbesprechung Blatt 6 Aufgabe 1 - Strukturen und Zeiger Genau die Variablen angeben, die sich geändert haben. Implizite Initialisierung ergänzt

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

12/18/12 // POST: values of a and b are interchanged void swap (int& a, int& b) { int c = a; a = b; b = c;

12/18/12 // POST: values of a and b are interchanged void swap (int& a, int& b) { int c = a; a = b; b = c; Generische Funktionalität Generisches Programmieren Template-Funktionen, Template- Klassen, generisches Sortieren, Fibonacci- und Ackermann-Zahlen zur Kompilierungszeit n Viele Funktionen braucht man für

Mehr

Methoden. (Softwareentwicklung II (IB)) Prof. Dr. Oliver Braun. Letzte Änderung: :40. Methoden 1/44

Methoden. (Softwareentwicklung II (IB)) Prof. Dr. Oliver Braun. Letzte Änderung: :40. Methoden 1/44 Methoden (Softwareentwicklung II (IB)) Prof. Dr. Oliver Braun Letzte Änderung: 02.03.2018 12:40 Methoden 1/44 Was Sie bereits wissen müssen: Siehe Softwareentwicklung I (IB) Methoden 2/44 Überladen Methoden

Mehr

Kapitel 4.2. Dynamische Datenstrukturen. Nächste Woche: 4. und letzte Schnellübung. Übungsaufgaben: 71-74, 2-aus-4, Rest Bonus.

Kapitel 4.2. Dynamische Datenstrukturen. Nächste Woche: 4. und letzte Schnellübung. Übungsaufgaben: 71-74, 2-aus-4, Rest Bonus. Kapitel 4.2 Dynamische Datenstrukturen Michael Hoffmann Nächste Woche: 4. und letzte Schnellübung. Übungsaufgaben: 71-74, 2-aus-4, Rest Bonus. Expression Funktionalität Expression

Mehr

Algorithmen zur Datenanalyse in C++

Algorithmen zur Datenanalyse in C++ Algorithmen zur Datenanalyse in C++ Hartmut Stadie 11.06.2012 Algorithmen zur Datenanalyse in C++ Hartmut Stadie 1/ 28 Einführung Klassen Übung Algorithmen zur Datenanalyse in C++ Hartmut Stadie 2/ 28

Mehr

4 Generische Programmierung. 4.1 Klassen-Templates (*) 4.2 Funktions-Templates (*) 4.3 Besondere Programmiertechniken (Smart Pointer)

4 Generische Programmierung. 4.1 Klassen-Templates (*) 4.2 Funktions-Templates (*) 4.3 Besondere Programmiertechniken (Smart Pointer) 4 Generische Programmierung 4.1 Klassen-Templates (*) 4.2 Funktions-Templates (*) 4.3 Besondere Programmiertechniken (Smart Pointer) (*) Auch in dieser Datei. V 4.05; Hon. Prof. Helmke 1 Intelligente Zeiger

Mehr

Structs, Referenztypen und Const-Typen

Structs, Referenztypen und Const-Typen Structs, Referenztypen und Const-Typen Rechnen mit rationalen Zahlen o Rationale Zahlen (Q) sind von der Form n/d, mit n und d ausz o C++ hat keinen eingebauten Typ für rationale Zahlen Rechnen mit rationalen

Mehr

Referenztypen (II) und Const- Referenzen. Temporäre Objekte, Const- Referenzen, was genau ist konstant?

Referenztypen (II) und Const- Referenzen. Temporäre Objekte, Const- Referenzen, was genau ist konstant? Referenztypen (II) und Const- Referenzen Temporäre Objekte, Const- Referenzen, was genau ist konstant? Temporäre Objekte Was ist hier falsch? int& foo (int i) { } return i; Temporäre Objekte Was ist hier

Mehr

Lindenmayer-Systeme: Fraktale rekursiv zeichnen. Definition. Definition. Definition. o Alphabet Σ ( Beispiel: {F, +, -} )

Lindenmayer-Systeme: Fraktale rekursiv zeichnen. Definition. Definition. Definition. o Alphabet Σ ( Beispiel: {F, +, -} ) Fraktale rekursiv zeichnen Definition o Alphabet Σ ( Beispiel: F, +, - ) Definition o Alphabet Σ ( Beispiel: F, +, - ) o Σ * = Menge aller endlichen Wörter über Σ ( Beispiel: F+F+ ist in Σ * ) Definition

Mehr

Softwareentwicklung II (IB) Methoden. Prof. Dr. Oliver Braun. Fakultät für Informatik und Mathematik Hochschule München

Softwareentwicklung II (IB) Methoden. Prof. Dr. Oliver Braun. Fakultät für Informatik und Mathematik Hochschule München Softwareentwicklung II (IB) Methoden Fakultät für Informatik und Mathematik Hochschule München Letzte Änderung: 05.04.2018 17:44 Inhaltsverzeichnis Was Sie bereits wissen müssen: Siehe Softwareentwicklung

Mehr

Informatik 1 ( ) D-MAVT F2011. Klassen, Funktionen. Yves Brise Übungsstunde 9

Informatik 1 ( ) D-MAVT F2011. Klassen, Funktionen. Yves Brise Übungsstunde 9 Informatik 1 (251-0832-00) D-MAVT F2011 Klassen, Funktionen Nachbesprechung Blatt 7, Aufgabe 1 Wenn Funktion void als Rückgabetyp hat, dann ist return nicht notwendig. void swap3(int* a, int* b) { int

Mehr

Programmier-Befehle - Woche 08

Programmier-Befehle - Woche 08 Datentypen Vektoren (mehrdim.) eines bestimmten Typs Erfordert: #include Wichtige Befehle: Definition: std::vector my vec (n rows, std::vector(n cols, init value)) Zugriff:

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

Beispiel: die Klasse Brüche

Beispiel: die Klasse Brüche Universität München, Hans-Peter Kriegel und Thomas Seidl Informatik II -138 Beispiel: die Klasse Brüche class Fraction { int num; Int denom; // numerator // denominator Fraction (int n, int d) { num =

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

Mengen. Binäre Suchbäume. Mengen: Anwendungen (II) Mengen: Lösung mit Listen 12/3/12. Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps

Mengen. Binäre Suchbäume. Mengen: Anwendungen (II) Mengen: Lösung mit Listen 12/3/12. Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps // Mengen Binäre Suchbäume Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps n Ziel: ufrechterhalten einer Menge (hier: ganzer Zahlen) unter folgenden Operationen: n eines Elements n eines Elements

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

Programmierkurs C/C++

Programmierkurs C/C++ Blockkurs: "Einführung in C/C++" Programmierkurs C/C++ Freitag Sandro Andreotti andreott@inf.fu-berlin.de WS 2008/09 1 Blockkurs: "Einführung in C/C++" 2 Vererbung Klassen erben die Member von Basisklassen:

Mehr

Informatik II Übung, Woche 14

Informatik II Übung, Woche 14 Giuseppe Accaputo 7. April, 2016 Plan für heute 1. Java Klassen Beispiel: Implementation eines Vorlesungsverzeichnis (VVZ) 2. Informatik II (D-BAUG) Giuseppe Accaputo 2 Java Klassen Beispiel: Implementation

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

Felder: Motivation. Felder (Arrays) und Zeiger (Pointers) - Teil I. Felder: erste Anwendung. Felder: erste Anwendung

Felder: Motivation. Felder (Arrays) und Zeiger (Pointers) - Teil I. Felder: erste Anwendung. Felder: erste Anwendung Felder (Arrays) und Zeiger (Pointers) - Teil I Felder: Motivation Wir können jetzt über Zahlen iterieren: for (int i=; i

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

1.4. Funktionen. Objektorientierte Programmierung mit C++

1.4. Funktionen. Objektorientierte Programmierung mit C++ mehrfache Deklarationen sind erlaubt für jede Funktion muss es (GENAU) eine Definition geben, ansonsten linker error [the one definition rule ODR] Deklarationen in *.h - Files, Definitionen in *.cpp -

Mehr

Praxis der Programmierung

Praxis der Programmierung Dynamische Datentypen Institut für Informatik und Computational Science Universität Potsdam Henning Bordihn Einige Folien gehen auf A. Terzibaschian zurück. 1 Dynamische Datentypen 2 Dynamische Datentypen

Mehr

6. Verkettete Strukturen: Listen

6. Verkettete Strukturen: Listen 6. Verkettete Strukturen: Listen 5 K. Bothe, Inst. f ür Inf., HU Berlin, PI, WS 004/05, III.6 Verkettete Strukturen: Listen 53 Verkettete Listen : Aufgabe Vergleich: Arrays - verkettete Listen Listenarten

Mehr

Objektorientierte Programmierung mit C++ den sog. default constructor X (){}

Objektorientierte Programmierung mit C++ den sog. default constructor X (){} Wann immer Objekte entstehen, läuft automatisch ein (passender) Konstruktor! Wann immer Objekte verschwinden, läuft automatisch der Destruktor! Klassen ohne nutzerdefinierten Konstruktor/Destruktor besitzen

Mehr

Informatik II Prüfungsvorbereitungskurs

Informatik II Prüfungsvorbereitungskurs Informatik II Prüfungsvorbereitungskurs Tag 4, 23.6.2016 Giuseppe Accaputo g@accaputo.ch 1 Programm für heute Repetition Datenstrukturen Unter anderem Fragen von gestern Point-in-Polygon Algorithmus Shortest

Mehr

Universität München, Hans-Peter Kriegel und Thomas Seidl Informatik II a[0] a[1] a[2] a[3] a[n 1]

Universität München, Hans-Peter Kriegel und Thomas Seidl Informatik II a[0] a[1] a[2] a[3] a[n 1] Universität München, Hans-Peter Kriegel und Thomas Seidl Informatik II -108 Kapitel 5: Arrays Einführung Ein Array ist eine Reihung gleichartiger Objekte. a: a[0] a[1] a[2] a[3] a[n 1] Bezeichner a steht

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

Informatik 1 ( ) D-MAVT F2010. Schleifen, Felder. Yves Brise Übungsstunde 5

Informatik 1 ( ) D-MAVT F2010. Schleifen, Felder. Yves Brise Übungsstunde 5 Informatik 1 (251-0832-00) D-MAVT F2010 Schleifen, Felder Nachbesprechung Blatt 3 Aufgabe 1 ASCII... A > a Vorsicht: Lösen Sie sich von intuitiven Schlussfolgerungen. A ist nicht grösser als a, denn in

Mehr

C++11. neu in C++11: range-based for. Objektorientierte Programmierung mit C++ Ersetzung durch: 1. Elementares C++ int array[] = { 1, 2, 3, 4, 5 };

C++11. neu in C++11: range-based for. Objektorientierte Programmierung mit C++ Ersetzung durch: 1. Elementares C++ int array[] = { 1, 2, 3, 4, 5 }; neu in C++11: range-based for int array[] = { 1, 2, 3, 4, 5 ; for (int x : array) // value x *= 2; C++11 for (int& x : array) // reference x *= 2; Ersetzung durch: { auto && range = range-init; for ( auto

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++ 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

C-Arrays vs. C++-Container

C-Arrays vs. C++-Container C-Arrays vs. C++-Container In C verwendet man (mangels Alternativen) sehr häufig das C-Array (= Feld): im Speicher hintereinander abgelegte Elemente vom gleichen Typ. Arrays haben einen Basistyp (Typ des

Mehr

7.0 Arbeiten mit Objekten und Klassen

7.0 Arbeiten mit Objekten und Klassen 252-0027 Einführung in die Programmierung 7.0 Arbeiten mit Objekten und Klassen Thomas R. Gross Department Informatik ETH Zürich Copyright (c) Pearson 2013. and Thomas Gross 2016 All rights reserved. Uebersicht

Mehr

Programmieren in C++ Klassen

Programmieren in C++ Klassen Programmieren in C++ Klassen Inhalt Klassen (vertieft) Destruktor Konstruktoren Move-Semantik und Rechtswert-Referenzen (C++11) C++11 Features Prof. Dr. C. Stamm Programmieren in C++, FS 13 4-2 Implementierung

Mehr

18. Dynamische Datenstrukturen I

18. Dynamische Datenstrukturen I 588 Wiederholung: vector 589 18. Dynamische Datenstrukturen I Dynamischer Speicher, Adressen und Zeiger, Const-Zeiger, Arrays, Array-basierte Vektoren Kann mit beliebiger Grösse n initialisiert werden

Mehr

Lambda-Funktionen. Lambda-Funktionen. Lambda-Funktionen sollen

Lambda-Funktionen. Lambda-Funktionen. Lambda-Funktionen sollen Lambda-Funktionen Lambda-Funktionen sind Funktionen ohne Namen. definieren ihre Funktionalität an Ort und Stelle. können wie Daten kopiert werden. können ihren Aufrufkontext speichern. Lambda-Funktionen

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

Vorkurs C++ Programmierung

Vorkurs C++ Programmierung Vorkurs C++ Programmierung Klassen Letzte Stunde Speicherverwaltung automatische Speicherverwaltung auf dem Stack dynamische Speicherverwaltung auf dem Heap new/new[] und delete/delete[] Speicherklassen:

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

Crashkurs C++ - Teil 1

Crashkurs C++ - Teil 1 Crashkurs C++ - Teil 1 Intro Speicherverwaltung Variablen, Pointer, Referenzen Felder statische & dynamische Allozierung Birgit Möller & Denis Williams AG Bioinformatik & Mustererkennung Institut für Informatik

Mehr

ALP II Dynamische Datenmengen Datenabstraktion

ALP II Dynamische Datenmengen Datenabstraktion ALP II Dynamische Datenmengen Datenabstraktion O1 O2 O3 O4 SS 2012 Prof Dr Margarita Esponda M Esponda-Argüero 1 Dynamische Datenmengen Dynamische Datenmengen können durch verschiedene Datenstrukturen

Mehr