Programmierkurs C/C++

Ähnliche Dokumente
Vorkurs C++ Programmierung

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

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

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

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

Programmieren in Java

Fortgeschrittene C++-Programmierung

Java Einführung Methoden in Klassen

Objektorientierte Programmierung mit C++ Vector und List

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

Alltagsnotizen eines Softwareentwicklers

5.4 Klassen und Objekte

3 Objektorientierte Konzepte in Java

Objektorientierte Programmierung

5.5.8 Öffentliche und private Eigenschaften

Vererbung & Schnittstellen in C#

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

Objektorientierte Programmierung. Objektorientierte Programmierung. Klasse. Objekt. Beispiel: Sportfest1. Methode. Eine Einführung mit BlueJ

Objektbasierte Entwicklung

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

Grundlagen. Die Komponenten eines C Programms. Das erste Programm

Einführung in C++ mit Microsoft VS

Javakurs für Anfänger

Eine Einführung in C-Funktionen

GetName(), GetName(), GetGeschlecht() und AelterWerden().

Probeklausur: Programmierung WS04/05

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

1. Von der Idee zur Software 2. Funktionen und Datenstrukturen Lehrbuch: Organisation des Quellcodes 4. Werte- und Referenzsemantik

Grundlagen der Informatik. Prof. Dr. Stefan Enderle NTA Isny

Übersicht. Informatik 2 Teil 3 Anwendungsbeispiel für objektorientierte Programmierung

13 OOP MIT DELPHI. Records und Klassen Ein Vergleich

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

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

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

Objektorientierte Programmierung

C++ - Funktionen und mehr. Kerstin Gößner und Ralf Wondratschek

Java: Vererbung. Teil 3: super()

Praktikum Betriebssysteme 1. Aufgabe (1)

Objektorientierte Programmierung

Objektorientierte Programmierung. Kapitel 12: Interfaces

1. Grundlegende Eigenscha5en 2. Redefini+on 3. Polymophie 4. Mehrfachvererbung

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

Programmieren - Vererbung & Polymorphie

Programmierkurs Java

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2

C vs. C++ Sebastian Meyer. Proseminar C - Grundlagen und Konzepte. Universität Hamburg

Zusammengesetzte Datentypen -- Arrays und Strukturen

3 Objektorientierte Konzepte in Java

Einführung in die. objektorientierte Programmierung

Algorithmen und Datenstrukturen

Klassenbeziehungen & Vererbung

Deklarationen in C. Prof. Dr. Margarita Esponda

13. Vererbung. Prof. Dr. François E. Cellier Informatik I für D-ITET (HS 2012)

Test zu Grundlagen der Programmierung Leitung: Michael Hahsler. 21. November 2003

Objektorientiertes Programmieren für Ingenieure

Übung 9. Quellcode Strukturieren Rekursive Datenstrukturen Uebung 9

Einführung in die C-Programmierung

C++ Kurs Teil 1. Architektur, Anwendungsspektrum, primitive Datentypen, Funktionsaufrufe, Referenzen, Klassen

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

In der Computersprache C ist die Standardmethode zur Behandlung von Matrizen durch

Angewandte Mathematik und Programmierung

1. Übung zu "Numerik partieller Differentialgleichungen"

PIWIN I. Praktische Informatik für Wirtschaftsmathematiker, Ingenieure und Naturwissenschaftler I. Vorlesung 3 SWS WS 2007/2008

C++ - Operatoren. Eigene Klassen mit neuen Funktionen

Moderne C-Programmierung

Angewandte Mathematik und Programmierung

Computeranwendung und Programmierung (CuP)

Programmieren in C. Operatoren, Variablen und deren Sichtbarkeit. Prof. Dr. Nikolaus Wulff

PROGRAMMIEREN MIT C. }, wird kompiliert mit dem Befehl. (-o steht für output) und ausgeführt mit dem Befehl

Programmieren in C. Macros, Funktionen und modulare Programmstruktur. Prof. Dr. Nikolaus Wulff

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

Von der UML nach C++

Objektorientierung: Klassen und Objekte

Institut für Informatik

Informatikpraktikum CE2. Übung 1: Einfach verkettete Liste

Teil 9: Vererbung. Prof. Dr. Herbert Fischer Fachhochschule Deggendorf Prof. Dr. Manfred Beham Fachhochschule Amberg-Weiden

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

