85
Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Embed Size (px)

Citation preview

Page 1: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2002

1

ProgrammierenTeil: Objektorientierung

Franz-Josef Behr

WS 2002/2003

Page 2: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

2

Literatur

• P.Prinz, U.Kirch-Prinz: C ++, Lernen und professionell anwenden, MITP-Verlag, 1999

• Martin Auppele: Die Kunst der Programmierung mit C++. Exakte Grundlagen für die professionelle Softwareentwicklung. Vieweg, ISBN 3-528-15481-0, 1042 S.

• Stroustrup, Bjarne: Die C++-Programmiersprache; Addison-Wesley, 2000, 1048 S.

• Liberty, Jesse: C++ in 21 Tagen. Markt und Technik, 2000

• Louis, Dirk: C/C++ Kompendium, Markt & Technik, 2000, 1259 S.

Page 3: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

3

Was gibt’s überhaupt?

• Klassen und Objekte• Konstruktoren• Konstruktoren für dynamische Objekte• Destruktor• Der this-zeiger• Felder von Objekten• Eigene Datentypen und Streams• Speicherverwaltung in C++

Page 4: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

4

Was gibt’s heute?

Page 5: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

5

Eigenschaften von C++

– Enthält C als Teilmenge (modular, effizient, maschinennah, portabel)

– Erweiterungen zu C sind Referenzen, Templates, Ausnahmebehandlung,...

– Mischsprache (nicht rein objektorientiert, kennt auch Standardtypen und prozedurale Abläufe)

– Formatfreie Sprache

– strenge Typkontrolle durch Compiler

– Unterstützt Konzepte der OOP (Kapselung, Vererbung, Polymorphie)

Page 6: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

6

Geschichte von C++

• Anfang der 80er Jahre von Bjarne Stroustrup von AT&T entwickelt.

• echte Obermenge von C - jedes gültige C-Programm ist auch ein gültiges C++-Programm. Anstoß zur Entwicklung: Bewältigung der Komplexität, das Betriebssystem UNIX so aufzuteilen, daß es auch auf mehreren CPUs laufen konnte.

• 1985: AT&T entwickelt ersten kommerziellen C++-Compiler

• seit 1990: ANSI-Komitee X3J16 zur Standardisierung von C++.

Page 7: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

7

Klassisches, prozedurales Konzept

• Daten und Funktionen keine Einheit.• Problemfelder:

– Fehlerhafte, unzulässige Zugriffe,

– Nicht-initalisierte Variablen,

– ...

Funktion Funktion Funktion

Page 8: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

8

Objektorientiertes Konzept

Kennzeichen:• Datenabstraktion• Datenkapselung• Vererbung• Polymorphie

Eigenschaften

Methoden

Eigenschaften

Methoden

Objekt 1 Objekt 2

[Erhoffte] Vorteile::• Kein Bruch zwischen Design

und Implementierung,• Höhere Softwaresicherheit• Wiederverwendung von

Code

Nachricht

Nachricht

Page 9: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

9

Warum Objektorientierung?

• Objektorientierung nicht nur bei Programmierung, sondern auch in– Datenbanktechnologie, GIS-Technologie,

– Entwurf von Benutzeroberflächen,

– Analyse und Software-Design.

• Grundidee: Objekte der realen Welt abbilden.• Objekte sind „Bausteine“ für Programme.

Re a lw e lt

M o d e ll

M o d e llie ru n g, Ab stra ktio n ,Au ssch n itt

Page 10: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

10

Objekt - Definition

• Definition:Ein Objekt ist eine Software-Einheit, die aus Daten (Attributen) und Funktionalitäten (Verhalten, Methoden) besteht.

R ealw e lt

M ode ll

E ntität

O bjekt

Identität

E igenschaften

Verha lten

Facheigenschaften

O bjektgeom etrie

D arstellung

M etaeigenschaften

fach liche S ich t,A bstraktion,K ategoris ierung

Page 11: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

11

Eigenschaften / Attribute

• Definition:Ein Attribut ist eine benannte, charakteristische Eigenschaft eines Objekts bzw. aller Objekte (Instanzen) einer Klasse.

• Eigenschaften werden als Attribute geführt. Diese sind– Datenelemente eines bestimmten Datentyps,– Bezeichnet durch einen Namen,– In denen Werte gespeichert und aus denen Werte ausgelesen werden können.

• Beispiele:– Name eines Professors: Attribut = „Name“, Wert = „Behr“, Typ = „Zeichenkette“– Hähnchen in der Mensa: Attribut = „Knusprigkeit“, Wert = „2“, Typ = „ganzzahlig“

Page 12: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

12

Gebäude ...:

Eigenschaften•Grundfläche: 45 qm•Anzahl Stockwerke: 3•Einheitswert: 21900,--

...Methoden

•...

Gebäude 2:

Eigenschaften•Grundfläche: 45 qm•Anzahl Stockwerke: 3•Einheitswert: 21900,--

...Methoden

•...

Beispiel für Abstraktion

Eigenschaften•Grundfläche•Anzahl Stockwerke•Einheitswert...

