Upload
katinka-block
View
107
Download
0
Embed Size (px)
Citation preview
Informatik 1
Übung 8
NACHBESPRECHUNGÜbung 8
Rekursion
• Existiert Weg von A nach B?
Rekursion
• Existiert Weg von A nach B?• Ja, falls:– Schritt von A zu A' möglich– Weg von A' nach B existiert
Rekursion
• Existiert Weg von A nach B?• Ja, falls:– Schritt von A zu A' möglich– Weg von A' nach B existiert
Rekursion
• Musterlösung
Strings
• Typ string– Operatoren !=, ==, <, >, ...
• Typ char* oder char[N]– Funktionen strcmp, strcpy, ...
string s1 = "abc";string s2 = "def";
if(s1 > s2) { s1 = s2;}cin >> s2;
char s1[4] = "abc";char s2[4] = "def";
if(strcmp(s1,s2)>0) { strcpy(s1,s2);}cin.getline(s2,3);
Listen
• Auf Blatt aufzeichnen• Jeden Zeiger auf Gültigkeit prüfen• Sonderfälle– Liste leer– Erstes/letztes Element einfügen
head
data
next
data
next
data
next
data
next
Debugging
• Live demo
WIEDERHOLUNGKlassen
Klassen
• Klasse– Bauanleitung
• Instanz einer Klasse– Objekt, nach Bauanleitung hergestellt
Klassen
• Nur Bauanleitung, kein Objekt
class Vektor{public: int x; int y;};
int main(){
return 0;}
Klassen
• Ein Objekt
class Vektor {public: int x; int y;};
int main(){ Vektor v; return 0;}
Klassen
• Äquivalent ohne Klassen
class Vektor{public: int x; int y;};
int main(){ Vektor v;
return v.x;}
int main(){ int v_x; int v_y; return v_x;}
Klassen
• Member-Funktionen– Wie normale Funktionen– Versteckter (automatischer) this-Parameter– Müssen auf Objekten aufgerufen werden
Klassen
• Äquivalent ohne Member-Funktionenclass Vektor {public: int x,y; int getLength() ;};
int Vektor::getLength() { return x*x+y*y;}
int main() { Vektor v; return v.getLength();}
class Vektor {public: int x,y;}
int Vektor_getLength(Vektor* this) { return this->x*this->x+this->y*this->y;}
int main() { Vektor v; return Vektor_getLength(v);}
Klassen
• Operatoren– Normale Funktionen, mit schöner Schreibweise– Parameter und Rückgabewert beliebig• Nicht alles macht Sinn
Klassen
• Äquivalent ohne Operatorenclass Vektor {public: int x,y; Vektor scale(int s) ;};
int main() { Vektor v, w; w = v.scale(2); return 0;}
class Vektor {public: int x,y; Vektor operator*(int s) ;};
int main() { Vektor v, w; w = v.operator*(2); return 0;}
class Vektor {public: int x,y; Vektor operator*(int s) ;};
int main() { Vektor v, w; w = v*2; return 0;}
Klassen
• Definition innerhalb der Klasse– Member-Funktion mit einem Parameter
• Definition ausserhalb der Klasse– Normale Funktion mit zwei Parametern
class Vektor {public: int x,y; Vektor operator*(int s) ;};
class Vektor {public: int x,y;};
Vektor operator*(const Vektor& v, int s) ;
Klassen
• Konstruktor / Destruktor– Wie normale Member-Funktionen– Werden automatisch aufgerufen
Klassen
• Äquivalent ohne Konstruktorenclass Vektor {public: int x,y; Vektor(); ~Vektor();};
int main() { Vektor v; ... return 0;}
class Vektor {public: int x,y; void construct(); void destroy();};
int main() { Vektor v; v.construct(); // automatisch aufgerufen ... v.destroy(); // automatisch aufgerufen return 0;}
Klassen
• Äquivalent ohne Konstruktorenclass Vektor {public: int x,y; Vektor(); Vektor(int i); ~Vektor();};
int main() { Vektor v; Vektor w(1); ... return 0;}
Klassen
• Instanzen einer Klasse kopieren• Automatisch– Member-Variablen werden 1:1 kopiert
• Manuell– Kopier-Konstruktor– Zuweisungs-Operator– Immer beide definieren
Klassen
• Wieso?– Wenn Objekte externe Resourcen allozieren
class Vektor{public: Vektor(int length)private: float* elements; int length;};
Vektor::Vektor(int l) { elements = new int[length]; length = l;}
int main() { Vektor v1(3); Vektor v2(3); v1 = v2;}
Klassen
• Kopier-Konstruktor– Normaler Konstruktor mit einem Parameter• Am besten konstante Referenz auf Objekt
class A{public: A (const A& other) ;};
A a1;A a2 = a1; // A a2(a1);
Klassen
• Zuweisungs-Operator– Normaler Operator mit einem Parameter• Am besten konstante Referenz auf Objekt
– Rückgabewert beliebig• Am besten Referenz auf eigenes Objekt (return *this)
class A{public: A& operator=(const A& other) ;};
A a1, a2;a2 = a1;
Klassen
• Zugriffsrechte– Bezieht sich auf Member-Variablen und Member-
Funktionen• Was ist erlaubt?
Wer greift zu? Private Protected Public
Member-Funktion eigene Klasse Ja Ja Ja
Member-Funktion abgeleitete Klasse Nein Ja Ja
Member-Funktion fremde Klasse Nein Nein Ja
Globale Funktion Nein Nein Ja
Klassen
• Friend– Gewährt uneigeschränkten Zugriff
• Public– Alle Funktionen
• Private– Nur eigene Member-Funktionen
• Protected– Zusätzlich Member-Funktionen von abgeleiteten
Klassen
WIEDERHOLUNGVererbung
Klassen
• Vererbung– Bauplan erweitern– Alten Bauplan übernehmen, mehr anhängen
Klassen
• Basisklasse• Abgeleitete Klasse– Übernimmt alle Member-Variablen und
Funktionen der Basisklasse
class Base{};
class Derived : public Base {};
Klassen
• Äquivalent ohne Vererbungclass A{public: int x,y;};
class B : public A {public: int z;};
struct A{ int x,y;};
struct B { A base; int z;};
struct A{ int x,y;};
struct B { int x; int y; int z;};
Klassen
• Funktionen überladen• Abgeleitete Klasse übernimmt alle Funktionen• Funktionen in abgeleiteter Klasse mit gleicher
Signatur ersetzt Funktion der Basisklasse
Klassen
• Vererbung vs. Komposition• Vererbung: "ist ein"– Auto ist ein Fahrzeug– Klasse Auto vererbt von der Klasse Fahrzeug
• Komposition: "hat ein"– Auto hat einen Motor– Klasse Auto hat eine Member-Variable motor
Klassen
• Vererbung vs. Kompositionclass A{public: int x,y;};
class B : public A {public: int z;};
class A{public: int x,y;};
class B{public: A a; int z;};
C++ FAQ lite
• http://www.parashift.com/c++-faq-lite• Beantwortet alle schweren Fragen zu C++
ÜBUNGSerie 10
Aufgabe 1
• Übersicht OperatorenOperator Definition
+ Vektor operator+(const Vektor& other);
+= void operator+=(const Vektor& other);
= Vektor& operator=(const Vektor& other);
copy constructor Vektor(const Vektor& other);