Fakultät Angewandte Informatik Lehrprofessur für Informatik

PIWIN 1 Übung Blatt 5

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

7. Objektorientierte Softwareentwicklung/3. Informatik II für Verkehrsingenieure

C++ - Einführung in die Programmiersprache Objektorientierte Programmierung

Jürgen Bayer. OOP mit C++ Von einfachen Klassen über Vererbung zum Polymorphismus

Folge 18 - Vererbung

Angewandte Mathematik und Programmierung

Programmieren II Klassen. Programmieren II Klassen. Programmieren II Klassen. Programmieren II Klassen. Zur Erinnerung.

Proseminar C-Programmierung. Strukturen. Von Marcel Lebek

Name: Klausur Programmierkonzepte SS 2011

C++ Grundlagen. ++ bedeutet Erweiterung zum Ansi C Standard. Hier wird eine Funktion eingeleitet

1 Polymorphie (Vielgestaltigkeit)

Dr. Monika Meiler. Inhalt

EINI WiMa/LW. Einführung in die Informatik für Naturwissenschaftler und Ingenieure. Vorlesung 2 SWS WS 11/12

Kapitel 6. Vererbung

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

Objektorientierung: Klassen und Objekte

Kapitel 6. Vererbung

Transkript:

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 Umständen verschiedenen Typs). int Alter; char Name[256]; Man beachte das ; am Ende der Definition des Structs. Die Variablen innerhalb eines Structs werden auch die Datenmember des Structs genannt. Programmierer anderer objektorientierter Programmiersprachen kennen Datenmember auch unter der Bezeichnung Properties. Anmerkung: In C++ wird das Struct-Konzept zum Klassen-Konzept ausgebaut (siehe unten). In C++ definiert der Code oben bereits einen Typ namens Hamster. In C muss man dafür wiederum auf typedef zurückgreifen: typedef struct Irgendeinname int Alter; char Name[256]; } Hamster; Statt Irgendeinname wäre hier z.b. _Hamster (mit _ am Anfang) oder eine andere Variation des späteren Typnamens üblich. 2

Blockkurs: "Einführung in C/C++" 3 Objekte = Exemplare von Klassen Objekte erzeugt man wie andere Variablen auch: int Alter; char Name[256]; Hamster billy; Typ Objekt Frage: Wie deklariert man ein Objekt? Durch die Definition des Objekts wird Speicher für alle Member-Variablen angelegt. Ein Objekt deklariert man (ohne es dabei zu definieren) wie jede andere Variable: Mit extern (nur bei static-objekten). 3

Blockkurs: "Einführung in C/C++" 4 member selection : Der. -Operator Auf die Member eines Objektes kann man mit dem member-selection-operator. zugreifen: int Alter; char Name[256]; Hamster billy; billy.alter = 4; Bei der Definition einer Klasse werden noch keine Variablen angelegt. Dies geschieht erst, sobald ein Objekt der Klasse erzeugt wird. In diesem Fall wird ein kompletter Satz aller Datenmember der Klasse erzeugt und kann anschließend über den member selection operator aufgerufen werden. 4

Der -> -Operator Blockkurs: "Einführung in C/C++" 5 Hat man einen Pointer auf ein Objekt, so kann man auch den Pfeiloperator -> benutzen. Hamster billy; Hamster * mein_hamster = & billy; mein_hamster->alter = 3; ist das gleiche wie: (*mein_hamster).alter = 3; Man beachte, dass bei der zweiten schreibweise der Ausdruck (*mein_hamster) in Klammern stehen muss, da der member-selection-operator. stärker bindet als der indirection-operator *. Darum bringt der Pfeiloperator -> eine deutliche Verbesserung der Lesbarkeit des Programmes. 5

Blockkurs: "Einführung in C/C++" 6 Objektpointer als Member Eine Klasse C kann Member vom Typ C* enthalten. Bsp.: Hamster * Sohn; Hamster * Mutter; Hamster nina; Hamster billy; billy.mutter = & nina; billy.mutter->sohn = & billy; Anmerkung: Wie man hier klar erkennen kann, hat jedes Objekt seinen eigenen Satz an Membervariablen. In diesem Beispiel gibt es zwei Objekte nina und billy, und beide besitzen jeweils ein Member Sohn und ein Member Mutter. 6