Methoden•Errichten•Abreissen•Reinigen•...

GebäudeA

bst

rakt

ion

Inst

anzi

ieru

ng Gebäude 1:

Eigenschaften•Grundfläche: 45 qm•Anzahl Stockwerke: 3•Einheitswert: 21900,--

...Methoden

•...

Objekte

Page 13: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

13

Kapselung

• Definition:Kapselung bedeutet, dass Daten und Implementation nach außen hin unsichtbar sind.Der Zugriff auf die Eigenschaften (Attribute und Methoden) von Objekten wird nur gemäß der Schnittstellenbeschreibung gewährt („öffentliche Schnittstelle“).

• Ziele:– Verbergen möglicherweise komplizierter Einzelheiten,

– Klare Definition der Schnittstelle,

– Unabhängigkeit der Benutzung eines Objekts von seiner Implementierung im Detail – Implementierung austauschbar.

Quelle: http://asi-www.informatik.uni-hamburg.de/lehre/nf/

Page 14: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

14

Kapselung

• Eigenschaften: private• Setzen und Abfragen nur über get- und set-Methoden

Methoden

Methoden

Met

ho

den

Met

ho

den

EigenschaftenEigenschaftenEigenschaftenÖffentlicheSchnittstellen

ÖffentlicheSchnittstellen

Objekt

Page 15: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

15

Zusammengesetzte Datentypen - Strukturen

• Struktur (struct, record):

– Zusammengesetzter heterogener Datentyp

– Zusammenfassung von Variablen beliebiger Datentypen

Gemeinsame Verarbeitung dieser Elemente/Daten/Werte

• Deklaration

struct Identifier variableDefinition{ ; } ;

struct GeoPoint{ double dftEasting, dftNorthing;};

Page 16: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

16

Definition von Variablen des Typs "Struktur"

• Definition einer Strukturvariablen erfolgt analog zur bekannten Variablendefinition durch

Typname Variablenname

• Beispiel:

struct GeoPoint{ double dftEasting, dftNorthing;};Point p1, p2, pn;

Page 17: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

17

Zugriff auf Elemente einer Strukturvariablen

• Verwendung des Zugriffs-/Auswahloperators zwischen Name der Strukturvariablen und Membername

• Bsp.:

p1.dftEasting = 3513189.891;p1.dftNorthing = 5404181.142;

• Struktur = Bezugsrahmen für Membernamen Definition gleichnamiger Variablen erlaubt!

double dftEasting = 3500000;p1.dftEasting = dftEasting;

Page 18: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

18

• Sie können Strukturen kopieren mittels Zuweisungsoperator =GePoint p2;p2 = p1;

• Zeiger auf Strukturen analog zu anderen Zeigern:strukturname * pointername;GeoPoint* ptrGeoPoint = &p1;

• Zugriff auf Member via Zeiger:– Dereferenzierung * (incl. Klammern ())

und Auswahloperator . (* ptrGeoPoint).dftEasting += 10;

– Verweisoperator ->ptrGeoPoint->dftNorthing -= 10;

Strukturvariablen – Kopieren ...

ptrGeoPoint verweist auf die

Stelle im Speicher, an der p1

gespeichert ist.

Page 19: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

19

Sicherheit?

• The use of structs is discouraged since these only contain public data.

• In interfaces with other languages (such as C), it may, however, be necessary to use structs.

Page 20: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

20

Ausgangssituation: C-Strukturen

Zusammenfassung zusammengehörender Daten

+Erlaubte Operationen

+ Zugriffskontrollmechanismen

+

Weitere Spezialitäten

=

C++

>

>

>

Page 21: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

21

Klassen

• Erweiterung von Strukturen Zusammenfassung zusammengehörender Daten (Attribute)

• + erlaubte Operationen (Methoden)• Klassen werden deklariert und definiert

Schablone für zu erzeugende Variablen• Variablen von Klassen = Objekte• Erzeugung von Objekten über spezielle Methoden Konstruktoren• Zerstörung von von Objekten Destruktor• Zugriffsmechanismen für geschützte und öffentliche Bereiche• Klassen stehen untereinander in einer hierarchischen Ordnung

Page 22: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

22

Deklaration einer Klasse

• Ähnlich wie Deklaration von Strukturen Schlüsselwort class (statt struct)

class CGeoPoint{

private:char szId[20];double dftEasting;double dftNorthing;

};

Page 23: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

23

Anlegen von Objekten

• class CGeoPoint p1, p2, p3;

P13500000.05400000.0

P23500005.05400000.0

P33500005.05400005.0

Page 24: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

24

Unterschiede zwischen Strukturen und Klassen

• Unterschiede:– syntaktisch: Schlüsselwort class (statt struct)

– semantisch: Zugriff nicht ohne weiteres möglich

• Datenkapselung mittels Schlüsselwörter– private kein Zugriff von außen möglich

– public Definition von öffentlichen Attributen

• Wenn alle Attribute einer Klasse == public: Klasse entspricht Struktur!

Page 25: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

25

