Table Of ContentMartin Aupperle
Die Kunst der Programmierung mit C++
Aus dem Bereich IT erfolgreich gestalten
...... r-------------------~------------------------------~!--------__"
Grundkurs JAVA Projektkompass
von Dietmar Abts Softwareentwicklung
von Carl Steinweg und Stephen Fedtke
Verteilte Systeme
von Günther Bengel Datenbankentwurf
von Helmut Jarosch
OhneCzuC++ I
von Peter P. Bothner Das neue PLII für PC, Workstation
und Wolf-Michael Kähler und Malnframe
von Eberhard Sturm
Software Engineering
von Reiner Dumke Prozedurale Programmierung
von Roland Schneider
Kompaktkurs Mikrocontroller
von Silvia Limbach Grundkurs Algorithmen
und Datenstrukturen In JAVA
Team Excellence effizient
von Andreas Solymosi und Ulrich Grude
und verständlich
von Franz J. Linnenbaum Die Kunst der Programmierung
mitC++
Der CMs-Guide
von Martin Aupperle
von Jürgen Lohr und Andreas Deppe
Effizient Programmieren mit
C#und.NET
von Andreas Solymosi und Peter Solymosi
1'·"
www.vieweg-it.de
Martin Aupperle
Die Kunst der
Programmierung
mitC++
Exakte Grundlagen für die professionelle
Softwareentwicklung
2., überarbeitete Auflage
IJ
vleweg
Die Deutsche Bibliothek - CIP-Einheitsaufnahme
Ein Titeldatensatz fUr diese Publikation ist bei
Der Deutschen Bibliothek erhăltlich.
1. Auflage Januar 1997
Die erste Auflage ist unter dem Titei "Die Kunst der objektorientierten Programmierung mit C++"
erschienen.
2., uberarbeitete August 2002
Alle Rechte vorbehalten
© Springer Fachmedien Wiesbaden 2002
Ursprlinglich erschienen bei Friedr. Vieweg & Sohn Verlagsgesellschaft mbH, BraunschweiglWiesbaden 2002
www.vieweg.de
Das Werk einschlieBlich aller seiner Teile ist urheberrechtlich geschlitzt. Jede
Verwertung auBerhalb der engen Grenzen des Urheberrechtsgesetzes ist ohne
Zustimmung des Verlags unzulăssig und strafbar. Das gilt insbesondere fur
Vervielfăltigungen, Obersetzungen, Mikroverfilmungen und die Einspeicherung
und Verarbeitung in elektronischen Systemen.
Die Wiedergabe von Gebrauchsnamen, Handelsnamen, Warenbezeichnungen usw. in diesem Werk
berechtigt auch ohne besondere Kennzeichnung nicht zu der Annahme, dass solche Namen im Sinne
der Warenzeichen- und Markenschutz-Gesetzgebung als frei zu betrachten wăren und daher von
jedermann benutzt werden dlirften.
Hochste inhaltliche und technische Qualităt unserer Produkte ist unser ZieI. Bei der Produktion und
Auslieferung unserer Bucher wollen wir die Umwelt schonen: Dieses Buch ist auf săurefreiem und
chlorfrei gebleichtem Pa pier gedruckt. Die EinschweiBfolie besteht aus Polyăthylen und damit aus
organischen Grundstoffen, die weder bei der Herstellung noch bei der Verbrennung Schadstoffe
freisetzen.
Konzeption und Layout des Umschlags: Ulrike Weigel, www.CorporateDesignGroup.de
Umschlagbild: Nina Faber de.sign, Wiesbaden
ISBN 978-3-528-15481-3 ISBN 978-3-663-07766-4 (eBook)
DOI 10.1007/978-3-663-07766-4
Vorwort
Noch ein C++ - Buch? Ist das notwendig? Heute geht es doch um Ja
va, Net-Services, C#, Mobile Devices oder wie die Buzzwords des Jah
res 2002 noch alle heißen mögen. Ist C++ nicht überkommen? Hört
man nicht Grausames über Projekte, die mit C++ realisiert wurden?
Ja, alles richtig. Trotzdem gibt es einige gewichtige Gründe, die mich
dazu veranlasst haben, dieses Buch zu schreiben. Da wäre zunächst
die große Nachfrage aus der Leserschaft des Vorgängers Die Kunst
der Objektorientierten Programmierung mit C++, die sich ein Nach
folgewerk wünschten. Dies wurde mir in zahllosen emails sowohl
von Lesern, neuen Interessenten als auch vom Verlag mitgeteilt.
Zum zweiten ist der Trend zum Einsatz von C++ in der Praxis un
gebrochen. Noch immer ist C++ die am meisten eingesetzte und da
mit wohl wichtigste Programmiersprache zur Erstellung neuer Soft
ware. Die Stellenanzeigen (z.B. in EDV-Fachzeitschriften) sprechen
eine deutliche Sprache: mehr als Java-Kenntnisse werden fundierte
C++ Kenntnisse nachgefragt (Spezialprojekte einmal ausgenommen).
Dies kann ich auch aus verschiedenen Consulting-Projekten bestäti
gen: in nahezu allen größeren Vorhaben waren die zentralen Ge
schäftsprozesse in C++ realisiert. Java oder andere Sprachen wurden
meist für Spezialbereiche wie z.B. die Präsentationslogik verwendet.
Befindet man sich in einem solchen Projekt, hat man es schnell mit
einer halben Million Codezeilen zu tun, in denen sich die unter
schiedlichsten Stile finden lassen - man findet Perlen, aber auch wil
de Konstruktionen, die eher aus langen Versuch- und Irrtum-Sit
zungen zu entstammen scheinen als aus ingenieurmäßigem Vorge
hen. Und genau hier sehe ich den Bedarf für ein gutes Buch: Zur pro
fessionellen Programmierung mit C++ benötigt man professionelles
Handwerkszeug. Dies umfasst einmal die Kenntnis der Sprachmittel,
die C++ für den Programmierer bereithält. Dies allein ist jedoch nicht
ausreichend, wie die große Anzahl teurer, schlecht wartbarer oder
fehleranfälliger Programme zeigt. Was oft vernachlässigt wird, ist die
Kenntnis über die korrekte Anwendung eines Sprachmittels zur Lö
sung einer gegebenen Aufgabe. Die ungeeignete Herangehensweise
ist oft der Grund für mangelnde Softwarequalität.
VI Vorwort
Der Einsteiger ist nach der Lektüre eines Lehrbuches oder nach dem
Besuch eines Kurses überwältigt von der Fülle der Ausdrucksmög
lichkeiten, die die Sprache bietet. Die Erfahrung zeigt, dass dann
Konstruktionen wie Überladen von Funktionen, selbstdefinierte Ope
ratoren etc. viel zu häufig und undifferenziert eingesetzt werden -
eben weil man das neu Gelernte auch anwenden will.
Ich habe versucht, mit diesem Buch der Gefahr zu begegnen. Das
Buch beschreibt daher nicht nur die Sprachelemente der Sprache C++
sorgfältig und vollständig, sondern gibt zu jedem Konstrukt auch
Hinweise für den Einsatz. Fallstudien und ein durchgängiges Projekt
unterstützen die Anwendung. Dadurch wird dem ernsthaften Pro
grammierer das Handwerkszeug vermittelt, qualitativ hochwertige
Programme mit professioneller Technik zu entwickeln.
Meiner Beurteilung nach wird die Bedeutung der Sprache C++ zur
industriellen Softwareentwicklung tendenziell weiter zunehmen.
Gründe dafür sind u.a. das Abflauen des Java-Hypes, aber vor allem
die überaus erfolgreiche Standardisierung der Sprache, die nach nur 8
Jahren im Jahre 1998 abgeschlossen werden konnte. Die Standardisie
rung verhindert einen Wildwuchs an Erweiterungen, Dialekten etc.,
die z.B. wesentlich zum Misserfolg der Sprache PL/1 beigetragen ha
ben. Compilerbauer wissen nun, was sie zu tun haben. Projektmana
ger können den Compilerhersteller wechseln, ohne gleich das ganze
Projekt zu gefährden. Die Erstellung allgemeinverwendbarer Biblio
theken wird einfacher. Die Ausbildung wird einfacher, und nicht zu
letzt bilden sich Standard-Vorgehensweisen zur Lösung von Standard
Aufgabenstellungen heraus (sog. patterns, deutsch etwa: Muster).
Ursprünglich war dieses Buch als Nachfolger der Kunst der Objektori
entierten Programmierung mit C++ geplant. Als Ziel hatte ich mir
vorgenommen, auch die nicht-objektorientieren Aspekte der Sprache
zu berücksichtigen - schließlich ist C++ eine hybride Programmier
sprache, in der man auch prozedural programmieren kann. Als Re
sultat sind im vorliegenden Buch 16 Kapitel hinzugekommen, die vor
allem die klassischen "Brot&Butter"-Elemente der Sprache behandeln.
Auf Grund der Fülle des Materials ist nun aber eine Zweiteilung er
forderlich geworden. In diesem Buch werden die Sprachmittel der
Sprache vorgestellt und mit Beispielen und Fallstudien unterlegt. In
einem weiteren Band geht es dann um die Standardbibliothek sowie
um den gesamten Themenkreis der Programmiertechniken. Insofern
VII
sind beide Bände unabhängig voneinander verwendbar, bilden aber
trotzdem ein Ganzes.
Ich möchte mich an dieser Stelle bei den Personen, die mich in den
letzten Jahren in irgendeiner Weise bei der Erstellung des Buches un
terstützt haben, bedanken. Zunächst einmal wäre hier meine Familie
zu nennen, die auf mich länger verzichten musste als es ihr und mir
lieb war, und die mir den Rückhalt und den freien Kopf für ein Un
terfangen dieser Größenordnung gegeben hat. Als nächstes möchte
ich mich bei meinen Reviewern bedanken, die zahllose kleinere und
größere Fehler und Unstimmigkeiten aufgedeckt haben. Weiterer
Dank gebührt den vielen aktiven Mitgliedern der Newsgroups
comp.lang.c++.moderated und comp.std.c++.moderated, die sich die
Zeit genommen haben, meine teils sehr speziellen Fragen zu beant
worten. Insbesondere die Diskussionen in diesen Newsgroups haben
meine Kenntnisse der Materie wesentlich erweitert. Schließlich ver
dienen auch die zahlreichen Softwerker Erwähnung, die mir mit ihrer
Sichtweise bis dahin unbekannte Einblicke in Vorgänge bei der Ent
wicklung von Software ermöglicht haben. Erwähnen möchte ich auch
den Support der Fa. Comeau Computing, die einige knifflige Fragen
zur Standardkonformität bestimmter Programmkonstruktionen beant
worten konnte. Zu guter letzt geht mein Dank an den Verlag Vieweg,
der mir die Möglichkeit gab, mehrere zugesagte Abgabetermine zu
überziehen um so das bestmögliche Ergebnis erzielen zu können.
VIII Vorworl
Inhaltsverzeichnis
VORWORT V
INHALTSVERZEICHNIS IX
EINFÜHRUNG
Inhalt 2
Schwerpunkt 4
C++ und C 5
C++ und Java 6
C++und C# 8
Sprache und Bibliothek 9
Compilerversionen 9
Sprachversionen 10
Pre-Standard und Standard 12
Voraussetzungen 12
Support über das Internet 12
Literatur 13
Einige Anmerkungen 16
C++ ist nichts anderes als C mit einigen Verbesserungen 16
Java/C/Basic/Smalltalk/PerllDelphi/Lisp ist besser als C++! 16
Aber C++ ist so komplex! 17
Aber C++ ist langsam! 18
Aber C++ ist nicht plattformunabhängig! 19
1 DAS ERSTE PROGRAMM 21
Hello, world! 21
Im Einzelnen 22
Eigene Experimente 26
2 HINTER DEN KULISSEN 27
Der Übersetzungsvorgang 27
Der Begriff "Übersetzungseinheit" 27
Übersetzungseinheiten und Dateien 28
Der Präprozessor 28
Separate Übersetzung und der Binder 30
Die Aufgabe des Binders 32
x Inhaltsverzeichnis
Statisches und dynamisches Binden 32
Native und CFront-Compiler 35
Vorübersetzte Reader 36
3 FUNDAMENTALE TYPEN 39
Übersicht 39
Integrale- und Fließkomma-Typen 40
Ganzzahlige Typen 40
Die Spezifizierer short und long 41
Die Spezifizierer signed und unsigned 42
Literale 44
Literale im Oktal-und Hexadezimalsystem 45
Spezifizierer für Literale 46
Fließkomma-Typen 47
Der Spezifizierer long 48
Rundungseffekte 48
Spezielle Fließkommawerte 51
Literale 52
Zeichentypen 53
Die Spezifizierer signed und unsigned 53
Größe eines char und Sprachvarianten 55
Unicode und wchar_t 55
Literale 56
Spezielle Literale ("Escape-Sequenzen ") 56
Zeichenketten 59
Zeichenketten-Literale 59
Zusammenfassung von String-Literalen 62
Fortsetzung von String-Literalen 62
Unicode (wide-character )-String-Literale 63
Wahrheitswert-Typ 63
Wahrheitswerte und numerische Typen 64
Größen und Grenzwerte fundamentaler Typen 64
Der Operator sizeof 65
Das Verhältnis der Größen 66
Wertebereiche 67
Repräsentation von Fließkommanwerten 69
Die Dateien limits.h undjloat.h 69
Die Datei limits 70
Spezielle Werte für Fließkommatypen 71
Weitere Datentypen 72
Typen unter anderen Namen 72
Compilerspezifische Typen 74