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

Ähnliche Dokumente
7. Übung Informatik II - Objektorientierte Programmierung

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

HSR Rapperswil 2001 Markus Rigling. Programmieren: Vererbung. 1 Variante 2

Programmierkurs C/C++

Objektorientierte Programmierung

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

C++ - Einführung in die Programmiersprache Header-Dateien und Funktionen. Leibniz Universität IT Services Anja Aue

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

Einführung in C# Teil 3. Matthias Nübling

Vorausgesetzte Grundkenntnisse. Inhalt. Klassenhierarchie und Vererbung. Vererbung. Klassenhierarchie und Vererbung. Einführung in C# Teil 3

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

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

Vorkurs C++ Programmierung

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

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

Grundkurs C++ IDE Klassenhierarchien

C++ - Objektorientierte Programmierung Konstruktoren und Destruktoren

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

Grundkurs C++ IDE Klassenhierarchien

Prof. W. Henrich Seite 1

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

Objektorientierung: Klassen und Objekte

Einstieg in die Informatik mit Java

Objektorientierte Programmierung mit C++ SS 2007

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

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

3D Programmierpraktikum: Einführung in C++ - Teil 2

Crashkurs C++ Wiederholung

Java Vererbung. Inhalt

Programmieren in C++ Klassen

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

Lösung der OOP-Prüfung WS12/13

Programmieren in C++

Implementieren von Klassen

Mikrorechentechnik II. Klassen in C++

HSR Rapperswil 2001 Markus Rigling. Programmieren: Templates Auflage

Vorlesung Datenstrukturen

C++ - Objektorientierte Programmierung Vererbung

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

Objektorientierte Programmierung und Klassen

C++ - Objektorientierte Programmierung Konstante und statische Elemente