Fragespiel

• Nennen Sie die Unterschiede zwischen einer Struktur und einer Klasse in C++.

Page 26: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

26

Klassendeklaration

classtyp• Standard: class• Ebenfalls möglich: struct,

union, da diese spezielle C++-Klassen darstellen.

• Empfehlung: nur class verwenden

• Generelle Form:

classtyp klassenname{ public: ELEMENTE protected: ELEMENTE private: ELEMENTE} instanzen; Klassenname

• Name der zu deklarierenden Klasse

Page 27: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

27

Klassendeklaration II

Public, protected, private• Zugriffsmodifizierer,• legen fest, auf welche Elemente

der Klasse von außen zugegriffen werden kann.

• Generelle Form:

classtyp klassenname{ public: ELEMENTE protected: ELEMENTE private: ELEMENTE} instanzen;

ELEMENTE• Deklaration und ggf. Definition

von Datenelementen und Elementfunktionen

instanzen• Definition von Instanzen

(Variablen) dieses Klassentyps• Optional (an dieser Stelle)!

Page 28: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

28

Deklaration und Definition

• Die Deklaration einer Klasse sagt dem Compiler, um welche Klasse es sich handelt, welche Daten sie aufnimmt und welche Funktionen sie ausführt. Die Deklaration der Klasse bezeichnet man als Schnittstelle (Interface), da der Benutzer hieraus die Einzelheiten zur Interaktion mit der Klasse entnehmen kann. Die Schnittstelle speichert man in der Regel in einer .h-Datei, einer sogenannten Header-Datei.

• Die Funktionsdefinition sagt dem Compiler, wie die Funktion arbeitet. Man bezeichnet die Funktionsdefinition als Implementierung der Klassenmethode und legt sie in einer .cpp-Datei ab. Die Implementierungsdetails der Klasse sind nur für den Autor der Klasse von Belang. Klienten der Klasse - das heißt, die Teile des Programms, die die Klasse verwenden - brauchen nicht zu wissen (und sich nicht darum zu kümmern), wie die Funktionen implementiert sind.

Quelle: Liberty, Jesse: C++ in 21 Tagen. Markt und Technik, 2000

Page 29: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

29

Hello World – objektorientiert II

• Klasse, Instanziierung und Aufruf in main.

#include <iostream.h>#include <string.h>class MyMessage{public:

MyMessage (char * pszString) { strcpy(szMessage,pszString); }void show() { cout << szMessage << endl;}

private:char szMessage[256];

};int main(int argc, char* argv[ ], char* envp[ ]){

MyMessage hello("Hello World!");hello.show(); cout << PROGNAME << " finished." << endl;

return 0;}

Page 30: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

30

Deklaration von Objekten

• Voraussetzung: Klasse ist definiert.• Wie bei Variablen üblich, erfolgt die Deklaration durch Angabe des

Datentyps und den Namen des Objekts.• Syntax:

Klassenname Objektbezeichner1 [Objektbezeichner2, ...];• Beispiel

CGeoPoint p1;• Effekt:

– Für die Daten des Objekts p1 wird der entsprechende Speicherplatz reserviert.

– Es erfolgt keine Initialisierung ( Konstruktoren!).– Sind die Datenelemente public, so können den Datenelementen Werte

zugewiesen werden usw.

Instanziierung

Page 31: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

31

Zugriff auf Elemente

• Zugriff auf Elemente kann nur auf public-Elemente erfolgen.• Zugriff erfolgt wie bei Strukturvariablen mit Hilfe des Punkt- oder des

Pfeiloperators.

• Beispiel für Zugriff auf Datenelemente:CGeoPoint p1;p1.dftEasting = 3500000.0;p1.dftNorthing = 5400000.0;

• Beispiel für Zugriff auf Elementfunktionen:CGeoPoint p1;p1.setcoords(3500000.0,5400000.0);

Page 32: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

32

Zugriff auf Elemente über den Pfeiloperator

• Wenn ein Zeiger (pointer) auf ein Objekt weist, kann auf public-Elemente über den Pfeiloperator -> zugegriffen werden.

CGeoPoint::setCoords(double x, double y){ dftEasting = x; dftNorthing = y;}CGeoPoint::printCoords(){

cout << "Point " << id << ": " << dftEasting << ", " << dftNorthing << " " <<endl;}...CGeoPoint p3, *ptPoint;

ptPoint = &p3; // ptPoint zeigt auf p3;ptPoint->setCoords(3600000.0, 5500000.0);// Koord.setzenptPoint->printCoords(); // Koord. ausgebenp3.printCoords(); // für p3 natürlich identische

Ausgabe.

Page 33: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

33

Konstruktoren

• Werden durch Definition von Instanzen (= Variablen eines Klassentyps) aufgerufen

• Name des Konstruktors: identisch mit Klassennamen

• i. d. R. im public-Bereich, für uneingeschränkten Zugriff.

• Konstruktor besitzt keinen Ergebnistyp – auch nicht void!

• Dient der Initialisierung von Datenelementen der Klasse

