Programmieren in C++

Ähnliche Dokumente
Verschlüsseln eines Bildes. Visuelle Kryptographie. Verschlüsseln eines Bildes. Verschlüsseln eines Bildes

Programmieren in C++

Crashkurs C++ - Teil 1

Vorkurs C++ Programmierung

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

Programmierkurs C/C++

C++ - Objektorientierte Programmierung Konstruktoren und Destruktoren

Crashkurs C++ Wiederholung

7. Übung Informatik II - Objektorientierte Programmierung

Kapitel 9: Klassen und höhere Datentypen. Klassen und höhere. Objekte, Felder, Methoden. Küchlin/Weber: Einführung in die Informatik

Repetitorium Informatik (Java)

C++ Klassen, Vererbung. Philipp Lucas. Sebastian Hack. Wintersemester 2008/09. saarland.

Einstieg in die Informatik mit Java

Prof. W. Henrich Seite 1

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

C++ - Objektorientierte Programmierung Konstante und statische Elemente

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

Programmierkurs C++ Konstruktor, Statische Methoden Namespaces

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

Einstieg in die Informatik mit Java

Dynamische Datentypen

Objektorientierte Programmierung und Klassen

Algorithmen und Datenstrukturen

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

Geschachtelte Klassen

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

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

Java Einführung Klassendefinitionen

Einführung in die Programmiersprache Java II

Vorlesung Programmieren

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

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

Javakurs für Anfänger

II. Grundlagen der Programmierung. Beispiel: Merge Sort. Beispiel: Merge Sort (Forts. ) Beispiel: Merge Sort (Forts. )

Konstruktor/Destruktor

1 Klassen und Objekte

Grundlagen der Objektorientierten Programmierung - Statische Arrays

6 ZEIGER UND REFERENZEN - ALLGEMEINES

C++ Notnagel. Ziel, Inhalt. Programmieren in C++

Einführung in die Programmierung für NF MI. Übung 07

Java Einführung Methoden in Klassen

Klassen als Datenstrukturen

Fragen zur OOP in Java

Tag 4 Repetitorium Informatik (Java)

Javakurs für Anfänger

Innere Klassen. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java

Kurzeinführung in C/C++ Elementare Datentypen in C++

Objektorientierte Programmierung Studiengang Medieninformatik

Grundlagen der Informatik

Einstieg in die Informatik mit Java

Objektorientierte Programmierung

Programmieren in C++ Überladen von Methoden und Operatoren

Grundkurs C++ IDE Klassenhierarchien

Schlussendlich geben wir die Listen aus. Es kommt zu folgender Ausgabe:

Grundkurs C++ IDE Klassenhierarchien

Grundlagen von Python

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

3.2 Datentypen und Methoden

8. Referenzen und Zeiger

12. Java Klassen. Klassen - Technisch. Beispiel: Erdbebendaten. Klassen - Konzeptuell

Objektorientierte Programmierung mit C++ SS 2007

Einstieg in die Informatik mit Java

10. Klassen. Prof. Dr. Markus Gross Informatik I für D-ITET (WS 03/04)

C++ - Objektorientierte Programmierung Vererbung

Einstieg in die Informatik mit Java

3 Objektorientierte Konzepte in Java

Überblick. 5. Objekt und Klasse, Elementfunktionen

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

Java Einführung Methoden. Kapitel 6

Scala. Funktionale (Zustandslose) Objekte

Algorithmen und Datenstrukturen

Java I Vorlesung Vererbung und Sichtbarkeit

Objektorientierung (OO)

Prinzipien der objektorientierten Programmierung (OOP)

Einstieg in die Informatik mit Java

Arrays. Theorieteil. Inhaltsverzeichnis. Begriffe. Programmieren mit Java Modul 3. 1 Modulübersicht 3