Aufbau von Klassen. class punkt {...

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Methoden und Wrapperklassen

C/C++-Programmierung

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

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

Dynamische Datenstrukturen in C++ 150

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

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

Vererbung & Schnittstellen in C#

RO-Tutorien 15 und 16

Objektorientierte Programmierung Studiengang Medieninformatik

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

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

Programmieren in C++ Templates

1 Klassen und Objekte

Objektorientierung (OO)

Einführung in C++ mit Microsoft VS

C++ vs. Java. Hello world! Java C++ class HelloWorld { static public void main(string args) { System.out.println("Hello World!

1.4. Funktionen. Objektorientierte Programmierung mit C++

C/C++-Programmierung

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

Repetitorium Informatik (Java)

Überblick. 5. Objekt und Klasse, Elementfunktionen

Name: Klausur Informatik III WS 2003/04

Einstieg in die Informatik mit Java

C++ - Variablen: Gültigkeit - Sichtbarkeit

C++ - Eine Ubersicht fur Java-Programmierer

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

Programmierkurs C/C++

RO-Tutorien 3 / 6 / 12

Programmierkurs C++ Konstruktor, Statische Methoden Namespaces

2.13 Vererbung. Rainer Feldmann Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/ Article

Java I Vorlesung Vererbung und Sichtbarkeit

6. Globalübung (zu Übungsblatt 8)

Globale Variablen Diverses. Globale Variablen. Globale Variablen

Angewandte Mathematik und Programmierung

14 Abstrakte Klassen, finale Klassen, Interfaces

Arten von Klassen-Beziehungen

14 Abstrakte Klassen, finale Klassen, Interfaces. Auswertung von Ausdrücken. Beispiel. Abstrakte Methoden und Klassen

Programmierkurs Java

3. Exkurs in weitere Arten der Programmierung

Konzepte der Programmiersprachen

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

C++ Klassen weitere Funktionen

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

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

Einführung in die Programmierung mit C++

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

Programmierkurs C++ Kapitel 6 Module Seite 1

Vererbung und Polymorphie

Objektorientiert in C++

::Zweck. Sicherstellung, dass nur eine Instanz einer bestimmten Klasse existiert

Tücken der dynamischen Bindung

RO-Tutorien 17 und 18

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

Crashkurs C++ - Teil 1

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

C/C++ Programmierung

Transkript:

C++ Klassen, Vererbung Philipp Lucas phlucas@cs.uni-sb.de Sebastian Hack hack@cs.uni-sb.de Wintersemester 2008/09 saarland university computer science 1

Inhalt Klassen in C++ Sichtbarkeit Erzeugen von Objekten Vererbung Methoden Überladen Default-Parameter virtual C und C++: Unterschiede und Kompatibilität Kompatibilität Inkompatibilitäten zwischen C und C++ 2

C++ Übersicht Objektorientierte Erweiterung von C Viele andere Erweiterungen: Schablonen (templates) Operatorüberladung Überladung von Funktionen Referenzen Umgebungen (namespaces)... Weitestgehend abwärtskompatibel zu C Interoperabel mit C: C kann C++ Funktionen rufen und umgekehrt 3

Klassen in C++ class Bruch { int _z, _n; void kuerze () { int g = ggt (_z, _n ); _z /= g; _n /= g; } bool istganz () { return _n == 1; } }; Bruch ( int z, int n) : _z(z), _n(n) { } Deklaration ähnlich zu Java Nicht den ; am Ende der Vereinbarung vergessen! Konvention: private-felder mit vorangestelltem Konstruktor ist Methode ohne Rückgabetyp, die den Namen der Klasse trägt Spezialsyntax für die Initialisierung der Felder 4

Klassen in C++ Sichtbarkeit class Bruch { int _z, _n; void kuerze () { int g = ggt (_z, _n ); _z /= g; _n /= g; } public : bool istganz () { return _n == 1; } }; Bruch ( int z, int n) : _z(z), _n(n) { } Wie in Java kann man die Sichtbarkeit von Methoden und Feldern einschränken: public überall sichtbar protected Nur in Klasse und Unterklassen sichtbar private Nur in Klasse selbst sichtbar Keine Paket-Sichtbarkeit wie in Java 5

Klassen in C++ Sichtbarkeit class A { public :... private :... public :... protected :... }; Sichtbarkeitsbezeichner leitet Abschnitt ein Alle Vereinbarungen nach public: sind public bis zum nächsten Sichtbarkeitsbezeichner Standard-Sichtbarkeit bei Klassen: private Anstatt class kann man auch struct schreiben Standard-Sichtbarkeit ist dann public Ansonsten kein Unterschied 6

Klassen in C++ Erzeugen von Objekten void test () { Bruch eins ; Bruch einhalb (1, 2);... } Das Name Tag kann direkt als Typ verwendet werden (im Unterschied zu C) Funktioniert auch mit struct und union Konstruktor-Argumente werden nach dem Bezeicher des Objekts in Klammern angegeben Bruch eins; ruft Default-Konstruktor Bruch::Bruch() Jede Klasse muss einen Default-Konstruktor! haben (im Unterschied zu Java) Gibt es keinen, wird er automatisch angelegt er tut aber nichts insb. initialisiert er keine Felder 7

Klassen in C++ Erzeugen von Objekten void test () { Bruch eins ; Bruch einhalb (1, 2);... } Die Lebenszeit von eins und einhalb ist auf die Ausführung von test beschränkt Kehrt test zurück, sterben beide Objekte eins und einhalb wurden in der Aufrufschachtel von test angelegt Man kann Objekte auch auf der Halde erzeugen void test () { Bruch * eins = new Bruch (); Bruch * einhalb = new Bruch (1, 2);... } Es gibt keine automatische Speicherbereinigung Mit new erstellte Objekte müssen weider freigegeben werden: delete eins ; 8

new und delete new reserviert Speicher auf der Halde und ruft den entspr. Konstruktor einer Klasse auf delete ruft den Destruktor auf und gibt den Speicher wieder frei Wozu Destruktoren? 9

new und delete new reserviert Speicher auf der Halde und ruft den entspr. Konstruktor einer Klasse auf delete ruft den Destruktor auf und gibt den Speicher wieder frei Wozu Destruktoren? Die freizugebenden Objekte müssen u.u. andere Objekte freigeben malloc und free sind rufbar, jedoch rufen beide nicht Kon-/Destruktoren Regel In C++ immer new und delete verwenden 9

Reihungen Reihungen von Objekten sind keine Reihungen von Referenzen Mit A* arr = new A [10]; werden 10 A Objekte angelegt, und 10 mal der entspr. Konstruktor aufgerufen Die Reihung enthält 10 A Objekte Das Freigeben muss mit delete[] erfolgen, und nicht mit delete delete arr ; // Undefiniertes Verhalten delete [] arr ; // Ruft Destruktoren aller Elemente auf Fallstrick: Einem Zeiger sieht man nicht an, ob er auf eines oder auf mehrere Objekte zeigt 10

Vererbung Sichtbarkeit class Bruch : public Paar {... }; Sichbarkeitsbezeichner steuert Sichtbarkeit der ererbten Felder/Methoden public Sichtbarkeit wird nicht modifiziert protected public Felder werden protected private Alles wird private 11

Vererbung Initialisierung class Bruch : public Paar { Bruch () : Paar () { } Bruch ( int z, int n) : Paar (z, n) { } }; Der Konstruktor der Oberklasse muss explizit gerufen werden Kein automatisches Rufen wie in Java 12

Methoden Überladen class Bruch { public : void set ( int z, int n) { _z = z; _n = n; } void set ( int z) { _z = z; _n = 1; } void set ( const Bruch & b) { _z = b._z; _n = b._n; } }; Methoden können überladen werden Methoden mit gleichem Namen müssen sich in den Typen der Parameter unterscheiden Wie in Java 13

Operatorüberladung Ausblick Operatoren sind auch Methoden Sie werden nur anders hingeschrieben: a τ b anstatt τ(a, b) und τ a anstatt τ(a) Man kann in C++ für eigene Typen eine eigene Implementierung der meisten Operatoren angeben (aka Operatorüberladung): class Bruch {... public : Bruch operator *( const Bruch & b) { return Bruch (_z * b._z, _n * b._n ); } }; 14

Default-Parameter class Bruch {... public : void set ( int z, int n = 1) { _z = z; _n = n; } void set ( const Bruch & b) { _z = b._z; _n = b._n; } }; Methodenparameter können mit voreingestellten Werten gekennzeichnet werden Wird kein anderer Wert vom Aufrufer gewünscht, kann das Argument entfallen Default-Parameter sind immer die letzten in der Parameterliste Es darf zu keinen Widersprüchen kommen, z.b. wäre im obigen Beispiel die Methode void set ( int z) {... } nicht erlaubt, da bei einer Aufrufstelle set (5); nicht klar wäre, welche Methode gerufen werden soll void set ( int z, int n = 1) {... } gerufen werden soll. 15

Überschreiben Im Gegensatz zu Java gibt es in C++ zwei Arten der Überschreibung Standardmässig wird der statische Typ zur Ermittlung der zu rufenden Methode herangezogen Durch Kennzeichnen der Methodendeklaration mit virtual kommt der dynamische Typ zum Einsatz Abstrakte Methode: Anhängen von = 0; an die Deklaration struct A { char f() { return A ; } virtual char g() { return A ; } }; struct B : public A { char f() { return B ; } virtual char g() { return B ; } }; void test () { A* a = new B (); // statischer Typ : A B *b = new B (); // statischer Typ : B a->f (); // Ergebnis : A a->g (); // Ergebnis : B b->f (); // Ergebnis : B b->g (); // Ergebnis : B } 16

Destruktoren Destruktoren werden (automatisch) aufgerufen, wenn ein Objekt stirbt Sei es auf der Halde oder auf dem Keller Destruktoren sollte man angeben, wenn das Objekt Ressourcen belegt, die freigegeben werden sollten Ansonsten ist der Destruktor leer Destruktoren sollten immer virtual sein Destruktion muss nach dem dynamischen Typ erfolgen An der Stelle der Destruktion kann der statische Typ unpräziser sein class Vector { int _len ; double * _arr ; public : Vector ( int len ) : _len ( len ), _arr ( new double [ _len ]) { } virtual ~ Vector () { delete [] _arr ; } }; 17

Inhalt Klassen in C++ Sichtbarkeit Erzeugen von Objekten Vererbung Methoden Überladen Default-Parameter virtual C und C++: Unterschiede und Kompatibilität Kompatibilität Inkompatibilitäten zwischen C und C++ 18

Kompatibilität zwischen C und C++ Übersicht C und C++ sind weitestgehend kompatibel C++ Übersetzer können die meisten C Programme übersetzen Man kann C++ Funktionen für C Programme rufbar machen Die C-Kompatibilität von C++ basiert auf C90 Das meiste aus C99 ist in C++ nicht verfügbar 19

Binden von C und C++ Code Zur Auflösung der Überladung verwendet C++ name mangling Beispiel: // foo.c int foo ( double x, char s) {... } Übersetzt man die Datei mit c++, dann heißt das Symbol Z3foodc Die Parametertypen werden in den Symbolnamen kodiert Übersetzt man die Datei mit cc, dann heißt das Symbol foo C kennt keine Überladung; Symbolname = Funktionsname 20

Binden von C und C++ Code Möchte man C-Funktionen von C++ aus rufen, so muss man das name mangling für diese deaktivieren // myprg. cpp extern " C" int foo ( double x, char s); int myfunc () { return foo (1.234, A ); } C++ Übersetzer weiß nun, dass foo in einer C-Bibliothek liegt Das name mangling wird für foo deaktiviert Der Binder (Linker) sucht nach dem Symbolnamen foo, nicht Z3foodc Zum Verwenden der C-Standardbibliothek in C++ muss man andere Header einbinden: #include <cstdio> anstelle von #include<stdio.h>, usw. 21

Binden von C und C++ Code C Header für C++ nutzbar machen Die Headerdateien vieler C-Bibliotheken sehen so aus: # ifndef MYHEADER_H # define MYHEADER_H # ifdef cplusplus extern "C" { # endif /* Inhalt */ # ifdef cplusplus } # endif # endif /* MYHEADER_H */ Dies macht die C-Funktionen für C++ rufbar 22

Inkompatibilitäten zwischen C und C++ Namensraum von struct/union Tags In C bilden die Typtags von structs und unions einen eigenen Namensraum int foo ; struct foo { int x, y; }; struct foo foo_struct ; In C++ sind sie im Namensraum der Variablen Vorsicht: Der Übersetzer kann nicht immer warnen extern int foo ; int test () { struct foo { }; return sizeof ( foo ); } In C und C++ gültig Rückgabewert in C: sizeof(int), in C++: sizeof(struct foo) 23

Inkompatibilitäten zwischen C und C++ Verschiedene C++ hat mehrere neue Schlüsselwörter int class ; double template ; ist ok in C, aber nicht in C++ a hat Typ int in C und char in C++ sizeof( a ) kann unterschiedliche Werte in C und C++ haben enum-konstanten sind int in C, haben aber eigene Typen in C++ void * nicht mehr implizit in andere Zeiger umwandelbar int * x = malloc (20 * sizeof (* x )); geht in C, aber nicht in C++ Filescope const Variablen sind static in C++ und extern in C usw. 24

Interoperabilität zwischen C und C++ Fazit C Programme sind nicht ohne weiteres mit C++ Übersetzern verarbeitbar Viele kleine Unterscheide Das Schlimmste: Manches ist in C und C++ erlaubt, wird aber anders interpretiert Daher: C-Dateien mit cc übersetzen, C++-Dateien mit c++ Gemeinsam genutzte Funktionen mittels extern "C" deklarieren Den Binder beide Welten zusammenfügen lassen 25