Objektorientiertes Programmieren in C++

Ähnliche Dokumente
Objektorientiert in C++

TEIL I: OBJEKTORIENTIERUNG UND GRUNDKURS JAVA GRUNDLAGEN DER PROGRAMMIERUNG... 4

Programmieren mit Java

Ulla Kirch Peter Prinz C+ + Lernen und professionell anwenden. mitp

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

Objektorientierte Prozeßsimulation in C++

Objektorientierte Programmierung mit Java

Arnold Willemer C++ Der Einstieg. WlLEY

Grundkurs Software- Entwicklung mit C++

Berichte aus der Informatik. Dieter Pawelczak. Start in die C-Programmierung

Programmierung mit Access 7 für Windows 95

magnum C++ WALTER SAUMWEBER kompakt komplett kompetent

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java

Linux-Kernel- Programmierung

Überblick. 5. Objekt und Klasse, Elementfunktionen

Verwendung von Klassen in C++

Inhaltsüberblick. I. Grundbegriffe - Objekte und Klassen. Organisatorisches. I. Grundbegriffe - Objektorientierte Konzepte

Ulrich Kaiser Christoph Kecher C/C++ Von den Grundlagen zur professionellen Programmierung. в.. Galileo Computing

SQL objektorientiert

VBA mit Office 97 lernen

C++ für Ingenieure. Einführung in die objektorientierte Programmierung. Seite Programmverzeichnis VII HARALD NAHRSTEDT

C++-Entwicklung mit Linux

Der Rational Unified Process

Tom Swan. C++ lernen. Eine systematische Einführung in die objektorientierte

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

Einstieg in die Informatik mit Java

Grundlagen der Informatik

Prof. W. Henrich Seite 1

Repetitorium Informatik (Java)

Java lernen mit BlueJ

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

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

Java lernen mit BlueJ

Thomas Binzinger. Jetzt lerne ich. Delphi. Markt+Technik Verlag

2 Grundsätzliches zur objektorientierten Programmierung.. 33

Einstieg in die Informatik mit Java

Visual Basic.NET mit Methode

C für Java-Programmierer

Programmieren I. Überblick. Institut für Angewandte Informatik. KIT Die Forschungsuniversität in der Helmholtz-Gemeinschaft

Beispiele für Ausdrücke. Der imperative Kern. Der imperative Kern. Imperativer Kern - Kontrollstrukturen. Deklarationen mit Initialisierung

Informationsverarbeitung im Bauwesen

Die Client/Server- Technologie des SAP-Systems R/3