• Ein Konstruktor kann nicht direkt aufgerufen werden (um z.B. eine nochmalige Initialisierung zu erreichen).

Die Verknüpfung von Instanzbildung und Initialisierung durch den Konstruktor entspricht dem objektorientierten Prinzip der Kapselung.

Page 34: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

34

Default-Konstruktor

• Kein selbstdefinierter Konstruktor? Compiler erzeugt minimalen Standardkonstruktor (ohne Initialisierung) selbst.

• Ist wenigstens ein eigener Konstruktor definiert, muss auch der parameterlose Default-Konstruktor selbst definiert werden, soll er denn zur Verfügung stehen.

Page 35: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

35

Verwendung mehrerer Konstruktoren

• Werden mehrere Konstruktoren definiert ("Überladen von Funktionen"), kann einer dieser Konstruktoren für die Instanziierung ausgesucht werden.

CGeoPoint::CGeoPoint() // Konstruktor{

cout << "Default-Konstruktor aufgerufen" << endl; strcpy(id,"0"); dftEasting = 0.0; dftNorthing = 0.0;

} CGeoPoint::CGeoPoint(double x, double y) // Konstruktor 2{

cout << "Konstruktor 2 aufgerufen (" << x << ", " << y << ")" <<endl;

strcpy(id,"0"); dftEasting = x; dftNorthing = y;}...

CGeoPoint p1;p1.dftEasting = 3500000.0; p1.dftNorthing = 5400000.0;CGeoPoint p2(3500000.0,5400000.0);

Page 36: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

36

Aufgabe

• Schreiben Sie einen weiteren Konstruktor, der ein Punktobjekt mit Punktnummer, Rechts- und Hochwert initialisiert.

• Testen Sie Ihren Konstruktor, in dem Sie weitere Objekte über diesen Konstruktor definieren und sich ihre Werte anzeigen lassen (Memberfunktion displayValues).

Page 37: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

37

Fragespiel

• Was macht– Ein Konstruktor?

– Ein Destruktor?

• Wie lautet die Syntax?• Warum mehrere Konstruktoren?• Was ist eine Instanz?

Page 38: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

38

Initialisierung mittels Initialisierungsliste

• Initialisierungsliste enthält alle Initialisierungen, die beim Aufruf des Konstruktors ausgeführt werden.

• durch einen Doppelpunkt (:) vom Funktionskopf getrennt;• wird vor dem eigentlichen Anweisungsteil eines Konstruktors ausgeführt

class CGeoPoint{

private:char id[20];double dftEasting; double dftNorthing;

public:CGeoPoint::CGeoPoint(double x, double y):

dftEasting(x), dftNorthing(y){ strcpy(id,"0"); }

...int main(){ CGeoPoint p1(3500000.0,5400000.0); …

Page 39: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

40

Konstruktoraufruf mit Wertzuweisung

• Wenn Konstruktor nur einen Parameter hat, kann man den Übergabewert beim Definieren des Objekts auch einfach zuweisen, statt eine eingeklammerte Übergabe auszuführen:

class CGeoPoint {...}CGeoPoint::CGeoPoint(char * szInitId) // Konstruktor{

cout << "Konstruktor 4 für Punkt " << szInitId << endl;strcpy(szId,szInitId);dftEasting = 0.0;dftNorthing = 0.0;

}...

// Definition eines Objekts mit zugewiesenem Parameterwert:

CGeoPoint p3b = "10";

Page 40: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

41

Kopierkonstruktor

• Definition:Klassenname::Klassenname(const Klassenname & Muster);

• Kein eigener Kopierkonstruktor? Compiler erzeugt minimalen Standard-Kopierkonstruktor.

• Dieser kopiert die Daten des übergebenen Objekts in das neue Objekt.

• Beispiele für Aufruf:class CGeoPoint p20 = p3;class CGeoPoint p21(p3);

Page 41: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

42

Kopierkonstruktor: Beispiel

CGeoPoint::CGeoPoint (const CGeoPoint & SamplePoint){

cout << "Kopierkonstruktor aufgerufen (" << SamplePoint.szId << ")" <<endl;

strcpy(szId,SamplePoint.szId);dftEasting = SamplePoint.dftEasting;dftNorthing = SamplePoint.dftNorthing;

}

Page 42: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

43

Kopierkonstruktoren für dynamische Elemente

• Problem: Duplizierung nicht ausreichend, da– sonst beide Elemente auf identischen Speicherplatz verweisen würden,

– Probleme bei der Speicherfreigabe zu erwarten sind.

lLength

lLength

Hallo\0

szBuffer

szBuffer

str2

str1 MyString str1("Hallo");MyString str2 = str1; ?

Page 43: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

44

Kopierkonstruktoren für dynamische Elemente

Kopierkonstruktor für Klassen muss dynamische Elemente selbst definieren.

Kopiervorgang muss nicht die Zeiger, sondern die Datenelemente kopieren!

Page 44: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

45

Standard-Zuweisung

• Standard-Zuweisung neben Default-Konstruktor, Kopierkonstruktor und Destruktor implizit definierte Standard-Methode.

• Zuweisung erfolgt datenelementweise auf existierendes Objekt,• Kann mehrfach vorgenommen werden.

• Aufrufbeispiel:class CGeoPoint p20, p21; p21 = 20 = p2;

Beispiel: ->

Page 45: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

46

Standard-Zuweisung: Syntax

• Syntax:Objektklasse operator=( const Objektklasse & Muster ){ … }

• Aufrufbeispiel:class CGeoPoint p20, p21; p21 = 20 = p2;

• Ansatz: Überladen des Operators =.

• Die Aktionen, die bei der Zuweisung ausgeführt werden sollen, sind durch eine Methode mit Namen operator=() festgelegt.

• Eine Zuweisung s1 = s2 entspricht somit dem Aufruf dieser Methode:s1.operator=(s2);

• Der Parameter von operator=() ist eine Referenz auf das Objekt, das auf der rechten Seite der Zuweisung steht.

Page 46: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

47

Standard-Zuweisung: Beispiel

CGeoPoint operator=( const CGeoPoint & OtherObject)

{cout << "Standardzuweisung (" <<

OtherObject.szId << ")" <<endl;strcpy(szId,OtherObject.szId);dftEasting = OtherObject.dftEasting;dftNorthing = OtherObject.dftNorthing;return *this;

}

Datentyp: Referenz auf CGeoPoint

Page 47: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

48

Standard-Zuweisung: Problem

• Problem: Einfache Zuweisung nicht ausreichend, wenn eine Klasse dynamische Objekte enthält. Standardzuweisung für Klassen mit dynamischen Elementen selbst definieren.

Page 48: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

49

Standard-Zuweisung für dynamische Elemente

MyString MyString::operator=(const MyString & MySourceString){

if ( this != &MySourceString) // falls keine Selbstzuweisung{

lLength = MySourceString.lLength;delete [ ] pszBuffer;pszBuffer = new char(lLength + 1); // einschl. Platz für Null-

Terminatorstrcpy(pszBuffer,MySourceString.pszBuffer);

}return *this;

}