einkonto.zahle(+100); //Transaktion Einzahlung einkonto.zahle(-20); //Transaktion Auszahlung einkonto.zahle(+30); //Transaktion Einzahlung

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Referenzen. Referenzen

Tücken der dynamischen Bindung

Tag 4 Repetitorium Informatik (Java)

Ursprünge. Die Syntax von Java. Das Wichtigste in Kürze. Konsequenzen. Weiteres Vorgehen. Rund um Java

Java I Vorlesung 6 Referenz-Datentypen

Transkript:

Programmieren in C++ SS 2012 Vorlesung 5, Dienstag 5. Juni 2012 (Klassen, Objekte, Methoden, new & delete) Prof. Dr. Hannah Bast Lehrstuhl für Algorithmen und Datenstrukturen Institut für Informatik Universität Freiburg

Blick über die Vorlesung heute Organisatorisches Erfahrungen mit dem 4. Übungsblatt Themen heute Erste objektorientierte Schritte Dynamische Speicherallokation mit new und delete Übungsblatt dazu: Code vom letzten Übungsblatt objektorientiert machen... und mit dynamischer Speicherallokation Anmerkung: wenn Sie Probleme mit dem letzten Übungsblatt hatten, können Sie einfach die Musterlösung nehmen und damit weiter machen 2

Erfahrungen mit dem Ü4 (Wurm) Zusammenfassung / Auszüge Stand 5.6 13:30 Aufwändigstes / schwierigstes Übungsblatt bisher Aber angemessen + hat Spaß gemacht Diesmal weniger Vorgaben / Hilfestellung Für viele dadurch interessanter, für einige dadurch sehr schwer Unit-Tests haben einige Fehler gefunden gdb hat bei einigen segmentation faults geholfen Problem mit aufeinander aufbauenden Übungsblättern? Fehler beim Rotieren des Richtungsvektors... separate Folie Normalisierung des Richtungsvektors... war nicht gefordert Musterlösung vom Makefile besprechen... andermal Kann ich Zwischenversionen ins SVN machen?... Ja klar! 3

Rotation des Richtungsvektors Ein klassischer (und nicht leicht zu findender) Fehler "Update" von einem Vektor, bei uns etwa: dirx = dirx diry; diry = dirx + diry; Fehler: in der zweiten Zeile hat dirx schon den neuen Wert! Einfache Lösung dafür: int newdirx = dirx diry; int newdiry = dirx + diry; dirx = newdirx; diry = newdiry; Bei sowas helfen einem Unit Tests insofern, dass Sie einem zumindest sofort zeigen, wo im Code der Fehler liegt Was dann der Fehler ist... nachdenken (manchmal nötig) 4

Klassen Für uns erstmal zwei Verwendungszwecke Definition von neuen (komplexeren) Datentypen durch die Membervariablen einer Klasse Zusammenfassen von Funktionen die "zusammen gehören" das sind die Methoden einer Klasse 5

Membervariablen einer Klasse Deklaration der Klasse Man schreibt einfach alle Variablen, die zu dem Datentyp gehören sollen in die Klasse, wie bei einer Deklaration class Ball { int posx; int posy; }; Deklaration eines Objektes der Klasse Analog zur Deklaration für die Basisdatentypen: Ball ball; Wichtig: Das reserviert bereits Speicherplatz, und ball ist der Name für dieses Stück Speicher In Java wäre das nur eine Referenz (= ein Zeiger) 6

Methoden eine Klasse Zu der Klasse gehörige Funktionen heißen Methoden Sie werden innerhalb der Klasse (in der.h Datei) deklariert class Ball { void move(); int posx; int posy; }; Implementierung in der.cpp Datei; man beachte, dass zum vollen Methodennamen der Klassenname gehört void Ball::move() { posx++; posy++; } 7

