Programmieren Teil: Objektorientierung

Slides:



Advertisements
Ähnliche Präsentationen
C Sharp (C#) Martin Saternus Senior Student Partner
Advertisements

Ziele von EINI I + II Einführen in „Informatik“
der Universität Oldenburg
1 Funktionstemplates Einbinden von Templates: –Eine *.o Datei, die durch Übersetzen einer Datei nur mit Templates erzeugt wurde, enthält keinen Programmcode.
Objektorientierte Programmierung
DVG Einfache Klassen Einfache Klassen. DVG Einfache Klassen 2 Strukturen Beispiel: Personendaten bestehen aus –String name –String vorname.
Konzepte objektorientierter Systeme
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
Java: Objektorientierte Programmierung
Java: Dynamische Datentypen
Indirekte Adressierung
Java: Grundlagen der Sprache
Java: Referenzen und Zeichenketten
Java: Grundlagen der Objektorientierung
Strukturen. In einer Struktur kann eine beliebige Anzahl von Komponenten (Daten) mit unterschiedlichen Datentypen (im Gegensatz zu Feldern) zusammengefaßt.
Konstruktoren.
Polymorphie (Vielgestaltigkeit)
Dynamischer Speicher. In einer Funktion wird z.B. mit der Deklaration int i; Speicher auf dem sogenannten Stack reserviert. Wenn die Funktion verlassen.
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 5 Polymorphismus Sommersemester 2003 Lars Bernard.
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
Programmieren mit JAVA
Programmieren mit JAVA
PKJ 2005/1 Stefan Dissmann Ausblick Es fehlen noch: Möglichkeiten zum Strukturieren größerer Programme Umgang mit variabler Zahl von Elementen Umgang mit.
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Bisher im Kurs erarbeitete Konzepte(1): Umgang mit einfachen Datentypen Umgang mit Feldern Umgang mit Referenzen.
Objektorientierte Programmierung
14StrukturKlasse1 Von der Struktur zur Klasse von C zu C++ Von Jens Hoffmann
DVG Klassen und Objekte
DVG Einfache Klassen 1 Einfache Klassen. 2DVG Einfache KlassenStrukturen Beispiel: Personendaten bestehen aus String name String name.
© 2002 Dr. Cavelius - Ley - Pohlig - Taulien Programmierung im Netz und Internet: Einführung in die Programmiersprache Java Teil I 1 Klassen Objekte von.
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
Einführung in die Programmierung
Einführung in die Programmierung
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Objektorientierte Konzepte/UML Geoinformation I Vorlesung 2 WS 2000/2001.
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung Wintersemester 2011/12 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Entwicklung verteilter Anwendungen I, WS 13/14 Prof. Dr. Herrad Schmidt WS 13/14 Kapitel 1 Folie 2 Microsoft.NET Framework: Quelle:
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Informatik 1 Letzte Übung.
OOP-Begriffe Abstraktion Modellieren Klasse Objekt Attribute Methoden
Dynamische Datentypen
Programmierung 1. Einführung Seite 1
EPROG Tutorium #4 Philipp Effenberger
EPROG Tutorium #6 Philipp Effenberger
Wilfried Imrich CuP - Java Erste Vorlesung Entspricht ungefähr Kapitel 1.1 des Skriptums Wilfried Imrich Montanuniversität Leoben Freitag, 4. Oktober 2002.
Programmieren ... in C++ Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I.
Polymorphie (Vielgestaltigkeit). Wenn eine Methode, wie z.B. print für verschiedene Programmteile steht (und z.B. einmal Objekte verschiedener Klassen.
Informatik I : Software höhere Programmiersprachen Java Klassen: hat Methoden (Funktionen) und Daten (Variablen) es kann mehrere Klassen geben nur eine.
OOP-Begriffe Abstraktion Modellieren Klasse Objekt Attribute Methoden
Einführung in die Programmierung mit Java
Java-Kurs Übung Besprechung der Hausaufgabe
Java-Kurs - 5. Übung Besprechung der Übungsaufgabe Klassen und Objekte
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer, Dr. Gerhard Gröger Einführung in die Programmierung mit Java 5. Vorlesung WS 2002/2003.
Einführung in die Programmierung mit Java 5. Vorlesung WS 2002/2003 Institut für Kartographie und Geoinformation Prof.-Dr. Lutz Plümer, Dr. Gerhard Gröger,
Objektorientierte (OO) Programmierung
Vererbung. Klassen - Vererbung  Eine Klasse kann von einer Basisklasse abgeleitet werden  Die abgeleitete Klasse erbt die Eigenschaften und Methoden.
Tutorium Software-Engineering SS14 Florian Manghofer.
C++ FÜR cOMPUTERSPIELENTWICKLER
1 Grundsätze objektorientierter Programmierung. Dr. Wolfram Amme, Grundsätze objektorientierter Programmierung, Informatik II, FSU Jena, SS Objektorientierte.
Implementieren von Klassen
 Präsentation transkript:

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

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. Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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++ Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

Was gibt’s heute? Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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) Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

31.03.2017 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++. C++ ist damit eine „Hybrid“-Sprache, d.h. es befinden sich sowohl Elemente der imperativen Programmierung als auch der objektorientierten Programmierung in der Sprachdefinition. Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

Klassisches, prozedurales Konzept Funktion Funktion Funktion Daten und Funktionen keine Einheit. Problemfelder: Fehlerhafte, unzulässige Zugriffe, Nicht-initalisierte Variablen, ... Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

Objektorientiertes Konzept Eigenschaften Methoden Eigenschaften Methoden Nachricht Nachricht [Erhoffte] Vorteile:: Kein Bruch zwischen Design und Implementierung, Höhere Softwaresicherheit Wiederverwendung von Code Kennzeichen: Datenabstraktion Datenkapselung Vererbung Polymorphie Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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. Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

Objekt - Definition Definition: Ein Objekt ist eine Software-Einheit, die aus Daten (Attributen) und Funktionalitäten (Verhalten, Methoden) besteht. Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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“ Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

Beispiel für Abstraktion Objekte Gebäude Instanziierung Abstraktion Eigenschaften Grundfläche Anzahl Stockwerke Einheitswert ... Methoden Errichten Abreissen Reinigen 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 ... Gebäude 1: Eigenschaften Grundfläche: 45 qm Anzahl Stockwerke: 3 Einheitswert: 21900,-- ... Methoden ... Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

Quelle: http://asi-www.informatik.uni-hamburg.de/lehre/nf/ 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/ Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

Kapselung Eigenschaften: private Objekt Methoden Eigenschaften Eigenschaften Öffentliche Schnittstellen Eigenschaften Methoden Öffentliche Schnittstellen Methoden Methoden Eigenschaften: private Setzen und Abfragen nur über get- und set-Methoden Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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; }; Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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; Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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; Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