Die abgeleiteten Klassen Kreis und Viereck erben die Elemente des Basisklasse und verfügen über zusätzliche Eigenschaften (Seitenlänge,

Windows 95 und Microsoft Plus!

Inhaltsverzeichnis. Heiko Kalista. C++ für Spieleprogrammierer ISBN: Weitere Informationen oder Bestellungen unter

Anwendungsentwicklung mit Java. Grundlagen der OOP, Vererbung, Schnittstellen, Polymorphie

4. Objektorientierte Programmierung mit C++

Alexander Niemann. Das Einsteigerseminar Objektorientierte Programmierung in Java. bhv

Programmieren in C++ Überladen von Methoden und Operatoren

Systemnahe Programmierung in C/C++

Programmieren I. Überblick. Institut für Angewandte Informatik. KIT Die Forschungsuniversität in der Helmholtz-Gemeinschaft

Grundzüge der Programmierung. Wiederverwendung VERERBUNG

Objektorientierte Programmierung in Java

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

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

Rechnen in UNIX-Shell-Prozeduren

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

Vererbung. Was versteht man unter dem Begriff Vererbung?

Programmieren I. Überblick. Institut für Angewandte Informatik. KIT Die Forschungsuniversität in der Helmholtz-Gemeinschaft

Inhaltsverzeichnis. 1 Grundlagen 1. 2 Einfache Programme 21

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

Inhaltsverzeichnis ... Danksagung 11. Einführung 13. Wie Sie Ihr erstes objektorientiertes Programm schreiben 23

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Einstieg in die Informatik mit Java

Beispiel: Zwischen der Oberklasse und der abgeleiteten Klasse besteht eine ist ein Beziehung. Eine abgeleitete Klasse stellt eine Spezialisierung der

Knasmüller.book Seite vii Mittwoch, 28. März : vii. Inhaltsverzeichnis

Vorkurs Informatik: Erste Schritte der Programmierung mit C++

Relationale Datenbanken - Theorie und Praxis

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

1 Abstrakte Klassen, finale Klassen und Interfaces

13. Funktionale Konzepte in Java

C/C++ KOMPENDIUM Einführung Arbeitsbuch Nachschlagewerk

Johannes Hofer. SCL und OOP. mit dem TIA Portal. Ein Leitfaden für eine objektorientierte Arbeitsweise. 2., neu bearbeitete Auflage VDE VERLAG GMBH

<Trainingsinhalt> C# programmieren

C++ Teil 6. Sven Groß. 27. Mai Sven Groß (IGPM, RWTH Aachen) C++ Teil Mai / 14

Inhaltsverzeichnis. Heiko Kalista. C++ für Spieleprogrammierer. ISBN (Buch): ISBN (E-Book):

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Informatik II Übung 6 Gruppe 7

C programmieren. Jürgen Wolf

Programmierung und Angewandte Mathematik

Klausur Grundlagen der Programmierung

Einführung und Vorstellung: Grundlagen der Java- Programmierung. paluno

Widmung Einleitung Vorwort 15 Übersicht zu diesem Buch Einführung in die Welt der Objektorientierung... 21

Inhaltsverzeichnis. Vorwort...XIII. Aufbau des Buches...

Object Pascal mit Delphi

C als erste Programmiersprache

DAS EINSTEIGERSEMINAR PHP 5.3 LERNEN ÜBEN ANWENDEN. Oliver Leiss Jasmin Schmidt. 3. Auflage

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Gerüstbeispiel. Vererbungshierarchie: Typ 0

UML konzentriert. Eine kompakte Einführung in die Standard-Objektmodellierungssprache. Martin Fowler. ADDISON-WESLEY An imprint of Pearson Education

Transkript:

Nicolai Josuttis Objektorientiertes Programmieren in C++ Von der Klasse zur Klassenbibliothek D-64289 Darmstadt ADDISON-WESLEY PUBLISHING COMPANY Bonn Paris Reading, Massachusetts Menlo Park, California NewYork Don Mills, Ontariö* Wokingham, England Amsterdam Milan Sydney Tokyo Singapore Madrid San Juan Seoul Mexico City Taipei, Taiwan

Vorwort 1 1 Über dieses Buch 3 1.1 Warum dieses Buch? 3 1.2 Voraussetzungen 4 1.3 Systematik 4 1.4 Wie liest man dieses Buch? 5 1.5 Zugriff auf die Quellen zu den Beispielen 6 1.6 Anregungen und Kritik 6 2 Einleitung: C, C++ und objektorientierte Programmierung 7 2.1 Die Voraussetzung: C 8 2.1.1 Aufbau eines C-Programms 8 2.1.2 Einfache Datentypen 8 2.1.3 Zeiger 10 2.1.4 Zusammengesetzte Datentypen 11 2.1.5 Kontrollstrukturen 14 2.1.6 Operatoren 18 2.1.7 Präprozessor 19 2.1.8 Standard-Funktionen 21 2.1.9 Die verschiedenen C-Versionen 23 2.2 Die Sprache C++ 24 2.2.1 Designkriterien 24 2.2.2 Sprach-Versionen 24 2.3 C++ als objektorientierte Programmiersprache 26 2.3.1 Objekte, Klassen und Instanzen 26

vi Inhaltsverzeichnis 2.3.2 Klassen in C++ 29 2.3.3 Datenkapselung 31 2.3.4 Vererbung r 33 2.3.5 Polymorphie 35 2.3.6 Typen als Parameter v. 37 2.3.7 Exception-Handling 38 2.4 Namensgebung 39 3 Programmieren mit Klassen 41 3.1 Vorbemerkungen zum Programmieren mit C++ 42 3.1.1 Kommentare in C++ 42 3.1.2 Vordefinierte Datentypen 43 3.1.3 Dateinamen 43 3.1.4 Übersetzen von C++-Programmen 44 3.2 Die erste Klasse: Bruch 45 3.2.1 Vorüberlegungen zur Implementierung 45 3.2.2 Deklaration der Klasse Bruch 48 3.2.3 Die Klassenstruktur 50 3.2.4 Elementfunktionen 52 3.2.5 Konstruktoren 52 3.2.6 Überladen von Punktionen 54 3.2.7 Implementierung der Klasse Bruch 56 3.2.8 Anwendung der Klasse Bruch 60 3.2.9 Explizite Typumwandlungen 66 3.2.10 Einbindung von C-Code 67 3.2.11 Zusammenfassung 68 3.3 Operatoren für Klassen 70 3.3.1 Deklaration von Operator-Funktionen 70 3.3.2 Implementierung von Operator-Funktionen 73 3.3.3 Das Schlüsselwort this 79 3.3.4 Anwendung ypn Operator-Funktionen 81 3.3.5 Globale Operator-Funktionen 82

vii 3.3.6 Grenzen bei der Definition eigener Operatoren 83 3.3.7 Besonderheiten spezieller Operatoren 84 3.3.8 Zusammenfassung 88 3.4 Laufzeit- und Codeoptimierungen 90 3.4.1 Die Klasse Bruch mit ersten Optimierungen 90 3.4.2 Default-Argumente 93 3.4.3 Inline-Funktionen 95 3.4.4 Deklarationen zwischen Anweisungen 97 3.4.5 Copy-Konstruktoren 99 3.4.6 Zusammenfassung 101 3.5 Referenzen und Konstanten 102 3.5.1 Copy-Konstruktor und Parameterübergabe 102 3.5.2 Referenzen 103 3.5.3 Konstanten 106 3.5.4 Konstanten-Elementfunktionen 108 3.5.5 Die Klasse Bruch mit Referenzen 109 3.5.6 Zeiger auf Konstanten und Zeiger-Konstanten 112 3.5.7 Zusammenfassung..... 113 3.6 Ein- und Ausgabe mit Streams 114 3.6.1 Streams 114 3.6.2 Umgang mit Streams 115 3.6.3 Zustand von Streams 121 3.6.4 I/O-Operatoren für eigene Datentypen 123 3.6.5 Zusammenfassung 133 3.7 Freunde und andere Typen 134 3.7.1 Automatische Typumwandlungen....^ 134 3.7.2 Friend-Funktionen 136 3.7.3 Konvertierungsfunktionen 142 3.7.4 Probleme bei der automatischen Typumwandlung 143 3.7.5 Andere Anwendungen des Schlüsselworts friend 146 3.7.6 Friend kontra objektorientierte Programmierung 146 3.7.7 Zusammenfassung 148

viii Inhaltsverzeichnis 3.8 Dynamische Speicherverwaltung 149 3.8.1 Der Operator new 150 3.8.2 Der Operator delete 151 3.8.3 Dynamische Speicherverwaltung für Arrays 151 3.8.4 New-Handler,.. 153 3.8.5 Überladen von new und delete 160 3.8.6 Zusammenfassung 163 3.9 Dynamische Komponenten 164 3.9.1 Motivation 164 3.9.2 Implementierung der Klasse String 166 3.9.3 Konstruktoren bei dynamischen Komponenten 172 3.9.4 Implementierung eines Copy-Konstruktors 174 3.9.5 Destruktoren 174 3.9.6 Implementierung des Zuweisungsoperators 175 3.9.7 Weitere Operatoren 177 3.9.8 Einlesen eines Strings 180 3.9.9 Kommerzielle String-Klassen 182 3.9.10 Weitere Anwendungsmöglichkeiten dynamischer Komponenten... 183 3.9.11 Zusammenfassung 185 3.10 Weitere Aspekte dynamischer Komponenten 186 3.10.1 Dynamische Komponenten bei konstanten Objekten 186 3.10.2 Konvertierungsfunktionen für dynamische Komponenten 189 3.10.3 Konvertierungsfunktionen für Bedingungen 192 3.10.4 Konstanten werden zu Variablen 194 3.10.5 Default-Funktionen verbieten 197 3.10.6 Zusammenfassung 198 3.11 Klassen verwenden Klassen 199 3.11.1 Objekte als Komponenten anderer Klassen 199 3.11.2 Implementierung der Klasse Person 200 3.11.3 Initialisierungslisten 203 3.11.4 Zusammenfassung 207

ix 3.12 Statische Komponenten und Hilfstypen 208 3.12.1 Statische Klassenkomponenten 208 3.12.2 Typdeklarationen innerhalb von Klassen 214 3.12.3 Aufzählungstypen als statische Klassen-Konstanten 217 3.12.4 Eingebettete und lokale Klassen.."'. 218 3.12.5 Namensbereiche 219 3.12.6 Zusammenfassung 221 3.13 Funktions- und Komponentenzeiger 222 3.13-1 Funktionszeiger 222 3.13.2 Komponentenzeiger 223 3.13.3 Zusammenfassung 227 3.14 Templates 228 3.14.1 Template-Funktionen 229 3.14.2 Template-Klassen 233 3.14.3 Andere Template-Argumente 239 3.14.4 Templates in der Praxis 242 3.14.5 Zusammenfassung 243 3.15 Exception-Handling 244 3.15.1 Motivation für Exception-Handling 244 3.15.2 Konzept des Exception-Handlings 247 3.15.3 Exception-Handling am Beispiel der Klasse Bruch 249 3.15.4 Behandlung unterschiedlicher Exceptions 256 3.15.5 Fehlerklassen mit Komponenten 259 3.15.6 Weitergabe von Fehlern T 266 3.15.7 Behandlung nicht aufgefangener Exceptions 266 3.15.8 Exceptions in Schnittstellen-Deklarationen 267 3.15.9 Hierarchien von Fehlerklassen 268 3.15.10Design;ron Fehlerklassen 272 3.15.11 Zusammenfassung 273

4 Vererbung und Polymorphie 275 4.1 Einfache Vererbung 278 4.1.1 Die Klasse Bruch als Basisklasse 278 4.1.2 Vorüberlegungen zur abgeleiteten Klasse KBruch 280 4.1.3 Deklaration der abgeleiteten Klasse KBruch 281 4.1.4 Vererbung und Konstruktoren 284 4.1.5 Implementierung von abgeleiteten Klassen 287 4.1.6 Anwendung von abgeleiteten Klassen 290 4.1.7 Konstruktoren für Objekte der Basisklasse 292 4.1.8 Zusammenfassung 294 4.2 Virtuelle Funktionen 295 4.2.1 Probleme beim Überschreiben von Basis-Funktionen 295 4.2.2 Statisches und dynamisches Binden von Funktionen 298 4.2.3 Überladen kontra Überschreiben 302 4.2.4 Zugriff auf Parameter der Basisklasse 304 4.2.5 Virtuelle Destruktoren 305 4.2.6 Vererbung richtig angewendet - 306 4.2.7 Weitere Fallen beim Überschreiben von Funktionen 311 4.2.8 Private Vererbung und reine Zugriffsdeklarationen 313 4.2.9 Zusammenfassung 317 4.3 Vererbung von Klassen mit dynamischen Komponenten 318 4.3.1 Die Klasse String als Basisklasse 318 4.3.2 Die abgeleitete Klasse FarbString 320 4.3.3 Überschreiben von Friend-Funktionen 323 4.3.4 Ableiten der Funktionen für dynamische Komponenten 325 4.3.5 Zusammenfassung < 329 4.4 Design-Fallen bei Vererbung 330 4.4.1 Vererbung kontra Verwendung 330 4.4.2 Design-Fehler: Einschränkende Vererbung 330 4.4.3 Design-Fehler: Wertverändernde Vererbung 332 4.4.4 Design-Fehler: Wertinterpretierende Vererbung 333 4.4.5 Zusammenfassung 334

xi 4.5 Mehrfachvererbung 336 4.5.1 Beispiel für Mehrfachvererbung 336 4.5.2 Virtuelle Basisklassen 342 4.5.3 Das Problem der Identität 345 4.5.4 Dieselbe Basisklasse mehrfach ableiten. 348 4.5.5 Zusammenfassung 349 4.6 Polymorphie 350 4.6.1 Was ist Polymorphie? 350 4.6.2 Polymorphie in C++ 351 4.6.3 Polymorphie in C++ am Beispiel 353 4.6.4 Die abstrakte Basisklasse GeoObj 356 4.6.5 Anwendung von Polymorphie in Klassen 365 4.6.6 Polymorphie ist keine feste Fallunterscheidung 369 4.6.7 Rückumwandlung eines Objekts in seine Klasse 369 4.6.8 Zusammenfassung 372 5 Klassenbibliotheken. 373 5.1 Die Beispiel-Klassenbibliothek BXCL 376 5.1.1 Design-Ansatz 376 5.1.2 Die abstrakte Basisklasse bxobject 377 5.1.3 Die abgeleitete Klasse bxlnteger 382 5.1.4 Die abgeleitete Klasse bxstring 387 5.1.5 Ein erstes Anwendungsbeispiel für die BXCL 394 5.1.6 Eine Klasse für die Klassen 395 5.1.7 Der Trick mit den Makros 408 5.2 Container- und Mengenklassen 413 5.2.1 Einführung und Namensgebung 413 5.2.2 Klassifikation von Mengen 413 5.2.3 Die Mengenklasse bxunordcoll 416 5.3 Zugriff auf die Elemente von Mengenklassen 427 5.3.1 Zugriff.über Iteratoren 427 5.3.2 Zugriff über Funktionszeiger 435

xii Inhaltsverzeichnis 5.3.3 Zugriff über den Operator [ ] 439 5.3.4 Das Problem des Verlusts des Datentyps 440 5.4 Weitere Aspekte von Container- und Mengenklassen 443 5.4.1 Konstante Elemente, 443 5.4.2 Mengenklassen als Templates,. 443 5.4.3 Verweise ohne Bezugspunkt 452 5.4.4 Verweiszyklen 454 5.4.5 Design von Mengenklassen-Hierarchien 457 5.4.6 Kopien statt Verweise 460 5.5 Kopieren und Vergleichen 462 5.5.1 Formen von Gleichheit 462 5.5.2 Tiefe und flache Kopien 465 5.6 Persistenz 473 5.6.1 Persistenz als Konzept 473 5.6.2 Implementierungsüberlegungen von Persistenz 474 5.6.3 Abspeichern von Objekten 475 5.6.4 Laden von Objekten 482 5.6.5 Dynamisches Laden und Speichern 486 5.6.6 Versionsverwaltung 487 5.7 Fehlerbehandlung 488 5.8 Die Standard-I/O-Bibliothek 491 5.8.1 I/O-Klassen und -Objekte 491 5.8.2 Fehlerzustände, Stream-Status 492 5.8.3 Standard-Operatoren 494 5.8.4 Standard-Funktionen 494 5.8.5 Manipulatoren 498 5.8.6 Formatdefinitionen 502 5.8.7 Dateizugriff 508 5.8.8 Umleiten der Standard-Kanäle 514 5.8.9 String-Stream-Klassen 515 5.8.10 Zusammenfasung 517

xiii 6 Zusammenfassung 519 6.1 Hierarchie der C++-Operatoren 519 6.2 Klassenspezifische Eigenschaften von Operationen 522 6.3 Regeln zur automatischen Typumwandlung 523 6.4 Sinnvolle Programmier-Richtlinien 524 Literaturverzeichnis 527 Glossar 529 Index 537