|
Auf einen Blick |
12 |
|
|
Inhaltsverzeichnis |
14 |
|
|
Teil I Einführung in die Sprache |
24 |
|
|
1 Einführung |
26 |
|
|
1.1 Compiler |
29 |
|
|
2 Grundlegende Begriffe |
30 |
|
|
2.1 Das erste Programm |
30 |
|
|
2.2 Einfache Datentypen und Operatoren |
38 |
|
|
2.2.1 Ausdruck |
39 |
|
|
2.2.2 Ganze Zahlen |
39 |
|
|
2.2.3 Reelle Zahlen |
44 |
|
|
2.2.4 Zeichen |
50 |
|
|
2.2.5 Logischer Datentyp |
53 |
|
|
2.2.6 Referenzen |
55 |
|
|
2.2.7 Komplexe Zahlen |
55 |
|
|
2.3 Gültigkeitsbereich und Sichtbarkeit |
57 |
|
|
2.3.1 Namespace std |
59 |
|
|
2.4 Kontrollstrukturen |
60 |
|
|
2.4.1 Anweisungen |
60 |
|
|
2.4.2 Sequenz (Reihung) |
62 |
|
|
2.4.3 Auswahl (Selektion, Verzweigung) |
62 |
|
|
2.4.4 Fallunterscheidungen mit switch |
69 |
|
|
2.4.5 Schleifen |
72 |
|
|
2.4.6 Kontrolle mit break und continue |
80 |
|
|
2.5 Benutzerdefinierte und zusammengesetzte Datentypen |
83 |
|
|
2.5.1 Aufzählungstypen |
83 |
|
|
2.5.2 Arrays: Der C++-Standardtyp vector |
85 |
|
|
2.5.3 Zeichenketten: Der C++-Standardtyp string |
91 |
|
|
2.5.4 Strukturierte Datentypen |
93 |
|
|
3 Einfache Ein- und Ausgabe |
96 |
|
|
3.1 Standardein- und -ausgabe |
96 |
|
|
3.2 Ein- und Ausgabe mit Dateien |
99 |
|
|
4 Programmstrukturierung |
104 |
|
|
4.1 Funktionen |
104 |
|
|
4.1.1 Aufbau und Prototypen |
105 |
|
|
4.1.2 Gültigkeitsbereiche und Sichtbarkeit in Funktionen |
108 |
|
|
4.2 Schnittstellen zum Datentransfer |
110 |
|
|
4.2.1 Übergabe per Wert |
110 |
|
|
4.2.2 Übergabe per Referenz |
113 |
|
|
4.2.3 Gefahren bei der Rückgabe von Referenzen |
114 |
|
|
4.2.4 Vorgegebene Parameterwerte und variable Parameterzahl |
115 |
|
|
4.2.5 Überladen von Funktionen |
116 |
|
|
4.2.6 Funktion main() |
119 |
|
|
4.2.7 Spezifikation von Funktionen |
120 |
|
|
4.2.8 Beispiel Taschenrechnersimulation |
121 |
|
|
4.3 Grundsätze der modularen Gestaltung |
127 |
|
|
4.3.1 Steuerung der Übersetzung mit #include |
128 |
|
|
4.3.2 Einbinden vorübersetzter Programmteile |
128 |
|
|
4.3.3 Dateiübergreifende Gültigkeit und Sichtbarkeit |
130 |
|
|
4.3.4 Übersetzungseinheit, Deklaration, Definition |
133 |
|
|
4.3.5 Compilerdirektiven und Makros |
135 |
|
|
4.4 Funktionstemplates |
142 |
|
|
4.4.1 Spezialisierung von Templates |
145 |
|
|
4.4.2 Einbinden von Templates |
146 |
|
|
4.5 inline-Funktionen |
147 |
|
|
4.6 Standardfunktionen / Bibliotheken |
149 |
|
|
5 Objektorientierung |
150 |
|
|
5.1 Abstrakte Datentypen |
150 |
|
|
5.2 Klassen und Objekte |
152 |
|
|
5.2.1 inline-Elementfunktionen |
156 |
|
|
5.3 Initialisierung und Konstruktoren |
157 |
|
|
5.3.1 Standardkonstruktor |
158 |
|
|
5.3.2 Allgemeine Konstruktoren |
159 |
|
|
5.3.3 Kopierkonstruktor |
162 |
|
|
5.3.4 Typumwandlungskonstruktor |
164 |
|
|
5.4 Beispiel: Klasse für rationale Zahlen |
166 |
|
|
5.4.1 Aufgabenstellung |
166 |
|
|
5.4.2 Entwurf |
167 |
|
|
5.4.3 Implementation |
171 |
|
|
5.5 const-Objekte und Methoden |
176 |
|
|
5.6 Faustregeln zur Konstruktion von Schnittstellen |
177 |
|
|
5.7 Destruktoren |
180 |
|
|
5.8 Wie kommt man zu Klassen und Objekten? Ein Beispiel |
182 |
|
|
5.8.1 Einige Analyse-Überlegungen |
183 |
|
|
5.8.2 Design |
186 |
|
|
5.9 Gegenseitige Abhängigkeit von Klassen |
189 |
|
|
6 Intermezzo: Zeiger |
192 |
|
|
6.1 Zeiger und Adressen |
192 |
|
|
6.2 C-Arrays |
196 |
|
|
6.2.1 C-Arrays und sizeof |
198 |
|
|
6.2.2 Indexoperator bei C-Arrays |
199 |
|
|
6.2.3 Initialisierung von C-Arrays |
199 |
|
|
6.2.4 Zeigerarithmetik |
199 |
|
|
6.3 C-Zeichenketten |
201 |
|
|
6.4 Dynamische Datenobjekte |
208 |
|
|
6.4.1 Freigeben dynamischer Objekte |
211 |
|
|
6.5 Zeiger und Funktionen |
214 |
|
|
6.5.1 Parameterübergabe mit Zeigern |
214 |
|
|
6.5.2 Parameter des main-Programms |
217 |
|
|
6.5.3 Gefahren bei der Rückgabe von Zeigern |
219 |
|
|
6.6 Mehrdimensionale C-Arrays |
220 |
|
|
6.6.1 Statische mehrdimensionale C-Arrays |
220 |
|
|
6.6.2 Dynamisch erzeugte mehrdimensionale Arrays |
224 |
|
|
6.7 Binäre Ein-/Ausgabe |
226 |
|
|
6.8 Zeiger auf Funktionen |
230 |
|
|
6.9 Zeiger auf Elementfunktionen und -daten |
234 |
|
|
6.9.1 Zeiger auf Elementfunktionen |
235 |
|
|
6.9.2 Zeiger auf Elementdaten |
236 |
|
|
6.10 this-Zeiger |
236 |
|
|
6.11 Komplexe Deklarationen lesen |
237 |
|
|
7 Objektorientierung |
240 |
|
|
7.1 Eine String-Klasse |
240 |
|
|
7.1.1 friend-Funktionen |
246 |
|
|
7.2 Klassenspezifische Daten und Funktionen |
248 |
|
|
7.2.1 Klassenspezifische Konstante |
252 |
|
|
7.3 Klassentemplates |
253 |
|
|
7.3.1 Ein Stack-Template |
253 |
|
|
7.3.2 Stack mit statisch festgelegter Größe |
256 |
|
|
7.3.3 Ökonomische Instanziierung von Templates |
258 |
|
|
7.3.4 Member-Template |
260 |
|
|
7.3.5 Rekursive Templates |
260 |
|
|
8 Vererbung |
264 |
|
|
8.1 Vererbung und Initialisierung |
271 |
|
|
8.2 Zugriffsschutz |
271 |
|
|
8.3 Typbeziehung zwischen Ober- und Unterklasse |
274 |
|
|
8.4 Code-Wiederverwendung |
275 |
|
|
8.5 Überschreiben von Funktionen in abgeleiteten Klassen |
277 |
|
|
8.6 Polymorphismus |
278 |
|
|
8.6.1 Virtuelle Funktionen |
278 |
|
|
8.6.2 Abstrakte Klassen |
284 |
|
|
8.6.3 Virtuelle Destruktoren |
291 |
|
|
8.7 Vererbung und andere Beziehungen |
293 |
|
|
8.7.1 Vererbung |
293 |
|
|
8.7.2 Der Teil und das Ganze |
296 |
|
|
8.7.3 Assoziation |
296 |
|
|
8.7.4 Benutzt-Beziehung |
298 |
|
|
8.8 Mehrfachvererbung |
298 |
|
|
8.8.1 Namenskonflikte |
302 |
|
|
8.8.2 Virtuelle Basisklassen |
304 |
|
|
8.8.3 Virtuelle Basisklassen und Initialisierung |
305 |
|
|
9 Überladen von Operatoren |
308 |
|
|
9.1 Rationale Zahlen – noch einmal |
310 |
|
|
9.1.1 Arithmetische Operatoren |
310 |
|
|
9.1.2 Ausgabeoperator << |
313 |
|
|
9.2 Eine Klasse für Vektoren |
315 |
|
|
9.2.1 Index-Operator[ ] |
318 |
|
|
9.2.2 Zuweisungsoperator = |
320 |
|
|
9.2.3 Mathematische Vektoren |
323 |
|
|
9.2.4 Multiplikations-Operator |
324 |
|
|
9.3 Zuweisungsoperator und Vererbung1 |
326 |
|
|
9.4 Inkrement-Operator ++ |
330 |
|
|
9.5 Typumwandlungsoperator |
334 |
|
|
9.6 Smart-Pointer: Operatoren -> und * |
336 |
|
|
9.6.1 Smart Pointer und die C++-Standardbibliothek |
342 |
|
|
9.7 Objekte als Funktionen |
343 |
|
|
10 Fehlerbehandlung |
346 |
|
|
10.1 Ausnahmebehandlung |
348 |
|
|
10.1.1 Exception-Spezifikation in Deklarationen |
352 |
|
|
10.1.2 Exception-Hierarchie in C++ |
352 |
|
|
10.1.3 Besondere Fehlerbehandlungsfunktionen |
355 |
|
|
10.1.4 Erkennen logischer Fehler |
356 |
|
|
10.1.5 Durch Exceptions verursachte Speicherlecks vermeiden |
359 |
|
|
10.2 Speicherbeschaffung mit new |
360 |
|
|
11 Ein Werkzeugkasten |
364 |
|
|
11.1 Behälterklassen (Container) |
364 |
|
|
11.1.1 Container-Arten |
367 |
|
|
11.2 Listen |
368 |
|
|
11.3 Warteschlangen |
375 |
|
|
11.4 Iteratoren |
379 |
|
|
11.4.1 Iterator für eine Listen-Klasse |
381 |
|
|
11.5 Sortierte Listen |
386 |
|
|
11.6 Binärer Suchbaum |
391 |
|
|
11.7 Trennung von Schnittstelle und Implementation |
397 |
|
|
11.7.1 Entkopplung durch abstrakte Basisklassen |
397 |
|
|
11.7.2 Handles |
399 |
|
|
11.8 Mehrdimensionale Matrizen |
402 |
|
|
11.8.1 Zweidimensionale Matrix |
403 |
|
|
11.8.2 Dreidimensionale Matrix |
406 |
|
|
11.9 Fehlersuche mit trace-Objekten |
409 |
|
|
11.9.1 Klasse trace |
411 |
|
|
11.9.2 Anwendungsbeispiel |
415 |
|
|
12 Vermischtes |
418 |
|
|
12.1 Namensräume |
418 |
|
|
12.2 C++-Header |
421 |
|
|
12.3 Einbinden von C-Funktionen |
423 |
|
|
12.4 Standard-Typumwandlungen |
423 |
|
|
12.5 Standard-Typumwandlungsoperatoren |
425 |
|
|
12.6 Typinformationen zur Laufzeit |
428 |
|
|
12.6.1 Typidentifizierung mit typeid() |
428 |
|
|
12.6.2 Anwendung: Eine Menge graphischer Objekte |
429 |
|
|
12.6.3 Vor- und Nachteile der Laufzeittyp-Information |
435 |
|
|
12.7 Unions |
436 |
|
|
12.8 Bitfelder |
437 |
|
|
12.9 Netzwerk-Programmierung |
438 |
|
|
12.10 GUI-Programmierung |
439 |
|
|
13 Dateien und Ströme |
442 |
|
|
13.1 Ausgabe |
443 |
|
|
13.1.1 Formatierung der Ausgabe |
445 |
|
|
13.2 Eingabe |
449 |
|
|
13.2.1 Eingabe von Leerdaten mit Return |
452 |
|
|
13.3 Manipulatoren |
454 |
|
|
13.3.1 Eigene Manipulatoren |
458 |
|
|
13.4 Fehlerbehandlung |
459 |
|
|
13.5 Typumwandlung von Dateiobjekten nach bool |
461 |
|
|
13.6 Arbeit mit Dateien |
462 |
|
|
13.6.1 Positionierung in Dateien |
463 |
|
|
13.6.2 Lesen und Schreiben in derselben Datei |
464 |
|
|
13.7 Eingabe benutzerdefinierter Typen |
466 |
|
|
13.8 Umleitung auf Strings |
467 |
|
|
Teil II Die C++-Standardbibliothek |
470 |
|
|
14 Aufbau und Übersicht |
472 |
|
|
14.1 Auslassungen |
474 |
|
|
14.2 Beispiele des Buchs und die C++-Standardbibliothek |
475 |
|
|
15 Hilfsfunktionen und -klassen |
478 |
|
|
15.1 Paare |
478 |
|
|
15.1.1 Relationale Operatoren |
479 |
|
|
15.2 Funktionsobjekte |
479 |
|
|
15.2.1 Arithmetische, vergleichende und logische Operationen |
480 |
|
|
15.2.2 Funktionsobjekte zum Negieren logischer Prädikate |
481 |
|
|
15.2.3 Binden von Argumentwerten |
482 |
|
|
15.2.4 Zeiger auf Funktionen in Objekte umwandeln |
482 |
|
|
16 Container |
484 |
|
|
16.1 Notation für Iteratoren und Bereiche |
485 |
|
|
16.2 Bitset |
486 |
|
|
16.3 Deque |
489 |
|
|
16.4 List |
492 |
|
|
16.5 Map |
495 |
|
|
16.5.1 Multimap |
499 |
|
|
16.6 Queue |
500 |
|
|
16.6.1 Priority-Queue |
501 |
|
|
16.7 Set |
502 |
|
|
16.7.1 Multiset |
506 |
|
|
16.8 Stack |
506 |
|
|
16.9 Vector |
507 |
|
|
16.9.1 vector |
510 |
|
|
17 Iteratoren |
514 |
|
|
17.1 Iterator-Kategorien |
515 |
|
|
17.2 distance() und advance() |
517 |
|
|
17.3 Reverse-Iteratoren |
517 |
|
|
17.4 Insert-Iteratoren |
518 |
|
|
17.5 Stream-Iteratoren |
520 |
|
|
18 Algorithmen |
522 |
|
|
18.1 for_each |
522 |
|
|
18.2 find und find_if |
522 |
|
|
18.3 find_end |
523 |
|
|
18.4 find_first_of |
524 |
|
|
18.5 adjacent_find |
524 |
|
|
18.6 count |
525 |
|
|
18.7 mismatch |
525 |
|
|
18.8 equal |
526 |
|
|
18.9 search |
527 |
|
|
18.10 search_n |
527 |
|
|
18.11 copy und copy_backward |
528 |
|
|
18.12 swap, iter_swap und swap_ranges |
529 |
|
|
18.13 transform |
530 |
|
|
18.14 replace und Varianten |
531 |
|
|
18.15 fill und fill_n |
532 |
|
|
18.16 generate und generate_n |
532 |
|
|
18.17 remove und Varianten |
533 |
|
|
18.18 unique |
534 |
|
|
18.19 reverse |
535 |
|
|
18.20 rotate |
535 |
|
|
18.21 random_shuffle |
536 |
|
|
18.22 partition |
537 |
|
|
18.23 sort |
538 |
|
|
18.23.1 partial_sort |
540 |
|
|
18.24 nth_element |
541 |
|
|
18.25 Binäre Suche |
542 |
|
|
18.25.1 binary_search |
542 |
|
|
18.25.2 lower_bound |
542 |
|
|
18.25.3 upper_bound |
543 |
|
|
18.25.4 equal_range |
543 |
|
|
18.26 Verschmelzen (Mischen) |
545 |
|
|
18.26.1 Verschmelzen an Ort und Stelle |
547 |
|
|
18.27 Mengenoperationen auf sortierten Strukturen |
548 |
|
|
18.27.1 includes |
548 |
|
|
18.27.2 set_union |
549 |
|
|
18.27.3 set_intersection |
550 |
|
|
18.27.4 set_difference |
551 |
|
|
18.27.5 set_symmetric_difference |
552 |
|
|
18.28 Heap-Algorithmen |
553 |
|
|
18.28.1 pop_heap |
555 |
|
|
18.28.2 push_heap |
556 |
|
|
18.28.3 make_heap |
556 |
|
|
18.28.4 sort_heap |
557 |
|
|
18.29 Minimum und Maximum |
557 |
|
|
18.30 Lexikographischer Vergleich |
558 |
|
|
18.31 Permutationen |
559 |
|
|
19 Ein- und Ausgabe |
562 |
|
|
19.1 Ergänzungen |
563 |
|
|
19.1.1 Streams verbinden mit tie() |
563 |
|
|
19.1.2 locale-Objekt ermitteln |
563 |
|
|
19.1.3 sentry |
563 |
|
|
20 Nationale Besonderheiten |
566 |
|
|
20.1 Sprachumgebungen festlegen und ändern |
566 |
|
|
20.1.1 locale-Elementfunktionen |
567 |
|
|
20.1.2 Namespace std-globale Funktionen |
568 |
|
|
20.2 Zeichenklassifizierung und -umwandlung |
568 |
|
|
20.3 Kategorien |
569 |
|
|
20.3.1 collate |
569 |
|
|
20.3.2 ctype |
570 |
|
|
20.3.3 numeric |
572 |
|
|
20.3.4 monetary |
574 |
|
|
20.3.5 time |
577 |
|
|
20.3.6 messages |
580 |
|
|
20.4 Konstruktion eigener Facetten |
580 |
|
|
21 Numerisches |
582 |
|
|
21.1 Komplexe Zahlen |
582 |
|
|
21.2 Grenzwerte von Zahltypen |
583 |
|
|
21.3 Halbnumerische Algorithmen |
585 |
|
|
21.3.1 accumulate |
585 |
|
|
21.3.2 inner_product |
586 |
|
|
21.3.3 partial_sum |
587 |
|
|
21.3.4 adjacent_difference |
588 |
|
|
21.4 Optimierte numerische Arrays (valarray) |
589 |
|
|
21.4.1 Konstruktoren |
590 |
|
|
21.4.2 Elementfunktionen |
590 |
|
|
21.4.3 Binäre Valarray-Operatoren |
593 |
|
|
21.4.4 Mathematische Funktionen |
595 |
|
|
21.4.5 slice |
597 |
|
|
21.4.6 slice_array |
598 |
|
|
21.4.7 gslice |
599 |
|
|
21.4.8 gslice_array |
602 |
|
|
21.4.9 mask_array |
602 |
|
|
21.4.10 indirect_array |
603 |
|
|
22 String |
606 |
|
|
23 Typerkennung zur Laufzeit |
616 |
|
|
24 Speichermanagement |
618 |
|
|
24.1 |
618 |
|
|
24.2 |
619 |
|
|
25 C-Header |
622 |
|
|
25.1 |
622 |
|
|
25.2 |
622 |
|
|
25.3 |
623 |
|
|
25.4 |
623 |
|
|
25.5 |
623 |
|
|
25.6 |
624 |
|
|
25.7 |
624 |
|
|
25.8 |
624 |
|
|
25.9 |
624 |
|
|
25.10 |
624 |
|
|
25.11 |
624 |
|
|
25.12 |
625 |
|
|
25.13 |
626 |
|
|
25.14 |
626 |
|
|
25.15 |
627 |
|
|
25.15.1 Abweichung vom C-Standard |
628 |
|
|
25.15.2 Funktionen für C-Strings |
628 |
|
|
25.15.3 Funktionen für C-Strings maximaler Länge |
629 |
|
|
25.15.4 Funktionen für Bytefelder |
630 |
|
|
25.16 |
630 |
|
|
25.16.1 Datentypen |
630 |
|
|
25.16.2 Funktionen |
631 |
|
|
26 Nachwort |
634 |
|
|
A Anhang |
636 |
|
|
A.1 Programmierhinweise |
636 |
|
|
A.2 Lösungen zu einigen Übungsaufgaben |
639 |
|
|
A.3 Compilerbefehle |
668 |
|
|
A.4 Make-Dateien |
669 |
|
|
A.5 Die wichtigsten C++-Schlüsselwörter |
671 |
|
|
A.6 ASCII-Tabelle |
671 |
|
|
A.7 Rangfolge der Operatoren |
674 |
|
|
Literaturverzeichnis |
676 |
|
|
OOP-Glossar |
678 |
|
|
Stichwortverzeichnis |
686 |
|
|
Abbildungsverzeichnis |
712 |
|
|
Tabellenverzeichnis |
714 |
|