Aggregate Structs lassen sich initialisieren: Blockkurs: "Einführung in C/C++" 7 int Alter; char Name[200]; double Preis; Hamster billy = 2, "Billy", 9.95 Die Reihenfolge der Parameter im Aggregat (innerhalb der }) muss der Reihenfolge der Member des structs entsprechen. Im Beispiel wird Alter also auf 2, Name auf Billy und Preis auf 9.95 initialisiert. Anmerkung: Diese Art der Initialisierung ist nur bei C-artigen structs möglich, nicht aber bei C++-Klassen, die Konstruktoren bzw. Destruktoren besitzen. Für C++-Klassen braucht man auch keine Aggregate, da es in C++ ja das viel mächtigere Konstruktor-Konzept gibt. 7

Blockkurs: "Einführung in C/C++" 8 Aufgabe: Verkettete Listen Schreiben Sie eine Datenstruktur für eine einfach verkettete Liste, in der Alter und Namen von Hamstern gespeichert werden können! struct ListElement int Alter; char Name [200]; ListElement * Next; 8

Blockkurs: "Einführung in C/C++" 9 Aufgabe: Element einfügen Gegeben Pointer auf Listenanfang und Name und Alter eines Hamsters. Fügen Sie ein neues Listenelement an den Anfang der Liste ein! ListElement * inserthamster( ListElement * anfang, int neues_alter, char * neuer_name) //??? } 9

Blockkurs: "Einführung in C/C++" 10 Lösung: Element einfügen ListElement * inserthamster( ListElement * anfang, int neues_alter, char * neuer_name) ListElement * neu = new ListElement; neu->alter = neues_alter; strcpy(neu->name, neuer_name); neu->next = anfang; } return neu; 10

Blockkurs: "Einführung in C/C++" 11 aus Structs werden Klassen In C++ werden die Structs aus C um etliche Features erweitert: - Member-Funktionen - Konstruktoren, Destruktoren - eigene Operatoren - Vererbung -... Außerdem kann man in C++ auch class statt struct schreiben. Der einzige Unterschied zwischen class und struct in C++: Bei class ist vom Default her alles private, bei struct hingegen public, und zwar sowohl bei den Membern als auch bei der Verwerbung (zum Thema private Vererbung siehe unten). 11

Member-Funktionen Zusätzlich zu Daten-Membern kennt C++ Member-Funktionen: Blockkurs: "Einführung in C/C++" 12 int Alter; char Name[256]; void fuettern(); Hamster billy; billy.fuettern(); Member-Funktionen kennt man bei anderen Programmiersprachen auch unter dem Namen "Methoden". 12

Blockkurs: "Einführung in C/C++" 13 Member-Funktionen definieren Member-Funktionen müssen definiert werden. 1. Möglichkeit: Innerhalb der Klassendefinition void fuettern() //jetzt bekommt der Hamster Futter! } Daten-Member müssen nicht extra Definiert werden: Sie werden bei der Erzeugung eines Objektes automatisch miterzeugt. Dies gilt jedoch nicht für statische Daten-Member (siehe unten). 13

Blockkurs: "Einführung in C/C++" 14 Member-Funktionen definieren (2) 2. Möglichkeit: Außerhalb der Klassendefinition void fuettern(); void Hamster::fuettern() //jetzt bekommt der Hamster Futter! } 14

Blockkurs: "Einführung in C/C++" 15 Deklaration und Definition Deklaration Definition Klassen: ; int gewicht; int fuettern(int); Member-Funktionen: int Hamster::fuettern(int x) int fuettern(int); gewicht += x; } Mehrfache Klassendefinitionen stören zwar den Compiler (bei jedem Compile- Durchgang), jedoch nicht den Linker, da bei einer Klassendefinition kein Code erzeugt wird, der verlinkt werden müsste. Darum ist es auch statthaft, Klassen in Header-Dateien zu definieren, und diese Header-Dateien dann in verschiedene cpp-dateien einzubinden. Member-Funktionen können natürlich auch während der Klassendefinition mitdefiniert werden und sind dann automatisch inline. Bei extern definierten Memberfunktionen sieht es hingegen wieder anders aus: Hier würde sich wiederum bei Mehrfachdefinition auch der Linker beschweren es sei denn, die Memberfunktion ist inline definiert. 15