Zugriff auf Membervariablen & Methoden Das geht über den. Operator Ball ball; // Create object of class Ball. printf("position: (%d,%d)\n", ball.posx, ball.posy); ball.move(); Die letzte Zeile ruft die move() Funktion auf Dieser Aufruf ändert posx und posy von genau (und nur) dem Objekt ball, auf dem sie aufgerufen wird Zugriffsberechtigung Damit das kompiliert, braucht man Zugriffsberechtigung für die entsprechenden Membervariablen / Methoden nächste Folie 8

Zugriffsberechtigung Public und Private Vor den Abschnitt mit den Membervariablen und Methoden, auf die von außen (über ein Objekt) zugegriffen werden soll schreibt man (nur ein Leerzeichen eingerückt) public: Vor den Abschnitt mit den Membervariablen und Methoden, auf die von außen (über ein Objekt) nicht zugegriffen werden soll, schreibt man (nur ein Leerzeichen eingerückt) private: Es gibt auch noch protected... später (Vererbung) In den Methoden einer Klasse kann man grundsätzlich auf alle Membervariablen und Methoden dieser Klasse zugreifen auch von anderen Objekten der Klasse... nächste VL 9

Benennung von Membervariablen 1/2 Wie unterscheidet man Membervariablen von normalen Variablen? void Ball::move() { int posx = posx + 1; // Local variable with same name. printf("value is: %d\n, posx); // What is printed now?... }; Bei Mehrdeutigkeiten nimmt der Compiler die zuletzt deklarierte Variable Aber besser man vermeidet solche Mehrdeutigkeiten! Dazu versehen wir alle Membervariablen mit einem _ (Unterstrich bzw. englisch Underscore) 10

Benennung von Membervariablen 2/2 Das sieht dann so aus: class Ball { void move(); int _posx; int _posy; }; void Ball::move() { _posx++; _posy++; } Das ist nur eine Namenskonvention, sonst nichts! Aber eine, die hilft, doofe Fehler zu vermeiden 11

Konstruktor 1/4 Objekte sind ohne Weiteres erstmal uninitialisiert Anders als bei den Basistypen (int, char, double, bool, etc.) ist es allerdings üblich, sie zu initialisieren Das tut man über den sogenannten Konstruktor Der Konstruktor ist eine Methode, die so heißt wie die Klasse und keinen Rückgabewert hat Deklaration innerhalb der Klasse in der.h Datei class Ball { Ball(int posx, int posy); int _posx; int _posy; }; 12

Konstruktor 2/4 Implementierung und Aufruf Implementierung in der.cpp Datei Ball::Ball(int posx, int posy) { _posx = posx; _posy = posy; } Aufruf erfolgt automatisch bei der Objekt-Deklaration Ball ball(10, 10); // Calls the constructor. printf("position = (%d,%d)\n", ball._posx, ball._posy); Die letzte Zeile druckt dann Position = (10,10) (vorausgesetzt _posx und _posy sind public) 13

Konstruktor 3/4 Defaultkonstruktor So heißt der Konstruktor ohne Argumente Ball ball; // Calls the default constructor. Wenn es sonst keinen Konstruktur gibt (und nur dann), gibt es den Defaultkonstruktur ohne dass man etwas tut er tut dann... nichts Man kann ihn aber auch explizit in der.h Datei deklarieren Ball();... und in der.cpp Datei implementieren Ball::Ball() { _posx = 1; _posy = 1; } 14

Konstruktor 4/4 Komplexerer Code gehört nicht in den Konstruktur Sondern in eine separate Methode, z.b. initialize() Das kann sonst zu schwer zu findenden Fehler führen Insbesondere bei: globalen Objekten, Vererbung, Exceptions Für Details, siehe http://google-styleguide.googlecode.com/ svn/trunk/cppguide.xml #Doing_Work_in_Constructors 15

FRIEND_TEST Membervariablen sind in der Regel private Weil der Zugriff auf die Werte eines Objektes meist über die Methoden der Klasse ist Die Idee dahinter ist, dass ein Benutzer der Klasse nicht wissen muss, wie das Objekt innen aussieht In den Tests will man aber oft Zugriff auf die private Membervariablen, z.b. im TEST(BallTest, move) Ball ball; ball.setposition(1, 1); ASSERT_EQ(1, ball._posx); // Compiler error: posx is private. Dazu schreibt man in der Klasse unter die Methodendeklaration move(); FRIEND_TEST(BallTest, move); 16

Statische Membervariablen Variablen, die zu der Klasse als Ganzes gehören... und nicht zu jedem einzelnen Objekt Zum Beispiel so etwas wie _maxx und _maxy Die deklariert man dann in der Klasse so: static int _maxx; static int _maxy; Bei nicht const Variablen muss die Initialisierung in der.cpp Datei erfolgen (separat von der Deklaration) int Ball::_maxX = 20; int Ball::_maxY = 100; 17

Dynamische Speicherallokation 1/3 Statische Speicherallokation Bei der Deklaration von einem Feld muss die Größe des Feldes bekannt sein int n = atoi(argv[1]); int array[n]; // This will not compile, n must be const. Dynamische Speicherallokation Zur Laufzeit bekommt man Speicher mit new int n = atoi(argv[1]); int* array = new int[n]; Das new alloziert in dem Fall Speicherplatz für n ints und gibt einen Zeiger auf den Anfang dieses Platzes zurück 18

Dynamische Speicherallokation 2/3 Dynamische Allokation von Objekten Geht analog int* p1 = new int; // Allocate space for a single int. Für Klassen wird dabei der Konstruktor aufgerufen Ball* p2 = new Ball(10, 10); Ohne Argumente der Defaultkonstruktor (DK) Ball* p3 = new Ball(); // Will not compile without the (). Bei Feldern von Objekten wird für jedes der DK aufgerufen Ball* p4 = new Ball[10]; // Will create 10 Ball objects. Anmerkung: in Java kann man nur so (mit new) konkrete Objekte erzeugen; man muss sich anders als in C++ aber nicht um das Aufräumen kümmern... nächste Folie 19

Dynamische Speicherallokation 3/3 Freigeben von Speicher Dynamisch allozierten Speicher sollte man freigeben wenn man ihn nicht mehr braucht, das geht mit delete int n = atoi(argv[1]); int* array = new int[n]; // Pointer to an array of n ints. int *p1 = new int; // Pointer to single int. int* p2 = new Ball(); // Pointer to single object.... some code... delete[] array; // For pointers to arrays use delete[]. delete p1; // For pointers to var's of basic types use delete. delete p2; // Dito for pointers to single objects. 20

Destruktor 1/2 Der Destruktor wird aufgerufen wenn... das Objekt seinen sogenannten scope verlässt Der scope einer Variablen oder eines Objektes beginnt bei der letzten { davor und endet an der dazugehörigen } void somefunction() { } // A new scope has just begun.... Ball ball; // Constructor called.... // Scope ends now, destructor of "ball" will be called. 21

Destruktor 2/2 Der Destruktor ist auch einfach eine Methode Und heißt wie der Konstruktur, nur mit einer ~ davor In der Deklaration der Klasse in der.h Datei: ~Worm(); Implementierung in der.cpp Datei: Worm::~Worm() { delete[] _posx; // Assuming we had _posx = new int[...] before. delete[] _posy; // Dito. } Wie beim Konstruktor muss man nicht explizit einen Destruktor deklarieren / implementieren Es wird dann am Lebensende des Objektes der Default- Destruktor aufgerufen... der einfach nichts tut 22

Literatur / Links Klassen, Objekte, Methoden, Konstr. und Destr. http://www.cplusplus.com/doc/tutorial/classes/ Dynamische Speicherallokation mit new & delete http://www.cplusplus.com/doc/tutorial/dynamic/ FRIEND_TEST http://code.google.com/p/googletest/wiki/advancedguide #Testing_Private_Code 23

24