Page 49: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

50

Destruktor

• Aufgabe: "Abbau" ordnungsgemäß aufgebauter Objekte, wie z.B.• Speicherplatzfreigabe• Andere Aufgaben, wie z.B. Schließen von Dateien, ...• Destruktor zerstört die Datenelemente von Objekten in umgekehrter

Reihenfolge, wie sie aufgebaut wurden.

Page 50: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

51

Definition eines Destruktors

• Definition:Klassenname::~Klassenname() { }

• Aufruf:– Bei Ende eines Blocks für alle lokal deklarierten Objekte, die nicht zur

Speicherklasse static gehören

– Bei allen sonstigen Objekten (global oder static definiert) am Programmende.

CGeoPoint::~CGeoPoint() // Destruktor{

cout << "Destruktor aufgerufen für Punkt " << szId <<endl;}

Page 51: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

52

Zugriffsmethoden

• Datenkapselung Datenelemente eines Objekts gehören normalerweise in den private-Bereich einer Klasse.

Setzen und Auslesen von Werten erfolgt über Zugriffsmethoden (set- und get-Methoden).

• Vorteile:– Zugriffsmethoden können Bereichsprüfungen vornehmen und

fehlerhafte Werte abfangen

– Zugriffsmethoden verstecken implementationsabhängige Details von Klassen. Es ist jederzeit möglich, die interne Darstellung von Daten zu ändern, während die öffentliche Schnittstelle unverändert bleibt.

Page 52: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

53

Zugriffsmethoden II

get-Methoden

set-Methode

CGeoPoint::setCoords(double x, double y){

this->dftEasting = (x > 3000000 && x < 4000000) ? x : 0.0;this->dftNorthing = (y > 5300000 && y < 5900000) ? y : 0.0;

}

double CGeoPoint::getEasting(){

return dftEasting;}

double CGeoPoint::getNorthing(){

return dftNorthing;}

Page 53: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

54

Zugriffsmethoden: Namenskonventionen

• Abfragen, z.B.:int getProperty()

• Setzen:setProperty(int value)

• bei Bool-Werten auch:bool isProperty() // hat das Objekt

// die Eigenschaft …

• Zugriffsmethoden aus Performancegründen immer inline deklarieren!

Page 54: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

55

Anmerkung zu Zugriffsrechten

• Beliebige Anzahl und Reihenfolge von private und public• Dennoch:

– Attribute gleicher Zugriffsrechte zusammenfassen

– Beginne mit kleinstem Zugriffsrecht

• Warum soll ich Attribute privat deklarieren? Prinzip der Kapselung

• Aber dann kann ich doch nicht mehr drauf zugreifen!? Dafür besitzen Klassen (öffentliche und geschützte) Methoden :-)

• Methoden von Klassen• Kontrollierter Zugriff auf geschützte Attribute

Sicherung konsistenter Attributwerte

Page 55: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

56

Deklaration von Elementfunktionen ... innerhalb