Typisches Vorgehen: Blockkurs: "Einführung in C/C++" 16 Klassen programmieren In eine.h-datei: Klassendefinition In eine.cpp-datei: Definition der Member- Funktionen. Anmerkung: Klassen dürfen also in einer Headerdatei definiert werden. (Frage: Wieso?) Verstößt man beim Definieren von Klassen in Headern nicht gegen die "one definition rule", sobald man die Headerdatei in mehr als zwei.cpp-dateien inkludiert? Nein, denn: Es spielt keine Rolle, dass die Klasse für jede.cpp-datei, die den Header einbindet, erneut definiert wird, da eine Klassendefinition keinen Speicherplatz reserviert und auch keinen Code erzeugt. Trotzdem darf eine Klasse nicht zweimal in der gleichen.cpp definiert werden, d.h. die Headerdatei darf von einer.cpp nicht doppelt "includet" werden. Anmerkung: Im Gegensatz zu gewissen anderen Kaffee-Programmiersprachen gibt es in C++ keinen Zwang, die Dateien so zu nennen, wie die Klassen, die sie definieren. Man darf auch ruhig mehrere Klassen in einer Datei definieren, auch wenn dies nicht unbedingt empfohlen wird. 16

Blockkurs: "Einführung in C/C++" 17 Member-Funktion kennt Objekt Eine Member-Funktion weiß, zu welchem Objekt sie aufgerufen wurde: void fuettern() ++Gewicht; } int Gewicht; Hamster billy; billy.fuettern(); cout << billy.gewicht; erhöhe 17

Der this-pointer Blockkurs: "Einführung in C/C++" 18 In einer Member-Funktion zeigt der this-pointer auf das aktuelle Objekt: void fuettern() ++( this->gewicht ); } int Gewicht; this hat den Typ Hamster * Man hätte in fuettern auch einfach schreiben können: ++ Gewicht; Der this-pointer ist nur innerhalb einer Memberfunktion bekannt, dort aber ohne weitere Deklaration. Tatsächlich wird der this-pointer beim Aufruf der Funktion fuettern() der Funktion als verstecktes erstes Argument übergeben. Auch Konstruktoren und der Destruktor (siehe unten) kennen den this-pointer. 18

public und privat Blockkurs: "Einführung in C/C++" 19 private schützt Member vor Zugriff von außen : private: bool ist_satt; public: void fuettern() ist_satt = true; } Hamster billy; billy.ist_satt = true; //Fehler! Bei Klassen, die mit dem Schlüsselwort class statt struct erzeugt werden, sind die Member ohne Angaben des Schlüsselwortes public automatisch private. Es gibt außerdem das Schlüsselwort protected. Member, die protected deklariert worden sind, verhalten sich so, als wären sie private deklariert, ausgenommen für abgeleitete Klassen: Eine abgeleitete Klasse kann auf die protected Member ihrer Basisklasse (oder der Basisklasse ihrer Basisklasse, usw.) zugreifen. 19

Konstruktoren Blockkurs: "Einführung in C/C++" 20 Konstruktoren = Spezielle Member-Funktionen, die automatisch bei der Erzeugung eines Objektes aufgerufen werden: Hamster() Alter = 0; } int Alter; Konstruktoren geben keinen Typen zurück (nicht einmal void). Konstruktoren werden vor allem dazu verwendet, ein Objekt zu initialisieren. Ein Konstruktor, der ohne Argument aufgerufen werden kann, wird Default- Konstruktor genannt. 20

Blockkurs: "Einführung in C/C++" 21 Konstruktoren mit Argumenten Konstruktoren können Argumente haben: Hamster( int alter ) Alter = alter; } int Alter; Hamster billy(3); Wichtig: Den Default-Konstruktor (ohne Argument) ruft man ohne Klammern auf! Wenn es für die Klasse Hamster also einen Default-Konstruktor gibt (wie auf der vorangegangenen Folie), dann schreibt man einfach: Hamster billy; nicht aber Hamster billy(); //Fehler! 21

