Dirk Louis
C/C++ - Kompendium
Produktdetails
- Verlag: AIG
- Erscheinungstermin: 30. Dezember 1999
- ISBN-13: 9783827256690
- ISBN-10: 3827256690
- Artikelnr.: 24657169
- Herstellerkennzeichnung Die Herstellerinformationen sind derzeit nicht verfügbar.
Es war einmal ... 19
Über dieses Buch 22 Zur Einstimmung 25
A, B, C - die Geschichte von C und C++ 27
Allgemeine Konzeption einer Programmiersprache 35
Die Hardware 37
Die Hardware-Umgebung 37
Die CPU 39
Assembler 46
Der Compiler 47
Ablauf der Programmerstellung 47
Größere Programme erstellen 50
Compiler versus Interpreter 51
Die Kommunikation mit dem Compiler 53
Entwicklungsumgebungen 57
Das Programmgerüst - Einführung für Programmieranfänger 61
Was ist ein Programm? 61
Ein einführendes Beispiel 65
Hello, world in C und C++ 65
Einbindung der Header-Dateien 67
Ein umfangreicheres Beispiel 68
Ein einführender Programmierkurs 70
Kommentare 70
Datenelemente 71
Operationen auf Daten 73
Programmablauf 75
Funktionen 77
Präprozessor-Direktiven 81
Die Funktion printf() 83
scanf() und wie man es vermeiden kann 86
Stil 88
Erstellung und Ausführung der Beispielprogramme 92
Allgemeine Hinweise 96
Goldene Regeln für Anfänger 96
Von A wie Anweisung bis W wie Whitespace 97
Hinweise für Umsteiger von Pascal 98
Hinweise für Umsteiger von Java 99
Abschlußquiz: Wie ein Zeichen ein Programm verändert 100
Die Daten 103
Variablen 105
Deklaration und Definition 106
Die Bedeutung der Deklaration 107
Namensgebung für Bezeichner 107
Unterschied zwischen Deklaration und Definition 109
Initialisierung 113
Variablen in Anweisungen 115
Gültigkeitsbereiche, Speicherklasse und Lebensdauer 117
Gültigkeitsbereiche 117
Sichtbarkeit 119
Speicherklasse und Lebensdauer 124
Linkage 125
Namensbereiche (nur C++) 132
Namensbereiche und globaler Gültigkeitsbereich 133
Namensbereiche definieren 135
Auf Elemente aus Namensbereichen zugreifen 135
Erweiterung von Namensbereichen 138
Aliase 139
Unbenannte (anonyme) Namespaces statt statischer Variablen 139
Spezifizierer für die Variablendeklaration 140
Speicherklassenspezifizierer 140
Die Typqualifizierer const und volatile 150
Abschlußquiz: Deklarationen und Typen 159
Konstanten 165
Literale - konstante Werte 165
#define - symbolische Konstanten 168
const - konstante Variablen 170
Abschlußprogramm: Umrechnung zwischen Zahlensystemen 171
Elementare Datentypen 175
Klassifizierung der elementaren Datentypen 175
Was sind elementare Datentypen? 176
Wie werden die elementaren Datentypen klassifiziert? 176
Wofür werden Datentypen benötigt? 178
short, int und long 182
float, double und long double 187
bool (nur C++) 198
char und wchar_t 200
void 205
Selbst definierte Datentypen 206
Typspezifizierer 208
Typumwandlung 214
Wann sind zwei Typen kompatibel? 215
Automatische Konvertierung 215
Explizite Typumwandlung 220
Abschlußprogramm: Texte kodieren 220
Operatoren und Ausdrücke 223
Ausdrücke 225
Aufbau 226
Seiteneffekte 226
Aufeinanderfolgende Operatoren 231
Vorzeichen 232
Arithmetische Operatoren 232
Allgemeines 232
Division und Modulo 233
Konvertierung arithmetischer Operanden 234
Polynomberechnung nach Horner-Schema 236
Zuweisungsoperatoren 239
Allgemeines 239
Zuweisung an Zeiger 242
Zuweisung an Klasseninstanzen (nur C++) 243
Inkrement-Operatoren 243
Allgemeines 243
Präfix und Postfix 244
Vergleichsoperatoren 245
Allgemeines 245
Logische Operatoren 247
Allgemeines 247
Die Operatoren im einzelnen 248
Bit-Operatoren 251
Allgemeines 251
Die Bit-Operatoren im einzelnen 251
Flags (Schaltervariablen) 256
Datenzugriff 261
Allgemeines 261
Die Operatoren im einzelnen 262
new und delete (nur C++) 267
new-Operator (nur C++) 267
delete-Operator (nur C++) 272
Operatoren für den Präprozessor 273
Spezielle Operatoren 274
& Adreß-Operator 274
& Referenz-Operator (nur C++) 275
?: Bedingungsoperator 275
, Komma-Operator 276
Der sizeof-Operator 277
Typumwandlung 279
Explizite Typumwandlung mit () 282
Die neuen C++-Operatoren zur Typumwandlung 283
Typidentifizierung (nur C++) 293
Synonyme und Trigraphsequenzen 295
Reihenfolge der Operator-Abarbeitung 296
Überladung von Operatoren (nur C++) 302
Syntax 303
Global oder in Klasse? 306
Rückgabewerte von Operatoren 311
Überladung der Operatoren 313
Überladung des Zuweisungsoperators =() 313
Überladung der op=-Operatoren 316
Überladung des ++-Operators 317
Überladung des cast-Operators 318
Überladung des []-Operators 320
Überladung des ()-Operators 321
Überladung des new-Operators 322
Überladung der Dereferenzierungsoperatoren -> und * 327
Überladung der stream-Operatoren <<, >> 329
Abschlußprogramm: ein Taschenrechner 331
Eigene Datentypen 335
Aufzählungen (enum) 336
Aufzählungen deklarieren 336
Initialisierung 337
Programmieren mit Aufzählungen 338
Aufzählungen als Mengentypen 340
Arrays 341
Arrays deklarieren 342
Initialisierung und Zugriff 343
Programmieren mit Arrays 347
Wie funktionieren Arrays? 359
Besondere Array-Typen 366
Mehrdimensionale Arrays 370
Stringtabellen 377
Matrizen 379
Strukturen (struct) 382
Strukturen deklarieren 382
Initialisierung und Zugriff 383
Programmieren mit Strukturen 385
Speicherbelegung für Strukturen 389
Bitfelder 392
Unions (union) 396
Klassen (nur C++) 399
Klassendeklaration 400
Typdefinitionen mit typedef 405
Deklaration 405
Programmierung mit typedef 405
Unvollständige Datentypen 406
Abschlußprogramm: Adressenverwaltung 407
Zeiger 413
Zeiger deklarieren 415
Mit Zeigern programmieren 426
Warum sind Zeiger so gefährlich? 427
Grundregeln für Anfänger 429
Wofür braucht man Zeiger? 432
Zeiger und Arrays 441
Zeigerarithmetik 442
Spezielle Zeiger 444
Dynamische Speicherreservierung 453
Speicherkonzepte 455
DOS und die segmentierte Adressierung 459
32-Bit-Systeme 467
Speicherallokation mit malloc() und new 471
Dynamische Datenstrukturen 474
Typische Fehlerquellen 478
Abschlußprogramm: Eene, meene, muh 483
Referenzvariablen (nur C++) 487
Referenzvariablen deklarieren 487
Mit Referenzen programmieren 489
Referenzen und Zeiger 493
Referenzen und temporäre Variablen 493
Steuerung des Programmablaufs 497
Kontrollstrukturen 499
Verzweigungen - die if-Bedingung 500
Praktischer Einsatz der if-Verzweigung 501
Bedingungen und boolesche Ausdrücke 506
Fallstricke und Besonderheiten 508
Die switch-Verzweigung 510
Praktischer Einsatz der switch-Verzweigung 511
Fallstricke und Besonderheiten 515
Die for-Schleife 517
Praktischer Einsatz der for-Schleife 519
Performance-Tips 524
Spezielle for-Schleifen 525
Die while-Schleife 530
Praktischer Einsatz der while-Schleife 531
Performance-Tips 536
Spezielle while-Schleifen 536
Schleifen abbrechen 538
continue 539
break 540
Sprünge mit goto 540
Funktionen 543
Was sind Funktionen? 543
Aufbau einer Funktion 544
Was der Compiler von einer Funktionsdeklaration erwartet 546
Die Funktionen der Laufzeitbibliothek 546
Wozu braucht man Funktionen? 548
Funktionen definieren 550
Funktionen, Programmablauf und Stack 556
Datenaustausch zwischen Funktionen 561
Parameter 562
Globale Variablen 570
Lokale Variablen und static 571
Rückgabewert 573
Besondere Funktionen 575
Die Hauptfunktion main() 575
Rekursive Funktionen 577
Funktionen mit beliebig vielen Parametern 578
Inline-Funktionen (nur C++) 580
Vorgabeargumente (nur C++) 582
Überladung (nur C++) 585
Bibliotheken anlegen 589
Von der Funktionensammlung zur Bibliothek 589
Vergleich von Bibliotheken 594
Fehlerbehandlung (mit und ohne Exceptions) 597
Möglichkeiten der Fehlerbehandlung 598
Aufbau einer Exception-Behandlung 602
Programmfluß und Exception-Behandlung 605
Wo wird der Programmfluß nach einer Exception fortgesetzt? 605
Die Problematik des gestörten Programmflusses 607
Komponenten der Exception-Behandlung 609
Exceptions abfangen 609
Exceptions auslösen 612
Vorteile der Exception-Behandlung 613
Die Exceptions von C++ und der ANSI-Bibliothek 615
Funktionen zur Unterstützung der Exception-Behandlung 616
Exceptions unter Windows 617
Präprozessor-Direktiven 621
Einfügen von Dateien mittels #include 622
Konstanten und Makros 626
Symbolische Konstanten 627
Makros 627
Bedingte Kompilierung 629
Sonstige Direktiven und Symbole 634
Objektorientiert programmieren 637
Einführung in die objektorientierte Denkweise 639
Klassen 655
Klassen deklarieren 655
Syntax 655
Logischer Aufbau einer Klasse 657
Instanzbildung und Zugriff auf Elemente 659
Instanzbildung 660
Sinn und Zweck der Konstruktoren 661
Aufruf der Konstruktoren 663
Initialisierung 669
Instanzvariablen (Eigenschaften) 681
Allgemeines 682
Statische Elementvariablen (Klassenvariablen) 686
Konstante und veränderbare Elemente 692
Eingebettete Klassenobjekte 694
Methoden (Verhaltensweisen) 701
Allgemeines 701
Definition innerhalb der Klassendefinition 703
Definition außerhalb der Klassendefinition 704
Der this-Zeiger 705
Statische Methoden 710
Konstante Methoden 714
Virtuelle Methoden 717
Überladung 722
Die Zugriffsspezifizierer public, protected, private 723
Die Konstruktoren - Objekte einrichten 728
Der Standardkonstruktor 731
Eigene Konstruktoren 735
Konstruktoren überladen 737
Arrays von Objekten 737
private- und protected-Konstruktoren 740
Der Destruktor - Objekte auflösen 742
Der Kopierkonstruktor und Zuweisungsoperator 748
Konvertierungskonstruktor und -methoden 755
Fünf Variablentypen und fünf Standardelemente 761
Typdefinitionen in Klassen 762
Aufzählungen in Klassen 762
Verschachtelte Klassen 763
Friends 763
Abschlußprogramm: Magische Quadrate 765
Vererbung 773
Syntax der Vererbung 777
Grundlagen der Vererbung 779
Was bringt uns die Vererbung? 779
Was wird vererbt? 781
Wie greift man auf geerbte Elemente zu? 782
Welche Zugriffsspezifizierer haben geerbte Elemente in der abgeleiteten Klasse? 783
Ein Beispiel 783
Zugriffsbeschränkung bei der Vererbung 790
Abgeleitete Klassen anpassen 795
Vererbung und Konstruktor 796
Einrichtung der geerbten Elemente 797
Vom Wert des Standardkonstruktors 800
Aufruf spezieller Basisklassenkonstruktoren 800
Der Destruktor 801
Beziehung zwischen abgeleiteter Klasse und Basisklasse 802
Elementobjekte versus Vererbung 804
Mehrfachvererbung 808
Basisklassen mit gleichlautenden Elementen 809
Kreisschlüsse in der Vererbung 812
Virtuelle Basisklassen 816
Mehrfachvererbung und Speicherauslegung 823
Abschlußübung: Anpassung einer Klassenhierarchie an die Mehrfachvererbung 828 Polymorphismus 835
Idee und Umsetzung 837
Die grundlegende Klassenhierarchie 838
Abgeleitete Objekte als Basisklassenobjekte 842
Virtuelle Methoden 845
Abstrakte Klassen 846
Virtuelle Methoden und Überschreibung 847
Die Überschreibung 847
Virtuelle Methoden 850
Frühe und späte Bindung 851
Realisierung der späten Bindung 854
Regeln für die Überschreibung 858
Abstrakte Methoden und Klassen 860
Rein virtuelle Funktionen 860
Abstrakte Klassen 861
Generische Zeiger 864
Überladung versus Überschreibung 866
Zugriff auf Klassenelemente 869
Public, protected, private 870
Zugriff innerhalb der Klasse 871
Zugriff aus abgeleiteter Klasse 871
Zugriff von außerhalb der Klasse 875
Zugriff über Friends 879 Templates 881
Templates und Typenunabhängigkeit 883
Templates versus Standardkonvertierungen 883
Templates versus Makros 884
Templates und überladene Funktionen 885
Funktionstemplates 894
Klassentemplates 895
Instanzbildung und Spezialisierung 898
Implizite Instanzierung 899
Explizite Instanzierung 900
Explizite Spezialisierung 901
Genauer hingeschaut: die Template-Parameter 903
Laufzeitidentifizierung (RTTI) 907
Wofür braucht man RTTI? 907
Wie funktioniert die RTTI? 911
Virtuelle Methoden 915
Umwandlung mit dynamic_cast 917
Der typeid( )-Operator 921
Objektorientiertes Programmieren 925
Kapselung und Information Hiding 925
Datensicherheit 926
Vererbung und Wiederverwertung 928
Polymorphismus 928
Abstrakte Klassen als Schnittstellenvorgaben 929
Eingeschlossene Objekte versus Vererbung 930
Die Bedeutung der Standardelemente 930
Erweiterung der Standardkonvertierungen 931
Typenunabhängigkeit mit Templates 932
Exception Handling 933 Zeichenketten und Strings 935
Strings als Zeichenketten ( C ) 937
Repräsentation von C-Strings 937
C-Strings und Speicherverwaltung 941
C-Strings bearbeiten 944
Strings als Klasseninstanzen ( C++ ) 952
Die Klasse string 953
Methoden und Operatoren der Klasse string 953
Ein- und Ausgabe 961
Formatierte und unformatierte E/A 962
Formatierte Ein- und Ausgabe 963
Unformatierte Ein- und Ausgabe 965
Was sind Streams? 968
Streams in C und C++ 968
Die C++-Streamklassen 970
Formatierung 972
Fehlerbehandlung 976
Pufferung 979
Internationalisierung 981
Bildschirm und Tastatur 983
Die C-Funktionen printf(), scanf() 983
Ein- und Ausgabe-Streams in C++ 985
Dateien 987
Dateien in C 987
Die Datei-Streams von C++ 992
Modulare Programmierung 999
Sinn, Zweck und Problematik der Modularisierung 999
Programme aus mehreren Quelldateien erstellen 1002
Elemente über Dateigrenzen hinweg verwenden 1005
Elemente auf einzelne Dateien begrenzen 1015
Header-Dateien sinnvoll einsetzen 1016
Von der Quelltextdatei zur Bibliothek 1019
System-Programmierung 1021
Zeit abfragen 1021
Interrupt-Programmierung und Hook-Funktionen 1026
Umgebungsvariablen 1028
Kommandozeilenargumente 1032
Ports (serielle Schnittstellen) 1032
Internationalisierung und Lokalisierung 1045
Der Zeichensatz 1045
Nationale Formatierungen und Lokale 1047
Text und Stringtabellen 1052
Windows-Programmierung 1055
Windows-Grundlagen 1056
Ein Windows-API-Programm 1061
Klassenbibliotheken und Compiler 1065
Klassenbibliotheken: MFC und OWL 1067
RAD-Programmierung mit dem C++Builder 1075
Datenbank-Programmierung 1079
Anbindung und Nutzung bestehender Datenbanksysteme 1080
Datenbankprogrammierung mit Visual C++ 1085
Datenbankprogrammierung mit dem C++Builder 1092
Assembler-Programmierung 1097
Grundlagen der Assembler-Programmierung 1098
Die wichtigsten Register 1100
Die wichtigsten Befehle 1102
Assembler-Anweisungen in C++-Programmen 1105
Genetische Algorithmen 1111
Was sind genetische Algorithmen? 1112
Wie implementiert man genetische Algorithmen? 1115
Wie steuert man genetische Algorithmen? 1129
Objektorientiertes Design 1133
OOA, OOD und UML 1134
Projektplanung 1136
Die Analyse-Phase 1140
Die Design-Phase 1148
Die C-Laufzeitbibliothek 1153
Die C++-Laufzeitbibliothek 1169
Die Container-Klassen 1170
Der Gebrauch von Iteratoren 1183
Die Algorithmen 1188
Funktionsobjekte 1193
Die Stream-Klassen 1198
Die String-Klassen 1201
Sonstige Klassen 1202
Zeichensatz 1209
Der ASCII-Zeichensatz 1209
Der ANSI-Zeichensatz 1210
Literaturverzeichnis 1213
Internet-Adressen 1217
Glossar 1219
Zur CD-ROM 1225
Die Visual C++ Autoren-Edition 1225
objectiF 4.0 von microTool 1228
Stichwortverzeichnis 1231
Über dieses Buch 22 Zur Einstimmung 25
A, B, C - die Geschichte von C und C++ 27
Allgemeine Konzeption einer Programmiersprache 35
Die Hardware 37
Die Hardware-Umgebung 37
Die CPU 39
Assembler 46
Der Compiler 47
Ablauf der Programmerstellung 47
Größere Programme erstellen 50
Compiler versus Interpreter 51
Die Kommunikation mit dem Compiler 53
Entwicklungsumgebungen 57
Das Programmgerüst - Einführung für Programmieranfänger 61
Was ist ein Programm? 61
Ein einführendes Beispiel 65
Hello, world in C und C++ 65
Einbindung der Header-Dateien 67
Ein umfangreicheres Beispiel 68
Ein einführender Programmierkurs 70
Kommentare 70
Datenelemente 71
Operationen auf Daten 73
Programmablauf 75
Funktionen 77
Präprozessor-Direktiven 81
Die Funktion printf() 83
scanf() und wie man es vermeiden kann 86
Stil 88
Erstellung und Ausführung der Beispielprogramme 92
Allgemeine Hinweise 96
Goldene Regeln für Anfänger 96
Von A wie Anweisung bis W wie Whitespace 97
Hinweise für Umsteiger von Pascal 98
Hinweise für Umsteiger von Java 99
Abschlußquiz: Wie ein Zeichen ein Programm verändert 100
Die Daten 103
Variablen 105
Deklaration und Definition 106
Die Bedeutung der Deklaration 107
Namensgebung für Bezeichner 107
Unterschied zwischen Deklaration und Definition 109
Initialisierung 113
Variablen in Anweisungen 115
Gültigkeitsbereiche, Speicherklasse und Lebensdauer 117
Gültigkeitsbereiche 117
Sichtbarkeit 119
Speicherklasse und Lebensdauer 124
Linkage 125
Namensbereiche (nur C++) 132
Namensbereiche und globaler Gültigkeitsbereich 133
Namensbereiche definieren 135
Auf Elemente aus Namensbereichen zugreifen 135
Erweiterung von Namensbereichen 138
Aliase 139
Unbenannte (anonyme) Namespaces statt statischer Variablen 139
Spezifizierer für die Variablendeklaration 140
Speicherklassenspezifizierer 140
Die Typqualifizierer const und volatile 150
Abschlußquiz: Deklarationen und Typen 159
Konstanten 165
Literale - konstante Werte 165
#define - symbolische Konstanten 168
const - konstante Variablen 170
Abschlußprogramm: Umrechnung zwischen Zahlensystemen 171
Elementare Datentypen 175
Klassifizierung der elementaren Datentypen 175
Was sind elementare Datentypen? 176
Wie werden die elementaren Datentypen klassifiziert? 176
Wofür werden Datentypen benötigt? 178
short, int und long 182
float, double und long double 187
bool (nur C++) 198
char und wchar_t 200
void 205
Selbst definierte Datentypen 206
Typspezifizierer 208
Typumwandlung 214
Wann sind zwei Typen kompatibel? 215
Automatische Konvertierung 215
Explizite Typumwandlung 220
Abschlußprogramm: Texte kodieren 220
Operatoren und Ausdrücke 223
Ausdrücke 225
Aufbau 226
Seiteneffekte 226
Aufeinanderfolgende Operatoren 231
Vorzeichen 232
Arithmetische Operatoren 232
Allgemeines 232
Division und Modulo 233
Konvertierung arithmetischer Operanden 234
Polynomberechnung nach Horner-Schema 236
Zuweisungsoperatoren 239
Allgemeines 239
Zuweisung an Zeiger 242
Zuweisung an Klasseninstanzen (nur C++) 243
Inkrement-Operatoren 243
Allgemeines 243
Präfix und Postfix 244
Vergleichsoperatoren 245
Allgemeines 245
Logische Operatoren 247
Allgemeines 247
Die Operatoren im einzelnen 248
Bit-Operatoren 251
Allgemeines 251
Die Bit-Operatoren im einzelnen 251
Flags (Schaltervariablen) 256
Datenzugriff 261
Allgemeines 261
Die Operatoren im einzelnen 262
new und delete (nur C++) 267
new-Operator (nur C++) 267
delete-Operator (nur C++) 272
Operatoren für den Präprozessor 273
Spezielle Operatoren 274
& Adreß-Operator 274
& Referenz-Operator (nur C++) 275
?: Bedingungsoperator 275
, Komma-Operator 276
Der sizeof-Operator 277
Typumwandlung 279
Explizite Typumwandlung mit () 282
Die neuen C++-Operatoren zur Typumwandlung 283
Typidentifizierung (nur C++) 293
Synonyme und Trigraphsequenzen 295
Reihenfolge der Operator-Abarbeitung 296
Überladung von Operatoren (nur C++) 302
Syntax 303
Global oder in Klasse? 306
Rückgabewerte von Operatoren 311
Überladung der Operatoren 313
Überladung des Zuweisungsoperators =() 313
Überladung der op=-Operatoren 316
Überladung des ++-Operators 317
Überladung des cast-Operators 318
Überladung des []-Operators 320
Überladung des ()-Operators 321
Überladung des new-Operators 322
Überladung der Dereferenzierungsoperatoren -> und * 327
Überladung der stream-Operatoren <<, >> 329
Abschlußprogramm: ein Taschenrechner 331
Eigene Datentypen 335
Aufzählungen (enum) 336
Aufzählungen deklarieren 336
Initialisierung 337
Programmieren mit Aufzählungen 338
Aufzählungen als Mengentypen 340
Arrays 341
Arrays deklarieren 342
Initialisierung und Zugriff 343
Programmieren mit Arrays 347
Wie funktionieren Arrays? 359
Besondere Array-Typen 366
Mehrdimensionale Arrays 370
Stringtabellen 377
Matrizen 379
Strukturen (struct) 382
Strukturen deklarieren 382
Initialisierung und Zugriff 383
Programmieren mit Strukturen 385
Speicherbelegung für Strukturen 389
Bitfelder 392
Unions (union) 396
Klassen (nur C++) 399
Klassendeklaration 400
Typdefinitionen mit typedef 405
Deklaration 405
Programmierung mit typedef 405
Unvollständige Datentypen 406
Abschlußprogramm: Adressenverwaltung 407
Zeiger 413
Zeiger deklarieren 415
Mit Zeigern programmieren 426
Warum sind Zeiger so gefährlich? 427
Grundregeln für Anfänger 429
Wofür braucht man Zeiger? 432
Zeiger und Arrays 441
Zeigerarithmetik 442
Spezielle Zeiger 444
Dynamische Speicherreservierung 453
Speicherkonzepte 455
DOS und die segmentierte Adressierung 459
32-Bit-Systeme 467
Speicherallokation mit malloc() und new 471
Dynamische Datenstrukturen 474
Typische Fehlerquellen 478
Abschlußprogramm: Eene, meene, muh 483
Referenzvariablen (nur C++) 487
Referenzvariablen deklarieren 487
Mit Referenzen programmieren 489
Referenzen und Zeiger 493
Referenzen und temporäre Variablen 493
Steuerung des Programmablaufs 497
Kontrollstrukturen 499
Verzweigungen - die if-Bedingung 500
Praktischer Einsatz der if-Verzweigung 501
Bedingungen und boolesche Ausdrücke 506
Fallstricke und Besonderheiten 508
Die switch-Verzweigung 510
Praktischer Einsatz der switch-Verzweigung 511
Fallstricke und Besonderheiten 515
Die for-Schleife 517
Praktischer Einsatz der for-Schleife 519
Performance-Tips 524
Spezielle for-Schleifen 525
Die while-Schleife 530
Praktischer Einsatz der while-Schleife 531
Performance-Tips 536
Spezielle while-Schleifen 536
Schleifen abbrechen 538
continue 539
break 540
Sprünge mit goto 540
Funktionen 543
Was sind Funktionen? 543
Aufbau einer Funktion 544
Was der Compiler von einer Funktionsdeklaration erwartet 546
Die Funktionen der Laufzeitbibliothek 546
Wozu braucht man Funktionen? 548
Funktionen definieren 550
Funktionen, Programmablauf und Stack 556
Datenaustausch zwischen Funktionen 561
Parameter 562
Globale Variablen 570
Lokale Variablen und static 571
Rückgabewert 573
Besondere Funktionen 575
Die Hauptfunktion main() 575
Rekursive Funktionen 577
Funktionen mit beliebig vielen Parametern 578
Inline-Funktionen (nur C++) 580
Vorgabeargumente (nur C++) 582
Überladung (nur C++) 585
Bibliotheken anlegen 589
Von der Funktionensammlung zur Bibliothek 589
Vergleich von Bibliotheken 594
Fehlerbehandlung (mit und ohne Exceptions) 597
Möglichkeiten der Fehlerbehandlung 598
Aufbau einer Exception-Behandlung 602
Programmfluß und Exception-Behandlung 605
Wo wird der Programmfluß nach einer Exception fortgesetzt? 605
Die Problematik des gestörten Programmflusses 607
Komponenten der Exception-Behandlung 609
Exceptions abfangen 609
Exceptions auslösen 612
Vorteile der Exception-Behandlung 613
Die Exceptions von C++ und der ANSI-Bibliothek 615
Funktionen zur Unterstützung der Exception-Behandlung 616
Exceptions unter Windows 617
Präprozessor-Direktiven 621
Einfügen von Dateien mittels #include 622
Konstanten und Makros 626
Symbolische Konstanten 627
Makros 627
Bedingte Kompilierung 629
Sonstige Direktiven und Symbole 634
Objektorientiert programmieren 637
Einführung in die objektorientierte Denkweise 639
Klassen 655
Klassen deklarieren 655
Syntax 655
Logischer Aufbau einer Klasse 657
Instanzbildung und Zugriff auf Elemente 659
Instanzbildung 660
Sinn und Zweck der Konstruktoren 661
Aufruf der Konstruktoren 663
Initialisierung 669
Instanzvariablen (Eigenschaften) 681
Allgemeines 682
Statische Elementvariablen (Klassenvariablen) 686
Konstante und veränderbare Elemente 692
Eingebettete Klassenobjekte 694
Methoden (Verhaltensweisen) 701
Allgemeines 701
Definition innerhalb der Klassendefinition 703
Definition außerhalb der Klassendefinition 704
Der this-Zeiger 705
Statische Methoden 710
Konstante Methoden 714
Virtuelle Methoden 717
Überladung 722
Die Zugriffsspezifizierer public, protected, private 723
Die Konstruktoren - Objekte einrichten 728
Der Standardkonstruktor 731
Eigene Konstruktoren 735
Konstruktoren überladen 737
Arrays von Objekten 737
private- und protected-Konstruktoren 740
Der Destruktor - Objekte auflösen 742
Der Kopierkonstruktor und Zuweisungsoperator 748
Konvertierungskonstruktor und -methoden 755
Fünf Variablentypen und fünf Standardelemente 761
Typdefinitionen in Klassen 762
Aufzählungen in Klassen 762
Verschachtelte Klassen 763
Friends 763
Abschlußprogramm: Magische Quadrate 765
Vererbung 773
Syntax der Vererbung 777
Grundlagen der Vererbung 779
Was bringt uns die Vererbung? 779
Was wird vererbt? 781
Wie greift man auf geerbte Elemente zu? 782
Welche Zugriffsspezifizierer haben geerbte Elemente in der abgeleiteten Klasse? 783
Ein Beispiel 783
Zugriffsbeschränkung bei der Vererbung 790
Abgeleitete Klassen anpassen 795
Vererbung und Konstruktor 796
Einrichtung der geerbten Elemente 797
Vom Wert des Standardkonstruktors 800
Aufruf spezieller Basisklassenkonstruktoren 800
Der Destruktor 801
Beziehung zwischen abgeleiteter Klasse und Basisklasse 802
Elementobjekte versus Vererbung 804
Mehrfachvererbung 808
Basisklassen mit gleichlautenden Elementen 809
Kreisschlüsse in der Vererbung 812
Virtuelle Basisklassen 816
Mehrfachvererbung und Speicherauslegung 823
Abschlußübung: Anpassung einer Klassenhierarchie an die Mehrfachvererbung 828 Polymorphismus 835
Idee und Umsetzung 837
Die grundlegende Klassenhierarchie 838
Abgeleitete Objekte als Basisklassenobjekte 842
Virtuelle Methoden 845
Abstrakte Klassen 846
Virtuelle Methoden und Überschreibung 847
Die Überschreibung 847
Virtuelle Methoden 850
Frühe und späte Bindung 851
Realisierung der späten Bindung 854
Regeln für die Überschreibung 858
Abstrakte Methoden und Klassen 860
Rein virtuelle Funktionen 860
Abstrakte Klassen 861
Generische Zeiger 864
Überladung versus Überschreibung 866
Zugriff auf Klassenelemente 869
Public, protected, private 870
Zugriff innerhalb der Klasse 871
Zugriff aus abgeleiteter Klasse 871
Zugriff von außerhalb der Klasse 875
Zugriff über Friends 879 Templates 881
Templates und Typenunabhängigkeit 883
Templates versus Standardkonvertierungen 883
Templates versus Makros 884
Templates und überladene Funktionen 885
Funktionstemplates 894
Klassentemplates 895
Instanzbildung und Spezialisierung 898
Implizite Instanzierung 899
Explizite Instanzierung 900
Explizite Spezialisierung 901
Genauer hingeschaut: die Template-Parameter 903
Laufzeitidentifizierung (RTTI) 907
Wofür braucht man RTTI? 907
Wie funktioniert die RTTI? 911
Virtuelle Methoden 915
Umwandlung mit dynamic_cast 917
Der typeid( )-Operator 921
Objektorientiertes Programmieren 925
Kapselung und Information Hiding 925
Datensicherheit 926
Vererbung und Wiederverwertung 928
Polymorphismus 928
Abstrakte Klassen als Schnittstellenvorgaben 929
Eingeschlossene Objekte versus Vererbung 930
Die Bedeutung der Standardelemente 930
Erweiterung der Standardkonvertierungen 931
Typenunabhängigkeit mit Templates 932
Exception Handling 933 Zeichenketten und Strings 935
Strings als Zeichenketten ( C ) 937
Repräsentation von C-Strings 937
C-Strings und Speicherverwaltung 941
C-Strings bearbeiten 944
Strings als Klasseninstanzen ( C++ ) 952
Die Klasse string 953
Methoden und Operatoren der Klasse string 953
Ein- und Ausgabe 961
Formatierte und unformatierte E/A 962
Formatierte Ein- und Ausgabe 963
Unformatierte Ein- und Ausgabe 965
Was sind Streams? 968
Streams in C und C++ 968
Die C++-Streamklassen 970
Formatierung 972
Fehlerbehandlung 976
Pufferung 979
Internationalisierung 981
Bildschirm und Tastatur 983
Die C-Funktionen printf(), scanf() 983
Ein- und Ausgabe-Streams in C++ 985
Dateien 987
Dateien in C 987
Die Datei-Streams von C++ 992
Modulare Programmierung 999
Sinn, Zweck und Problematik der Modularisierung 999
Programme aus mehreren Quelldateien erstellen 1002
Elemente über Dateigrenzen hinweg verwenden 1005
Elemente auf einzelne Dateien begrenzen 1015
Header-Dateien sinnvoll einsetzen 1016
Von der Quelltextdatei zur Bibliothek 1019
System-Programmierung 1021
Zeit abfragen 1021
Interrupt-Programmierung und Hook-Funktionen 1026
Umgebungsvariablen 1028
Kommandozeilenargumente 1032
Ports (serielle Schnittstellen) 1032
Internationalisierung und Lokalisierung 1045
Der Zeichensatz 1045
Nationale Formatierungen und Lokale 1047
Text und Stringtabellen 1052
Windows-Programmierung 1055
Windows-Grundlagen 1056
Ein Windows-API-Programm 1061
Klassenbibliotheken und Compiler 1065
Klassenbibliotheken: MFC und OWL 1067
RAD-Programmierung mit dem C++Builder 1075
Datenbank-Programmierung 1079
Anbindung und Nutzung bestehender Datenbanksysteme 1080
Datenbankprogrammierung mit Visual C++ 1085
Datenbankprogrammierung mit dem C++Builder 1092
Assembler-Programmierung 1097
Grundlagen der Assembler-Programmierung 1098
Die wichtigsten Register 1100
Die wichtigsten Befehle 1102
Assembler-Anweisungen in C++-Programmen 1105
Genetische Algorithmen 1111
Was sind genetische Algorithmen? 1112
Wie implementiert man genetische Algorithmen? 1115
Wie steuert man genetische Algorithmen? 1129
Objektorientiertes Design 1133
OOA, OOD und UML 1134
Projektplanung 1136
Die Analyse-Phase 1140
Die Design-Phase 1148
Die C-Laufzeitbibliothek 1153
Die C++-Laufzeitbibliothek 1169
Die Container-Klassen 1170
Der Gebrauch von Iteratoren 1183
Die Algorithmen 1188
Funktionsobjekte 1193
Die Stream-Klassen 1198
Die String-Klassen 1201
Sonstige Klassen 1202
Zeichensatz 1209
Der ASCII-Zeichensatz 1209
Der ANSI-Zeichensatz 1210
Literaturverzeichnis 1213
Internet-Adressen 1217
Glossar 1219
Zur CD-ROM 1225
Die Visual C++ Autoren-Edition 1225
objectiF 4.0 von microTool 1228
Stichwortverzeichnis 1231
Es war einmal ... 19
Über dieses Buch 22 Zur Einstimmung 25
A, B, C - die Geschichte von C und C++ 27
Allgemeine Konzeption einer Programmiersprache 35
Die Hardware 37
Die Hardware-Umgebung 37
Die CPU 39
Assembler 46
Der Compiler 47
Ablauf der Programmerstellung 47
Größere Programme erstellen 50
Compiler versus Interpreter 51
Die Kommunikation mit dem Compiler 53
Entwicklungsumgebungen 57
Das Programmgerüst - Einführung für Programmieranfänger 61
Was ist ein Programm? 61
Ein einführendes Beispiel 65
Hello, world in C und C++ 65
Einbindung der Header-Dateien 67
Ein umfangreicheres Beispiel 68
Ein einführender Programmierkurs 70
Kommentare 70
Datenelemente 71
Operationen auf Daten 73
Programmablauf 75
Funktionen 77
Präprozessor-Direktiven 81
Die Funktion printf() 83
scanf() und wie man es vermeiden kann 86
Stil 88
Erstellung und Ausführung der Beispielprogramme 92
Allgemeine Hinweise 96
Goldene Regeln für Anfänger 96
Von A wie Anweisung bis W wie Whitespace 97
Hinweise für Umsteiger von Pascal 98
Hinweise für Umsteiger von Java 99
Abschlußquiz: Wie ein Zeichen ein Programm verändert 100
Die Daten 103
Variablen 105
Deklaration und Definition 106
Die Bedeutung der Deklaration 107
Namensgebung für Bezeichner 107
Unterschied zwischen Deklaration und Definition 109
Initialisierung 113
Variablen in Anweisungen 115
Gültigkeitsbereiche, Speicherklasse und Lebensdauer 117
Gültigkeitsbereiche 117
Sichtbarkeit 119
Speicherklasse und Lebensdauer 124
Linkage 125
Namensbereiche (nur C++) 132
Namensbereiche und globaler Gültigkeitsbereich 133
Namensbereiche definieren 135
Auf Elemente aus Namensbereichen zugreifen 135
Erweiterung von Namensbereichen 138
Aliase 139
Unbenannte (anonyme) Namespaces statt statischer Variablen 139
Spezifizierer für die Variablendeklaration 140
Speicherklassenspezifizierer 140
Die Typqualifizierer const und volatile 150
Abschlußquiz: Deklarationen und Typen 159
Konstanten 165
Literale - konstante Werte 165
#define - symbolische Konstanten 168
const - konstante Variablen 170
Abschlußprogramm: Umrechnung zwischen Zahlensystemen 171
Elementare Datentypen 175
Klassifizierung der elementaren Datentypen 175
Was sind elementare Datentypen? 176
Wie werden die elementaren Datentypen klassifiziert? 176
Wofür werden Datentypen benötigt? 178
short, int und long 182
float, double und long double 187
bool (nur C++) 198
char und wchar_t 200
void 205
Selbst definierte Datentypen 206
Typspezifizierer 208
Typumwandlung 214
Wann sind zwei Typen kompatibel? 215
Automatische Konvertierung 215
Explizite Typumwandlung 220
Abschlußprogramm: Texte kodieren 220
Operatoren und Ausdrücke 223
Ausdrücke 225
Aufbau 226
Seiteneffekte 226
Aufeinanderfolgende Operatoren 231
Vorzeichen 232
Arithmetische Operatoren 232
Allgemeines 232
Division und Modulo 233
Konvertierung arithmetischer Operanden 234
Polynomberechnung nach Horner-Schema 236
Zuweisungsoperatoren 239
Allgemeines 239
Zuweisung an Zeiger 242
Zuweisung an Klasseninstanzen (nur C++) 243
Inkrement-Operatoren 243
Allgemeines 243
Präfix und Postfix 244
Vergleichsoperatoren 245
Allgemeines 245
Logische Operatoren 247
Allgemeines 247
Die Operatoren im einzelnen 248
Bit-Operatoren 251
Allgemeines 251
Die Bit-Operatoren im einzelnen 251
Flags (Schaltervariablen) 256
Datenzugriff 261
Allgemeines 261
Die Operatoren im einzelnen 262
new und delete (nur C++) 267
new-Operator (nur C++) 267
delete-Operator (nur C++) 272
Operatoren für den Präprozessor 273
Spezielle Operatoren 274
& Adreß-Operator 274
& Referenz-Operator (nur C++) 275
?: Bedingungsoperator 275
, Komma-Operator 276
Der sizeof-Operator 277
Typumwandlung 279
Explizite Typumwandlung mit () 282
Die neuen C++-Operatoren zur Typumwandlung 283
Typidentifizierung (nur C++) 293
Synonyme und Trigraphsequenzen 295
Reihenfolge der Operator-Abarbeitung 296
Überladung von Operatoren (nur C++) 302
Syntax 303
Global oder in Klasse? 306
Rückgabewerte von Operatoren 311
Überladung der Operatoren 313
Überladung des Zuweisungsoperators =() 313
Überladung der op=-Operatoren 316
Überladung des ++-Operators 317
Überladung des cast-Operators 318
Überladung des []-Operators 320
Überladung des ()-Operators 321
Überladung des new-Operators 322
Überladung der Dereferenzierungsoperatoren -> und * 327
Überladung der stream-Operatoren <<, >> 329
Abschlußprogramm: ein Taschenrechner 331
Eigene Datentypen 335
Aufzählungen (enum) 336
Aufzählungen deklarieren 336
Initialisierung 337
Programmieren mit Aufzählungen 338
Aufzählungen als Mengentypen 340
Arrays 341
Arrays deklarieren 342
Initialisierung und Zugriff 343
Programmieren mit Arrays 347
Wie funktionieren Arrays? 359
Besondere Array-Typen 366
Mehrdimensionale Arrays 370
Stringtabellen 377
Matrizen 379
Strukturen (struct) 382
Strukturen deklarieren 382
Initialisierung und Zugriff 383
Programmieren mit Strukturen 385
Speicherbelegung für Strukturen 389
Bitfelder 392
Unions (union) 396
Klassen (nur C++) 399
Klassendeklaration 400
Typdefinitionen mit typedef 405
Deklaration 405
Programmierung mit typedef 405
Unvollständige Datentypen 406
Abschlußprogramm: Adressenverwaltung 407
Zeiger 413
Zeiger deklarieren 415
Mit Zeigern programmieren 426
Warum sind Zeiger so gefährlich? 427
Grundregeln für Anfänger 429
Wofür braucht man Zeiger? 432
Zeiger und Arrays 441
Zeigerarithmetik 442
Spezielle Zeiger 444
Dynamische Speicherreservierung 453
Speicherkonzepte 455
DOS und die segmentierte Adressierung 459
32-Bit-Systeme 467
Speicherallokation mit malloc() und new 471
Dynamische Datenstrukturen 474
Typische Fehlerquellen 478
Abschlußprogramm: Eene, meene, muh 483
Referenzvariablen (nur C++) 487
Referenzvariablen deklarieren 487
Mit Referenzen programmieren 489
Referenzen und Zeiger 493
Referenzen und temporäre Variablen 493
Steuerung des Programmablaufs 497
Kontrollstrukturen 499
Verzweigungen - die if-Bedingung 500
Praktischer Einsatz der if-Verzweigung 501
Bedingungen und boolesche Ausdrücke 506
Fallstricke und Besonderheiten 508
Die switch-Verzweigung 510
Praktischer Einsatz der switch-Verzweigung 511
Fallstricke und Besonderheiten 515
Die for-Schleife 517
Praktischer Einsatz der for-Schleife 519
Performance-Tips 524
Spezielle for-Schleifen 525
Die while-Schleife 530
Praktischer Einsatz der while-Schleife 531
Performance-Tips 536
Spezielle while-Schleifen 536
Schleifen abbrechen 538
continue 539
break 540
Sprünge mit goto 540
Funktionen 543
Was sind Funktionen? 543
Aufbau einer Funktion 544
Was der Compiler von einer Funktionsdeklaration erwartet 546
Die Funktionen der Laufzeitbibliothek 546
Wozu braucht man Funktionen? 548
Funktionen definieren 550
Funktionen, Programmablauf und Stack 556
Datenaustausch zwischen Funktionen 561
Parameter 562
Globale Variablen 570
Lokale Variablen und static 571
Rückgabewert 573
Besondere Funktionen 575
Die Hauptfunktion main() 575
Rekursive Funktionen 577
Funktionen mit beliebig vielen Parametern 578
Inline-Funktionen (nur C++) 580
Vorgabeargumente (nur C++) 582
Überladung (nur C++) 585
Bibliotheken anlegen 589
Von der Funktionensammlung zur Bibliothek 589
Vergleich von Bibliotheken 594
Fehlerbehandlung (mit und ohne Exceptions) 597
Möglichkeiten der Fehlerbehandlung 598
Aufbau einer Exception-Behandlung 602
Programmfluß und Exception-Behandlung 605
Wo wird der Programmfluß nach einer Exception fortgesetzt? 605
Die Problematik des gestörten Programmflusses 607
Komponenten der Exception-Behandlung 609
Exceptions abfangen 609
Exceptions auslösen 612
Vorteile der Exception-Behandlung 613
Die Exceptions von C++ und der ANSI-Bibliothek 615
Funktionen zur Unterstützung der Exception-Behandlung 616
Exceptions unter Windows 617
Präprozessor-Direktiven 621
Einfügen von Dateien mittels #include 622
Konstanten und Makros 626
Symbolische Konstanten 627
Makros 627
Bedingte Kompilierung 629
Sonstige Direktiven und Symbole 634
Objektorientiert programmieren 637
Einführung in die objektorientierte Denkweise 639
Klassen 655
Klassen deklarieren 655
Syntax 655
Logischer Aufbau einer Klasse 657
Instanzbildung und Zugriff auf Elemente 659
Instanzbildung 660
Sinn und Zweck der Konstruktoren 661
Aufruf der Konstruktoren 663
Initialisierung 669
Instanzvariablen (Eigenschaften) 681
Allgemeines 682
Statische Elementvariablen (Klassenvariablen) 686
Konstante und veränderbare Elemente 692
Eingebettete Klassenobjekte 694
Methoden (Verhaltensweisen) 701
Allgemeines 701
Definition innerhalb der Klassendefinition 703
Definition außerhalb der Klassendefinition 704
Der this-Zeiger 705
Statische Methoden 710
Konstante Methoden 714
Virtuelle Methoden 717
Überladung 722
Die Zugriffsspezifizierer public, protected, private 723
Die Konstruktoren - Objekte einrichten 728
Der Standardkonstruktor 731
Eigene Konstruktoren 735
Konstruktoren überladen 737
Arrays von Objekten 737
private- und protected-Konstruktoren 740
Der Destruktor - Objekte auflösen 742
Der Kopierkonstruktor und Zuweisungsoperator 748
Konvertierungskonstruktor und -methoden 755
Fünf Variablentypen und fünf Standardelemente 761
Typdefinitionen in Klassen 762
Aufzählungen in Klassen 762
Verschachtelte Klassen 763
Friends 763
Abschlußprogramm: Magische Quadrate 765
Vererbung 773
Syntax der Vererbung 777
Grundlagen der Vererbung 779
Was bringt uns die Vererbung? 779
Was wird vererbt? 781
Wie greift man auf geerbte Elemente zu? 782
Welche Zugriffsspezifizierer haben geerbte Elemente in der abgeleiteten Klasse? 783
Ein Beispiel 783
Zugriffsbeschränkung bei der Vererbung 790
Abgeleitete Klassen anpassen 795
Vererbung und Konstruktor 796
Einrichtung der geerbten Elemente 797
Vom Wert des Standardkonstruktors 800
Aufruf spezieller Basisklassenkonstruktoren 800
Der Destruktor 801
Beziehung zwischen abgeleiteter Klasse und Basisklasse 802
Elementobjekte versus Vererbung 804
Mehrfachvererbung 808
Basisklassen mit gleichlautenden Elementen 809
Kreisschlüsse in der Vererbung 812
Virtuelle Basisklassen 816
Mehrfachvererbung und Speicherauslegung 823
Abschlußübung: Anpassung einer Klassenhierarchie an die Mehrfachvererbung 828 Polymorphismus 835
Idee und Umsetzung 837
Die grundlegende Klassenhierarchie 838
Abgeleitete Objekte als Basisklassenobjekte 842
Virtuelle Methoden 845
Abstrakte Klassen 846
Virtuelle Methoden und Überschreibung 847
Die Überschreibung 847
Virtuelle Methoden 850
Frühe und späte Bindung 851
Realisierung der späten Bindung 854
Regeln für die Überschreibung 858
Abstrakte Methoden und Klassen 860
Rein virtuelle Funktionen 860
Abstrakte Klassen 861
Generische Zeiger 864
Überladung versus Überschreibung 866
Zugriff auf Klassenelemente 869
Public, protected, private 870
Zugriff innerhalb der Klasse 871
Zugriff aus abgeleiteter Klasse 871
Zugriff von außerhalb der Klasse 875
Zugriff über Friends 879 Templates 881
Templates und Typenunabhängigkeit 883
Templates versus Standardkonvertierungen 883
Templates versus Makros 884
Templates und überladene Funktionen 885
Funktionstemplates 894
Klassentemplates 895
Instanzbildung und Spezialisierung 898
Implizite Instanzierung 899
Explizite Instanzierung 900
Explizite Spezialisierung 901
Genauer hingeschaut: die Template-Parameter 903
Laufzeitidentifizierung (RTTI) 907
Wofür braucht man RTTI? 907
Wie funktioniert die RTTI? 911
Virtuelle Methoden 915
Umwandlung mit dynamic_cast 917
Der typeid( )-Operator 921
Objektorientiertes Programmieren 925
Kapselung und Information Hiding 925
Datensicherheit 926
Vererbung und Wiederverwertung 928
Polymorphismus 928
Abstrakte Klassen als Schnittstellenvorgaben 929
Eingeschlossene Objekte versus Vererbung 930
Die Bedeutung der Standardelemente 930
Erweiterung der Standardkonvertierungen 931
Typenunabhängigkeit mit Templates 932
Exception Handling 933 Zeichenketten und Strings 935
Strings als Zeichenketten ( C ) 937
Repräsentation von C-Strings 937
C-Strings und Speicherverwaltung 941
C-Strings bearbeiten 944
Strings als Klasseninstanzen ( C++ ) 952
Die Klasse string 953
Methoden und Operatoren der Klasse string 953
Ein- und Ausgabe 961
Formatierte und unformatierte E/A 962
Formatierte Ein- und Ausgabe 963
Unformatierte Ein- und Ausgabe 965
Was sind Streams? 968
Streams in C und C++ 968
Die C++-Streamklassen 970
Formatierung 972
Fehlerbehandlung 976
Pufferung 979
Internationalisierung 981
Bildschirm und Tastatur 983
Die C-Funktionen printf(), scanf() 983
Ein- und Ausgabe-Streams in C++ 985
Dateien 987
Dateien in C 987
Die Datei-Streams von C++ 992
Modulare Programmierung 999
Sinn, Zweck und Problematik der Modularisierung 999
Programme aus mehreren Quelldateien erstellen 1002
Elemente über Dateigrenzen hinweg verwenden 1005
Elemente auf einzelne Dateien begrenzen 1015
Header-Dateien sinnvoll einsetzen 1016
Von der Quelltextdatei zur Bibliothek 1019
System-Programmierung 1021
Zeit abfragen 1021
Interrupt-Programmierung und Hook-Funktionen 1026
Umgebungsvariablen 1028
Kommandozeilenargumente 1032
Ports (serielle Schnittstellen) 1032
Internationalisierung und Lokalisierung 1045
Der Zeichensatz 1045
Nationale Formatierungen und Lokale 1047
Text und Stringtabellen 1052
Windows-Programmierung 1055
Windows-Grundlagen 1056
Ein Windows-API-Programm 1061
Klassenbibliotheken und Compiler 1065
Klassenbibliotheken: MFC und OWL 1067
RAD-Programmierung mit dem C++Builder 1075
Datenbank-Programmierung 1079
Anbindung und Nutzung bestehender Datenbanksysteme 1080
Datenbankprogrammierung mit Visual C++ 1085
Datenbankprogrammierung mit dem C++Builder 1092
Assembler-Programmierung 1097
Grundlagen der Assembler-Programmierung 1098
Die wichtigsten Register 1100
Die wichtigsten Befehle 1102
Assembler-Anweisungen in C++-Programmen 1105
Genetische Algorithmen 1111
Was sind genetische Algorithmen? 1112
Wie implementiert man genetische Algorithmen? 1115
Wie steuert man genetische Algorithmen? 1129
Objektorientiertes Design 1133
OOA, OOD und UML 1134
Projektplanung 1136
Die Analyse-Phase 1140
Die Design-Phase 1148
Die C-Laufzeitbibliothek 1153
Die C++-Laufzeitbibliothek 1169
Die Container-Klassen 1170
Der Gebrauch von Iteratoren 1183
Die Algorithmen 1188
Funktionsobjekte 1193
Die Stream-Klassen 1198
Die String-Klassen 1201
Sonstige Klassen 1202
Zeichensatz 1209
Der ASCII-Zeichensatz 1209
Der ANSI-Zeichensatz 1210
Literaturverzeichnis 1213
Internet-Adressen 1217
Glossar 1219
Zur CD-ROM 1225
Die Visual C++ Autoren-Edition 1225
objectiF 4.0 von microTool 1228
Stichwortverzeichnis 1231
Über dieses Buch 22 Zur Einstimmung 25
A, B, C - die Geschichte von C und C++ 27
Allgemeine Konzeption einer Programmiersprache 35
Die Hardware 37
Die Hardware-Umgebung 37
Die CPU 39
Assembler 46
Der Compiler 47
Ablauf der Programmerstellung 47
Größere Programme erstellen 50
Compiler versus Interpreter 51
Die Kommunikation mit dem Compiler 53
Entwicklungsumgebungen 57
Das Programmgerüst - Einführung für Programmieranfänger 61
Was ist ein Programm? 61
Ein einführendes Beispiel 65
Hello, world in C und C++ 65
Einbindung der Header-Dateien 67
Ein umfangreicheres Beispiel 68
Ein einführender Programmierkurs 70
Kommentare 70
Datenelemente 71
Operationen auf Daten 73
Programmablauf 75
Funktionen 77
Präprozessor-Direktiven 81
Die Funktion printf() 83
scanf() und wie man es vermeiden kann 86
Stil 88
Erstellung und Ausführung der Beispielprogramme 92
Allgemeine Hinweise 96
Goldene Regeln für Anfänger 96
Von A wie Anweisung bis W wie Whitespace 97
Hinweise für Umsteiger von Pascal 98
Hinweise für Umsteiger von Java 99
Abschlußquiz: Wie ein Zeichen ein Programm verändert 100
Die Daten 103
Variablen 105
Deklaration und Definition 106
Die Bedeutung der Deklaration 107
Namensgebung für Bezeichner 107
Unterschied zwischen Deklaration und Definition 109
Initialisierung 113
Variablen in Anweisungen 115
Gültigkeitsbereiche, Speicherklasse und Lebensdauer 117
Gültigkeitsbereiche 117
Sichtbarkeit 119
Speicherklasse und Lebensdauer 124
Linkage 125
Namensbereiche (nur C++) 132
Namensbereiche und globaler Gültigkeitsbereich 133
Namensbereiche definieren 135
Auf Elemente aus Namensbereichen zugreifen 135
Erweiterung von Namensbereichen 138
Aliase 139
Unbenannte (anonyme) Namespaces statt statischer Variablen 139
Spezifizierer für die Variablendeklaration 140
Speicherklassenspezifizierer 140
Die Typqualifizierer const und volatile 150
Abschlußquiz: Deklarationen und Typen 159
Konstanten 165
Literale - konstante Werte 165
#define - symbolische Konstanten 168
const - konstante Variablen 170
Abschlußprogramm: Umrechnung zwischen Zahlensystemen 171
Elementare Datentypen 175
Klassifizierung der elementaren Datentypen 175
Was sind elementare Datentypen? 176
Wie werden die elementaren Datentypen klassifiziert? 176
Wofür werden Datentypen benötigt? 178
short, int und long 182
float, double und long double 187
bool (nur C++) 198
char und wchar_t 200
void 205
Selbst definierte Datentypen 206
Typspezifizierer 208
Typumwandlung 214
Wann sind zwei Typen kompatibel? 215
Automatische Konvertierung 215
Explizite Typumwandlung 220
Abschlußprogramm: Texte kodieren 220
Operatoren und Ausdrücke 223
Ausdrücke 225
Aufbau 226
Seiteneffekte 226
Aufeinanderfolgende Operatoren 231
Vorzeichen 232
Arithmetische Operatoren 232
Allgemeines 232
Division und Modulo 233
Konvertierung arithmetischer Operanden 234
Polynomberechnung nach Horner-Schema 236
Zuweisungsoperatoren 239
Allgemeines 239
Zuweisung an Zeiger 242
Zuweisung an Klasseninstanzen (nur C++) 243
Inkrement-Operatoren 243
Allgemeines 243
Präfix und Postfix 244
Vergleichsoperatoren 245
Allgemeines 245
Logische Operatoren 247
Allgemeines 247
Die Operatoren im einzelnen 248
Bit-Operatoren 251
Allgemeines 251
Die Bit-Operatoren im einzelnen 251
Flags (Schaltervariablen) 256
Datenzugriff 261
Allgemeines 261
Die Operatoren im einzelnen 262
new und delete (nur C++) 267
new-Operator (nur C++) 267
delete-Operator (nur C++) 272
Operatoren für den Präprozessor 273
Spezielle Operatoren 274
& Adreß-Operator 274
& Referenz-Operator (nur C++) 275
?: Bedingungsoperator 275
, Komma-Operator 276
Der sizeof-Operator 277
Typumwandlung 279
Explizite Typumwandlung mit () 282
Die neuen C++-Operatoren zur Typumwandlung 283
Typidentifizierung (nur C++) 293
Synonyme und Trigraphsequenzen 295
Reihenfolge der Operator-Abarbeitung 296
Überladung von Operatoren (nur C++) 302
Syntax 303
Global oder in Klasse? 306
Rückgabewerte von Operatoren 311
Überladung der Operatoren 313
Überladung des Zuweisungsoperators =() 313
Überladung der op=-Operatoren 316
Überladung des ++-Operators 317
Überladung des cast-Operators 318
Überladung des []-Operators 320
Überladung des ()-Operators 321
Überladung des new-Operators 322
Überladung der Dereferenzierungsoperatoren -> und * 327
Überladung der stream-Operatoren <<, >> 329
Abschlußprogramm: ein Taschenrechner 331
Eigene Datentypen 335
Aufzählungen (enum) 336
Aufzählungen deklarieren 336
Initialisierung 337
Programmieren mit Aufzählungen 338
Aufzählungen als Mengentypen 340
Arrays 341
Arrays deklarieren 342
Initialisierung und Zugriff 343
Programmieren mit Arrays 347
Wie funktionieren Arrays? 359
Besondere Array-Typen 366
Mehrdimensionale Arrays 370
Stringtabellen 377
Matrizen 379
Strukturen (struct) 382
Strukturen deklarieren 382
Initialisierung und Zugriff 383
Programmieren mit Strukturen 385
Speicherbelegung für Strukturen 389
Bitfelder 392
Unions (union) 396
Klassen (nur C++) 399
Klassendeklaration 400
Typdefinitionen mit typedef 405
Deklaration 405
Programmierung mit typedef 405
Unvollständige Datentypen 406
Abschlußprogramm: Adressenverwaltung 407
Zeiger 413
Zeiger deklarieren 415
Mit Zeigern programmieren 426
Warum sind Zeiger so gefährlich? 427
Grundregeln für Anfänger 429
Wofür braucht man Zeiger? 432
Zeiger und Arrays 441
Zeigerarithmetik 442
Spezielle Zeiger 444
Dynamische Speicherreservierung 453
Speicherkonzepte 455
DOS und die segmentierte Adressierung 459
32-Bit-Systeme 467
Speicherallokation mit malloc() und new 471
Dynamische Datenstrukturen 474
Typische Fehlerquellen 478
Abschlußprogramm: Eene, meene, muh 483
Referenzvariablen (nur C++) 487
Referenzvariablen deklarieren 487
Mit Referenzen programmieren 489
Referenzen und Zeiger 493
Referenzen und temporäre Variablen 493
Steuerung des Programmablaufs 497
Kontrollstrukturen 499
Verzweigungen - die if-Bedingung 500
Praktischer Einsatz der if-Verzweigung 501
Bedingungen und boolesche Ausdrücke 506
Fallstricke und Besonderheiten 508
Die switch-Verzweigung 510
Praktischer Einsatz der switch-Verzweigung 511
Fallstricke und Besonderheiten 515
Die for-Schleife 517
Praktischer Einsatz der for-Schleife 519
Performance-Tips 524
Spezielle for-Schleifen 525
Die while-Schleife 530
Praktischer Einsatz der while-Schleife 531
Performance-Tips 536
Spezielle while-Schleifen 536
Schleifen abbrechen 538
continue 539
break 540
Sprünge mit goto 540
Funktionen 543
Was sind Funktionen? 543
Aufbau einer Funktion 544
Was der Compiler von einer Funktionsdeklaration erwartet 546
Die Funktionen der Laufzeitbibliothek 546
Wozu braucht man Funktionen? 548
Funktionen definieren 550
Funktionen, Programmablauf und Stack 556
Datenaustausch zwischen Funktionen 561
Parameter 562
Globale Variablen 570
Lokale Variablen und static 571
Rückgabewert 573
Besondere Funktionen 575
Die Hauptfunktion main() 575
Rekursive Funktionen 577
Funktionen mit beliebig vielen Parametern 578
Inline-Funktionen (nur C++) 580
Vorgabeargumente (nur C++) 582
Überladung (nur C++) 585
Bibliotheken anlegen 589
Von der Funktionensammlung zur Bibliothek 589
Vergleich von Bibliotheken 594
Fehlerbehandlung (mit und ohne Exceptions) 597
Möglichkeiten der Fehlerbehandlung 598
Aufbau einer Exception-Behandlung 602
Programmfluß und Exception-Behandlung 605
Wo wird der Programmfluß nach einer Exception fortgesetzt? 605
Die Problematik des gestörten Programmflusses 607
Komponenten der Exception-Behandlung 609
Exceptions abfangen 609
Exceptions auslösen 612
Vorteile der Exception-Behandlung 613
Die Exceptions von C++ und der ANSI-Bibliothek 615
Funktionen zur Unterstützung der Exception-Behandlung 616
Exceptions unter Windows 617
Präprozessor-Direktiven 621
Einfügen von Dateien mittels #include 622
Konstanten und Makros 626
Symbolische Konstanten 627
Makros 627
Bedingte Kompilierung 629
Sonstige Direktiven und Symbole 634
Objektorientiert programmieren 637
Einführung in die objektorientierte Denkweise 639
Klassen 655
Klassen deklarieren 655
Syntax 655
Logischer Aufbau einer Klasse 657
Instanzbildung und Zugriff auf Elemente 659
Instanzbildung 660
Sinn und Zweck der Konstruktoren 661
Aufruf der Konstruktoren 663
Initialisierung 669
Instanzvariablen (Eigenschaften) 681
Allgemeines 682
Statische Elementvariablen (Klassenvariablen) 686
Konstante und veränderbare Elemente 692
Eingebettete Klassenobjekte 694
Methoden (Verhaltensweisen) 701
Allgemeines 701
Definition innerhalb der Klassendefinition 703
Definition außerhalb der Klassendefinition 704
Der this-Zeiger 705
Statische Methoden 710
Konstante Methoden 714
Virtuelle Methoden 717
Überladung 722
Die Zugriffsspezifizierer public, protected, private 723
Die Konstruktoren - Objekte einrichten 728
Der Standardkonstruktor 731
Eigene Konstruktoren 735
Konstruktoren überladen 737
Arrays von Objekten 737
private- und protected-Konstruktoren 740
Der Destruktor - Objekte auflösen 742
Der Kopierkonstruktor und Zuweisungsoperator 748
Konvertierungskonstruktor und -methoden 755
Fünf Variablentypen und fünf Standardelemente 761
Typdefinitionen in Klassen 762
Aufzählungen in Klassen 762
Verschachtelte Klassen 763
Friends 763
Abschlußprogramm: Magische Quadrate 765
Vererbung 773
Syntax der Vererbung 777
Grundlagen der Vererbung 779
Was bringt uns die Vererbung? 779
Was wird vererbt? 781
Wie greift man auf geerbte Elemente zu? 782
Welche Zugriffsspezifizierer haben geerbte Elemente in der abgeleiteten Klasse? 783
Ein Beispiel 783
Zugriffsbeschränkung bei der Vererbung 790
Abgeleitete Klassen anpassen 795
Vererbung und Konstruktor 796
Einrichtung der geerbten Elemente 797
Vom Wert des Standardkonstruktors 800
Aufruf spezieller Basisklassenkonstruktoren 800
Der Destruktor 801
Beziehung zwischen abgeleiteter Klasse und Basisklasse 802
Elementobjekte versus Vererbung 804
Mehrfachvererbung 808
Basisklassen mit gleichlautenden Elementen 809
Kreisschlüsse in der Vererbung 812
Virtuelle Basisklassen 816
Mehrfachvererbung und Speicherauslegung 823
Abschlußübung: Anpassung einer Klassenhierarchie an die Mehrfachvererbung 828 Polymorphismus 835
Idee und Umsetzung 837
Die grundlegende Klassenhierarchie 838
Abgeleitete Objekte als Basisklassenobjekte 842
Virtuelle Methoden 845
Abstrakte Klassen 846
Virtuelle Methoden und Überschreibung 847
Die Überschreibung 847
Virtuelle Methoden 850
Frühe und späte Bindung 851
Realisierung der späten Bindung 854
Regeln für die Überschreibung 858
Abstrakte Methoden und Klassen 860
Rein virtuelle Funktionen 860
Abstrakte Klassen 861
Generische Zeiger 864
Überladung versus Überschreibung 866
Zugriff auf Klassenelemente 869
Public, protected, private 870
Zugriff innerhalb der Klasse 871
Zugriff aus abgeleiteter Klasse 871
Zugriff von außerhalb der Klasse 875
Zugriff über Friends 879 Templates 881
Templates und Typenunabhängigkeit 883
Templates versus Standardkonvertierungen 883
Templates versus Makros 884
Templates und überladene Funktionen 885
Funktionstemplates 894
Klassentemplates 895
Instanzbildung und Spezialisierung 898
Implizite Instanzierung 899
Explizite Instanzierung 900
Explizite Spezialisierung 901
Genauer hingeschaut: die Template-Parameter 903
Laufzeitidentifizierung (RTTI) 907
Wofür braucht man RTTI? 907
Wie funktioniert die RTTI? 911
Virtuelle Methoden 915
Umwandlung mit dynamic_cast 917
Der typeid( )-Operator 921
Objektorientiertes Programmieren 925
Kapselung und Information Hiding 925
Datensicherheit 926
Vererbung und Wiederverwertung 928
Polymorphismus 928
Abstrakte Klassen als Schnittstellenvorgaben 929
Eingeschlossene Objekte versus Vererbung 930
Die Bedeutung der Standardelemente 930
Erweiterung der Standardkonvertierungen 931
Typenunabhängigkeit mit Templates 932
Exception Handling 933 Zeichenketten und Strings 935
Strings als Zeichenketten ( C ) 937
Repräsentation von C-Strings 937
C-Strings und Speicherverwaltung 941
C-Strings bearbeiten 944
Strings als Klasseninstanzen ( C++ ) 952
Die Klasse string 953
Methoden und Operatoren der Klasse string 953
Ein- und Ausgabe 961
Formatierte und unformatierte E/A 962
Formatierte Ein- und Ausgabe 963
Unformatierte Ein- und Ausgabe 965
Was sind Streams? 968
Streams in C und C++ 968
Die C++-Streamklassen 970
Formatierung 972
Fehlerbehandlung 976
Pufferung 979
Internationalisierung 981
Bildschirm und Tastatur 983
Die C-Funktionen printf(), scanf() 983
Ein- und Ausgabe-Streams in C++ 985
Dateien 987
Dateien in C 987
Die Datei-Streams von C++ 992
Modulare Programmierung 999
Sinn, Zweck und Problematik der Modularisierung 999
Programme aus mehreren Quelldateien erstellen 1002
Elemente über Dateigrenzen hinweg verwenden 1005
Elemente auf einzelne Dateien begrenzen 1015
Header-Dateien sinnvoll einsetzen 1016
Von der Quelltextdatei zur Bibliothek 1019
System-Programmierung 1021
Zeit abfragen 1021
Interrupt-Programmierung und Hook-Funktionen 1026
Umgebungsvariablen 1028
Kommandozeilenargumente 1032
Ports (serielle Schnittstellen) 1032
Internationalisierung und Lokalisierung 1045
Der Zeichensatz 1045
Nationale Formatierungen und Lokale 1047
Text und Stringtabellen 1052
Windows-Programmierung 1055
Windows-Grundlagen 1056
Ein Windows-API-Programm 1061
Klassenbibliotheken und Compiler 1065
Klassenbibliotheken: MFC und OWL 1067
RAD-Programmierung mit dem C++Builder 1075
Datenbank-Programmierung 1079
Anbindung und Nutzung bestehender Datenbanksysteme 1080
Datenbankprogrammierung mit Visual C++ 1085
Datenbankprogrammierung mit dem C++Builder 1092
Assembler-Programmierung 1097
Grundlagen der Assembler-Programmierung 1098
Die wichtigsten Register 1100
Die wichtigsten Befehle 1102
Assembler-Anweisungen in C++-Programmen 1105
Genetische Algorithmen 1111
Was sind genetische Algorithmen? 1112
Wie implementiert man genetische Algorithmen? 1115
Wie steuert man genetische Algorithmen? 1129
Objektorientiertes Design 1133
OOA, OOD und UML 1134
Projektplanung 1136
Die Analyse-Phase 1140
Die Design-Phase 1148
Die C-Laufzeitbibliothek 1153
Die C++-Laufzeitbibliothek 1169
Die Container-Klassen 1170
Der Gebrauch von Iteratoren 1183
Die Algorithmen 1188
Funktionsobjekte 1193
Die Stream-Klassen 1198
Die String-Klassen 1201
Sonstige Klassen 1202
Zeichensatz 1209
Der ASCII-Zeichensatz 1209
Der ANSI-Zeichensatz 1210
Literaturverzeichnis 1213
Internet-Adressen 1217
Glossar 1219
Zur CD-ROM 1225
Die Visual C++ Autoren-Edition 1225
objectiF 4.0 von microTool 1228
Stichwortverzeichnis 1231