• innerhalb der Klassendeklaration (analog zu Attributen)• Zugriffsrechte wie Attribute• Gleicher Name, unterschiedliche Parameterlisten Überladen von Methoden

class Wertepaar{ private: int wert1; int wert2; public: void setzeWert1( int w ); void setzeWert1( ); int holeWert1( void ); void setzeWert2( int w ); int holeWert2( void );};

Page 56: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

57

Bedeutung der Elementfunktionen

• Typischerweise: "Kleine" Elementfunktionen stellen das öffentliche Interface der Klasse dar Integrität der Daten und ausreichende Funktionalität werden sichergestellt.

• Effizienter Aufruf als inline-Funktion durch– explizite Definition (vorangestelltes Schlüsselwort inline) oder

– Implizite Definition durch innerhalb der Klassendefinition (Schlüsselwort inline kann, aber muss nicht stehen; Lesbarkeit!)

Page 57: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

58

const bei Objekten

• Ein Objekt kann wie jede Variable auch als const deklariert werden Objekt muss natürlich initialisiert werden! Objekt kann nicht mehr verändert werden.

• Deklaration einer Elementfunktion als const: Feste Zusage, dass die Methode die Werte der Datenelemente der Klasse auf keinen Fall ändert. Beispiel: double CGeoPoint::getX(void) const;

• Methoden, die nur lesend auf Daten zugreifen, müssen als solche gekennzeichnet sein, um einen Zugriff auf const-Objekte zu ermöglichen!

• Das Schlüsselwort const gehört zur Signatur der Funktion read-only- und"normale" Variante möglich!

Page 58: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

59

const - Empfehlung

• Verwenden Sie const, wo immer möglich!

• Deklarieren Sie Elementfunktionen, die den Zustand des Objekts nicht ändern sollen, stets als const. Der Compiler kann Ihnen dann die Fehlersuche erleichtern. Das geht schneller und ist weniger aufwendig, als wenn Sie es selbst machen müssten!

Page 59: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

60

Der Zeiger this

• Elementfunktionen arbeiten mit dem Objekt, für das die Elementfunktion aufgerufen wurde.

• Information (= Adresse des aktuellen Objekts) wird über ein "unsichtbares" Argument übergeben.

• Adresse steht der Elementfunktion über den konstanten Zeiger this zur Verfügung.

• Über den Zeiger this können Elemente direkt angesprochen werden.

• Zugriff über *this auf das Objekt als Ganzes, z.B. Rückgabe:return *this;CGeoPoint::setCoords(double x, double y){

this->dftEasting = x;this->dftNorthing = y;

}

Page 60: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

61

Objekte als Argumente: call by value

ein übergebenes Objekt wird in ein lokales Objekt kopiert. Achtung: Nach Abschluss der Funktion wird der Destruktor aufgerufen!

// Objekt als ArgumentCGeoPoint p2("2",3500000.0,5400000.0);CGeoPoint p3("3",0.0,0.0)cout << "Back from isEqual. Result: " << isEqual(p2,p3) << endl;

inline bool isEqual(CGeoPoint p1, CGeoPoint p2) {

cout << "Start isEqual (" << p1.getID() << ", " << p2.getID() << endl;return (strcmp(p1.getID(),p2.getID()) == 0 &&

p1.getEasting() == p2.getEasting() && p1.getNorthing() == p2.getNorthing());

}

Page 61: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

62

Objekte als Argumente: call by reference

• Schnellere Performance, da kein neues Objekt angelegt und vernichtet werden muss.

• Über Referenzen oder Zeiger

// Objekt als ArgumentCGeoPoint p2("2",3500000.0,5400000.0);CGeoPoint p3("3",0.0,0.0)cout << "Back from isEqual. Result: " << isEqual(p2,p3) << endl;

inline bool isEqual(CGeoPoint & p1, CGeoPoint & p2) {

cout << "Start isEqual (" << p1.getID() << ", " << p2.getID() << endl;return (strcmp(p1.getID(),p2.getID()) == 0&&

p1.getEasting() == p2.getEasting() && p1.getNorthing() == p2.getNorthing());

}

Page 62: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

63

Objekte als Argumente: call by reference mit Zeiger

• Objekt als Zeiger-Argument: Funktion / Methode kann verändernd darauf zugreifen.

• Beispiel: Vertauschen zweier Objekte

void geoPoint::swapValues(CGeoPoint* p1){

CGeoPoint myTempPoint = *p1;*p1 = *this;*this = myTempPoint;return;

}

CGeoPoint p7("7",70.0,70.0);CGeoPoint p8("8",80.0,80.0);p8.swapValues(&p7);

Page 63: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

64

Objekt als Return-Wert

• Rückgabe eines Objekts in Kopie nur bei kleineren Objekten sinnvoll.

• Lokales Objekt wird zerstört.

• Beispiel:

CGeoPoint createPointByFunction(void){

CGeoPoint myNewPoint("10",10.0,10.0);return myNewPoint;

}

// Rückgabe eines Objekts in KopieCGeoPoint p10;p10 = createPointByFunction();p10.printCoords();