Destruktor Blockkurs: "Einführung in C/C++" 22 Destruktoren werden aufgerufen, wenn das Objekt zerstört wird. Hamster (char * name = "Billy") Name = name; printf("hamster geboren! :-)\n"); } ~Hamster () printf("hamster stirbt! :-(\n"); } char * Name; (Das Programm geht auf der nächsten Folie weiter) 22

(Fortsetzung) Blockkurs: "Einführung in C/C++" 23 void hamsterleben() Hamster billy; printf("es lebe der Hamster!\n"); printf("er heißt %s.\n", billy.name); } Starte: hamsterleben() Ausgabe:? Hamster geboren! :-) Es lebe der Hamster! Er heißt Billy. Hamster stirbt! :-( Bei Destruktoren gibt es keine Möglichkeit der Überladung: Jede Klasse kann nur einen Destruktor haben. 23

Blockkurs: "Einführung in C/C++" 24 mehrere Konstruktoren Konstruktoren sind oft überladen: Hamster () Gewicht = 0; } Hamster (int X) Gewicht = X; } int Gewicht; Hamster billy(20); std::cout << billy.gewicht; //20 24

Blockkurs: "Einführung in C/C++" 25 Überladung bei normalen Funktionen Verschiedene Funktionen mit gleichem Namen: int max(int a, int b) if (a > b) return a; return b; } int max(int a, int b, int c) return max( max(a, b), c ); } 25

Überladung: Regeln Blockkurs: "Einführung in C/C++" 26 Die überladenen Funktionen müssen sich (paarweise) voneinander unterscheiden: Durch die Zahl ihrer Argumente oder Durch den Typ des i-ten Arguments Es reicht nicht, wenn sich nur der Typ des Rückgabewertes unterschiedet. Bsp.: int f()... } char f()... } // Fehler! Beide f haben 0 Argumente. 26

Blockkurs: "Einführung in C/C++" 27 Überladene Member-Funktionen Memberfunktionen können überladen werden: void fuettern(int X) Gewicht += X; } void fuettern() ++Gewicht; } int Gewicht; 27

Blockkurs: "Einführung in C/C++" 28 Objekte auf Heap und Stack Objekte auf Stack oder auf Heap erzeugen: int main() Hamster a; Hamster b[100]; Hamster * c = new Hamster[50]; //... } delete [] c; return 0; Der new Operator ruft die Konstruktoren aller 50 Hamsterobjekte auf. Man beachte, dass hier der delete []-Operator verwendet werden sollte, damit auch am Ende der Funktion die Destruktoren aller 50 Hamsterobjekte aufgerufen werden. 28

Aufgaben zum Donnerstag: 9. Aufgabe: Schreiben Sie verschiedene Klassen, wobei sie Anzahl, Typen und die Reihenfolge der Daten-Member variieren. Lassen Sie sich anschließend mit sizeof() die Größe des für die Objektinstanzen benötigten Speichers ausgeben. Probieren Sie ein wenig herum und stellen Sie anschließend eine Theorie darüber auf, wie sich die Größe einer Klasse aus den Membern ableiten lässt. 10. Aufgabe: Schreiben Sie eine Klasse, die eine doppelt verkettete Liste implementiert und Zahlen vom Typ int speichert. Implementieren Sie die Member-Funktionen insert und extract zum Einfügen eines neuen Elements in die Liste hinter dem aktuellen Element bzw. zum Löschen des aktuellen Elements aus der Liste PRÜFUNGSAUFGABE: Schreiben Sie eine Klasse "best3", die folgende Member-Funktionen exportiert: 1. Eine Member-Funktion "push(unsigned int x)", mit der man der Klasse eine Zahl x übergeben kann. 2. Eine Member-Funktion "print()", welche die Werte der drei größten Zahlen, die bisher mit "push" übergeben worden sind, auf dem Bildschirm ausgibt. Sollten bisher weniger als drei Zahlen mit "push" eingegeben worden sein, so soll die Funktion auch nur diese bisher eingegebenen Zahlen ausgeben. Hinweis: In einem Objekt vom Typ "best3" müssen tatsächlich zu jedem Zeitpunkt nur drei der bislang eingegebenen Zahlen gespeichert werden, d.h. es ist nicht nötig, alle mit "push" eingegebenen Zahlen in "best3" abzuspeichern. Denken Sie daran, dass sie bis morgen (Freitag) alle vier Prüfungsaufgaben fertig haben sollten. 29