Strukturvariablen – Kopieren ... 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; ptrGeoPoint verweist auf die Stelle im Speicher, an der p1 gespeichert ist. Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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. Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

Ausgangssituation: C-Strukturen Zusammenfassung zusammengehörender Daten + Erlaubte Operationen + Zugriffskontrollmechanismen + Weitere Spezialitäten = C++ > > > Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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 Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

Deklaration einer Klasse Ähnlich wie Deklaration von Strukturen  Schlüsselwort class (statt struct) class CGeoPoint { private: char szId[20]; double dftEasting; double dftNorthing; }; Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

Anlegen von Objekten class CGeoPoint p1, p2, p3; Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

Unterschiede zwischen Strukturen und Klassen 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! Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

Fragespiel Nennen Sie die Unterschiede zwischen einer Struktur und einer Klasse in C++. Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

Klassendeklaration Generelle Form: classtyp klassenname { public: ELEMENTE protected: ELEMENTE private: ELEMENTE } instanzen; classtyp Standard: class Ebenfalls möglich: struct, union, da diese spezielle C++-Klassen darstellen. Empfehlung: nur class verwenden Klassenname Name der zu deklarierenden Klasse Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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)! Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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 Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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; } Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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 Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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); Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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.setzen ptPoint->printCoords(); // Koord. ausgeben p3.printCoords(); // für p3 natürlich identische Ausgabe. Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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. Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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. Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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); Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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). Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

Fragespiel Was macht Wie lautet die Syntax? Ein Konstruktor? Ein Destruktor? Wie lautet die Syntax? Warum mehrere Konstruktoren? Was ist eine Instanz? Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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); … Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