Page 64: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

65

Objekt als Return-Wert als Referenz

• Effizienter als zuvor genanntes Verfahren

geoPoint& createPointByFunctionWithReference(void){

geoPoint myNewPoint("10",11.0,11.0);return myNewPoint;

}

// Rückgabe eines Objekts als ReferenzgeoPoint p11;p11 = createPointByFunctionWithReference ();p11.printCoords();

Page 65: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

66

Felder von Objekten (Klassen-Arrays)

• Geeignet für Verwaltung vieler Objekte einer Klasse• Deklaration gemäß C-Syntax

#include <iostream.h>#include "geoPoint.h"int main(){

CGeoPoint geoPointArray[] ={

CGeoPoint(),CGeoPoint("2",3500000.0,5400000.0),CGeoPoint(3500003.0,5400003.0),"4"

};cout << "Anzahl angelegter Objekte: " <<

sizeof(geoPointArray) / sizeof(CGeoPoint) << endl;return 0;

}

Page 66: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

67

Eigene Datentypen und Streams

• Die beiden Operatoren << und >> können mit eigenen Datentypen überladen werden.

• Wichtig ist die Signatur, als Ergebnis wird immer eine Referenz auf den aktuellen Stream zurückgeliefert.

ostream& operator<< (ostream&, MeineKlasse);

istream& operator>>(istream&, MeineKlasse);

Page 67: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

68

Eigene Datentypen und Streams: Beispiel

• Überladen wird der Operator <<, um direkt Objekte der Klasse CGeoPoint ausgeben zu können.

ostream& operator<<(ostream& output, const CGeoPoint& myPoint){

cout.precision(2); // 2 Stellen für Nachkommastellencout.setf(ios::fixed); // normales Format, keine Exponentendarstellungreturn output << "Rechtswert = " << myPoint.dftEasting << " "

<< "Hochwert = " << myPoint.dftNorthing;}

…CGeoPoint p10("2",3500000.0,5400000.0);cout << p10 << endl;

Page 68: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

69

Klassen-Arrays Beispiel I

typedef struct{ char id[20]; double easting; double northing;} geoPointStruct;const int MAX = 10;class GeoPointList{ geoPointStruct list[MAX]; int numInList;public:

GeoPointList::GeoPointList(): numInList(0) // constructor { } ~GeoPointList() // destructor { }

Page 69: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

70

Klassen-Arrays Beispiel II

int Full() { if (numInList >=MAX) return 1; else return 0; }

int Empty(){ if (numInList==0) return 1; else return 0;}int Size(){return numInList;}

Page 70: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

71

Klassen-Arrays Beispiel III

int Add(geoPointStruct geoPoint){ if (!Full()) { list[numInList++]=geoPoint; return 0; // returns 0 if OK } return 1;}

int Get(geoPointStruct& addr, int i){ if (i < Size()) { addr=list[i]; return 0; // returns 0 if OK } return 1;}};

Page 71: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

72

Methoden mit Objekt als Argument

• Elementfunktion verknüpft "ihr" Objekt mit [einem] anderen, das als Argument übergeben wird.

void geoPoint::getValuesFrom(geoPoint& p1){

strcpy(id,p1.getID());easting = p1.getEasting();northing = p1.getNorthing();return;

}

geoPoint p6("6",10.0,20.0);geoPoint p4("4",3500000.0,5400000.0);p6.getValuesFrom(p4);

Page 72: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

73

Speicherverwaltung in C++

• Speicherverwaltung muss– richtig funktionieren

– effektive Performance zeigen.

• Jedoch:In C wie C++ können "Lücken" im Speicher entstehen ("Speicherlecks")

Page 73: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

74

Speicherverwaltung mit new und delete

• Statt malloc() und free() in C werden die Operatoren new und delete verwendet.

• new stellt Speicher auf dem sog. Heap bereit; dieser Speicherbereich kann durch Swapping auf der Festplatte sehr groß werden große Flexibilität in der Softwareentwicklung.

• new und delete für Standard-Datentypen und Objekte verwendbar!

Page 74: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

75

new und delete für Standard-Datentypen

• Syntax:Zeiger_auf_Typ = new Typ; new reserviert Speicherplatz für eine Variable des angegebenen Typs und gibt die Adresse zurück.

• Beispiel:long* plPunktnummer;plPunktnummer = new long; Speicherplatz für eine Variable des Typs long wird reserviert und die Adresse dem Zeiger plPunktnummer zugewiesen.

• Initialisierung ist über Angabe des Werts in Klammern möglich. plPunktnummer = new long(4711);

Page 75: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

76

new und delete für Standard-Datentypen: Beispiel

#include <iostream.h>long *plPunktnummer;int main(){ plPunktnummer = new long(1234567); cout << "An der Adresse " << plPunktnummer << " findet sich der Wert " << *plPunktnummer << "." << endl; delete plPunktnummer; return 0;}

Page 76: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

77

new und delete für Felder

• Syntax:Zeiger_auf_Typ = new Typ[anzahl]; new reserviert Speicherplatz für insgesamt anzahl Feldelemente des angegebenen Typs und gibt die Adresse zurück.

• Beispiel:long *plPunktnummer, lAnzahl = 10;plPunktnummer = new long[lAnzahl]; Speicherplatz für 10 Variable des Typs long wird reserviert und die Adresse dem Zeiger plPunktnummer zugewiesen.

• Ansprache der Feldelemente.plPunktnummer[0] = *plPunktnummer;plPunktnummer[1] = *(plPunktnummer+1);...

• Angabe von Initialisierungswerten ist nicht möglich.

Page 77: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

78

new und delete für Felder II

• Wurde Speicher für ein Feld mit new reserviert, muss zur Freigabe des Speichers der Operator delete [ ] aufgerufen werden.

• Beispiel:

long *pv = new long[100];...delete [ ] pv;

Page 78: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

79

new und delete: Vorteile

• Operand für new = Typ des anzulegenden Objekts. keine sizeof-Angabe notwendig!

• Compiler kennt Typ Objekt wird korrekt über einen Konstruktor erzeugt. Auch ein dynamisch erzeugtes Objekt kann initialisiert werden.

• new liefert immer einen Zeiger mit dem richtigen Typ zurück. kein casting notwendig!

• delete ruft für Objekte den Destruktor auf. Objekte werden "ordnungsgemäß" zerstört.

• Nicht genug Speicherplatz vorhanden? New-Handler wird aufgerufen. Funktion zur zentralen Fehlerbehandlung. Notwendigkeit, bei Reservieren von Speicher einen Rückgabewert abzufragen, entfällt!

• Eigener New-Handler kann installiert werden.

• new und delete sind Operatoren können überladen werden. für eigene Klassen optimierte Speicherverwaltung möglich.

Page 79: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

80

Speicherverwaltung für Klassen

• Ein Aufruf von new für Klassen entspricht dem Aufruf für Standard-Datentypen

• Verwendet werden der Konstruktor bzw. – je nach Initalisierungsliste – verschiedene Konstruktoren.

#include <iostream.h>#include "geoPointWithNew.h"int main(){

cout << "Start Program" << endl;geoPoint* pP1, *pP2;pP1 = new geoPoint();pP2 = new geoPoint("2",3500000.0,5400000.0);delete pP1; // Loeschen der Punktobjektedelete pP2; // mit Freigabe des Speicherscout << "End Program" << endl;return 0;

}

Page 80: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

81

Speicherverwaltung für Feld von Objekten

#include <iostream.h>#include "geoPointWithNew.h"int main(){

geoPoint *pP2;pP2 = new geoPoint("2",3500000.0,5400000.0);const long MAX_COUNT = 10;geoPoint * pPList = new geoPoint[MAX_COUNT];pPList[1] = geoPoint();pPList[1] = geoPoint(3500000,5400000);pPList[2] = *pP2;pPList[3] = geoPoint("3",3500003,5400003);for (int i=0; i <= 3; i++){

pPList[i].printCoords();}delete pP2; // mit Freigabe des Speichersdelete [ ] pPList;cout << "End Program" << endl;return 0;

}

#include <iostream.h>#include "geoPointWithNew.h"int main(){

geoPoint *pP2;pP2 = new geoPoint("2",3500000.0,5400000.0);const long MAX_COUNT = 10;geoPoint * pPList = new geoPoint[MAX_COUNT];pPList[1] = geoPoint();pPList[1] = geoPoint(3500000,5400000);pPList[2] = *pP2;pPList[3] = geoPoint("3",3500003,5400003);for (int i=0; i <= 3; i++){

pPList[i].printCoords();}delete pP2; // mit Freigabe des Speichersdelete [ ] pPList;cout << "End Program" << endl;return 0;

}

Page 81: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

82

Speicherverwaltung für Feld von Objekten: Ergebnis

Page 82: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

83

Anhang

Page 83: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

84

Klassen fassen Attribute zusammen

• Klassen werden deklariert und definiert Schablone für zu erzeugende Variablen

• Variablen von Klassen = Objekte

class xypoint{ double x; double y; long pnr;};

...

class p1 xypoint;

Page 84: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

85

Klassen verfügen über Zugriffsmechanismen

• Zugriffsmechanismen definieren geschützte und öffentliche Bereiche

class geoPoint{private:...public: char szId[20]; double dftEasting;double dftNorthing;...

Page 85: Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef BehrSS 2002 1 Programmieren Teil: Objektorientierung Franz-Josef Behr WS 2002/2003

Hochschule für Technik, StuttgartProf. Dr.-Ing. Franz-Josef Behr SS 2003

86

Klassen verfügen über weitere Mechanismen

• Erzeugung von Objekten über spezielle Methoden Konstruktoren• Zerstörung von von Objekten Destruktor• Klassen stehen untereinander in einer hierarchischen Ordnung

geoPoint::geoPoint() // Konstruktor{

strcpy(szId,"1");dftEasting = 0.0; dftNorthing = 0.0;

}

geoPoint::~geoPoint() // Destruktor{}