Vergleich Initialisierungsliste / Zuweisung Für Referenzen und konstante Attribute die einzige Möglichkeit, Werte zu setzen. Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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"; Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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); Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

Kopierkonstruktor: Beispiel CGeoPoint::CGeoPoint (const CGeoPoint & SamplePoint) { cout << "Kopierkonstruktor aufgerufen (" << SamplePoint.szId << ")" <<endl; strcpy(szId,SamplePoint.szId); dftEasting = SamplePoint.dftEasting; dftNorthing = SamplePoint.dftNorthing; } Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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. str1 MyString str1("Hallo"); MyString str2 = str1; ? lLength szBuffer Hallo\0 str2 lLength szBuffer Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

Kopierkonstruktoren für dynamische Elemente  Kopierkonstruktor für Klassen muss dynamische Elemente selbst definieren.  Kopiervorgang muss nicht die Zeiger, sondern die Datenelemente kopieren! Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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: -> Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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. Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

Standard-Zuweisung: Beispiel Datentyp: Referenz auf CGeoPoint CGeoPoint operator=( const CGeoPoint & OtherObject) { cout << "Standardzuweisung (" << OtherObject.szId << ")" <<endl; strcpy(szId,OtherObject.szId); dftEasting = OtherObject.dftEasting; dftNorthing = OtherObject.dftNorthing; return *this; } Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

Standard-Zuweisung: Problem Problem: Einfache Zuweisung nicht ausreichend, wenn eine Klasse dynamische Objekte enthält.  Standardzuweisung für Klassen mit dynamischen Elementen selbst definieren. Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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-Terminator strcpy(pszBuffer,MySourceString.pszBuffer); } return *this; } Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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. Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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; } Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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. Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

Zugriffsmethoden II 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; } get-Methoden Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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! Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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 Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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 ); }; Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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!) Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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! Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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! Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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; } Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

Objekte als Argumente: call by value  ein übergebenes Objekt wird in ein lokales Objekt kopiert.  Achtung: Nach Abschluss der Funktion wird der Destruktor aufgerufen! 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()); } // Objekt als Argument CGeoPoint p2("2",3500000.0,5400000.0); CGeoPoint p3("3",0.0,0.0) cout << "Back from isEqual. Result: " << isEqual(p2,p3) << endl; Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

Objekte als Argumente: call by reference Schnellere Performance, da kein neues Objekt angelegt und vernichtet werden muss. Über Referenzen oder Zeiger 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()); } // Objekt als Argument CGeoPoint p2("2",3500000.0,5400000.0); CGeoPoint p3("3",0.0,0.0) cout << "Back from isEqual. Result: " << isEqual(p2,p3) << endl; Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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); Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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 Kopie CGeoPoint p10; p10 = createPointByFunction(); p10.printCoords(); Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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 Referenz geoPoint p11; p11 = createPointByFunctionWithReference (); p11.printCoords(); Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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; } Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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); Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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 Nachkommastellen cout.setf(ios::fixed); // normales Format, keine Exponentendarstellung return output << "Rechtswert = " << myPoint.dftEasting << " " << "Hochwert = " << myPoint.dftNorthing; } … CGeoPoint p10("2",3500000.0,5400000.0); cout << p10 << endl; Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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 { } Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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; } Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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; } }; Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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); Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

Speicherverwaltung in C++ Speicherverwaltung muss richtig funktionieren effektive Performance zeigen. Jedoch: In C wie C++ können "Lücken" im Speicher entstehen ("Speicherlecks") Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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! Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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); Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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; } Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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. Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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; Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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. Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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 Punktobjekte delete pP2; // mit Freigabe des Speichers cout << "End Program" << endl; return 0; } Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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 Speichers delete [ ] pPList; cout << "End Program" << endl; return 0; } Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

Speicherverwaltung für Feld von Objekten: Ergebnis Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

Anhang Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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; Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

Klassen verfügen über Zugriffsmechanismen Zugriffsmechanismen definieren geschützte und öffentliche Bereiche class geoPoint { private: ... public: char szId[20]; double dftEasting; double dftNorthing; ... Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003

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 { } Hochschule für Technik, Stuttgart Prof. Dr.-Ing. Franz-Josef Behr SS 2003