Breymann | Der C++-Programmierer | E-Book | sack.de
E-Book

E-Book, Deutsch, 1010 Seiten

Breymann Der C++-Programmierer

C++ lernen – professionell anwenden – Lösungen nutzen.Aktuell zu C++17
5. überarbeitete Auflage 2017
ISBN: 978-3-446-45386-9
Verlag: Hanser, Carl
Format: PDF
Kopierschutz: Adobe DRM (»Systemvoraussetzungen)

C++ lernen – professionell anwenden – Lösungen nutzen.Aktuell zu C++17

E-Book, Deutsch, 1010 Seiten

ISBN: 978-3-446-45386-9
Verlag: Hanser, Carl
Format: PDF
Kopierschutz: Adobe DRM (»Systemvoraussetzungen)



Ein C++-Praxisbuch für alle Ansprüche – mehr brauchen Einsteiger und Profis nicht - jetzt mit farbigem Code„Der C++-Programmierer“ entspricht dem ISO- Standard C++17. Das Buch stellt Grundlagen und fortgeschrittene Themen der C++-Programmierung vor. Es enthält über 150 praktische Lösungen für typische Aufgabenstellungen und mehr als 90 Übungsaufgaben – inkl. Musterlösungen.C++ an Beispielen lernen- Als C++-Neuling erhalten Sie eine motivierende Einführung in die Sprache C++. Die vielen Beispiele sind leicht nachzuvollziehen. Klassen und Objekte, Templates, STL und Exceptions sind bald keine Fremdwörter mehr für Sie.- Als Profi finden Sie in diesem Buch kurze Einführungen zu Themen wie Thread- und Netzwerkprogrammierung und grafische Benutzungsoberflächen. Durch den Einsatz der Boost- und Qt-Libraries wird größtmögliche Portabilität erreicht.Kenntnisse in der Softwareentwicklung mit C++ vertiefenWeil Softwareentwicklung nicht nur Programmierung ist, finden Sie ergänzend Themen für die professionelle Arbeit: Die effiziente Programmerzeugung mit make, Unit-Tests und TDD (Test Driven Development).Das unverzichtbare Nachschlagewerk für alleDas integrierte "C++-Rezeptbuch" mit mehr als 150 praktischen Lösungen, das sehr umfangreiche Register und ein detailliertes Inhaltsverzeichnis machen das Buch zu einem unverzichtbaren Nachschlagewerk für alle, die sich im Studium oder professionell mit der Softwareentwicklung in C++ beschäftigen.
Breymann Der C++-Programmierer jetzt bestellen!

Autoren/Hrsg.


Weitere Infos & Material


1; Inhaltsverzeichnis;6
2;Vorwort;24
3;Teil I: Einführung in C++;28
3.1;1 Es geht los!;30
3.1.1;1.1 Historisches;30
3.1.2;1.2 Objektorientierte Programmierung;31
3.1.3;1.3 Werkzeuge zum Programmieren;33
3.1.4;1.4 Das erste Programm;34
3.1.4.1;1.4.1 Namenskonventionen;40
3.1.5;1.5 Integrierte Entwicklungsumgebung;40
3.1.6;1.6 Einfache Datentypen und Operatoren;43
3.1.6.1;1.6.1 Ausdruck;43
3.1.6.2;1.6.2 Ganze Zahlen;43
3.1.6.3;1.6.3 Reelle Zahlen;50
3.1.6.4;1.6.4 Konstanten;54
3.1.6.5;1.6.5 Zeichen;55
3.1.6.6;1.6.6 Logischer Datentyp bool;59
3.1.6.7;1.6.7 Referenzen;60
3.1.6.8;1.6.8 Regeln zum Bilden von Ausdrücken;61
3.1.6.9;1.6.9 Standard-Typumwandlungen;62
3.1.7;1.7 Gültigkeitsbereich und Sichtbarkeit;63
3.1.7.1;1.7.1 Namespace std;65
3.1.8;1.8 Kontrollstrukturen;66
3.1.8.1;1.8.1 Anweisungen;66
3.1.8.2;1.8.2 Sequenz (Reihung);68
3.1.8.3;1.8.3 Auswahl (Selektion, Verzweigung);68
3.1.8.4;1.8.4 Fallunterscheidungen mit switch;73
3.1.8.5;1.8.5 Wiederholungen;76
3.1.8.6;1.8.6 Kontrolle mit break und continue;83
3.1.9;1.9 Benutzerdefinierte und zusammengesetzte Datentypen;85
3.1.9.1;1.9.1 Aufzählungstypen;85
3.1.9.2;1.9.2 Strukturen;88
3.1.9.3;1.9.3 Der C++-Standardtyp vector;89
3.1.9.4;1.9.4 Zeichenketten: Der C++-Standardtyp string;94
3.1.9.5;1.9.5 Container und Schleifen;96
3.1.9.6;1.9.6 Typermittlung mit auto;98
3.1.9.7;1.9.7 Deklaration einer strukturierten Bindung mit auto;99
3.1.9.8;1.9.8 Unions und Bitfelder;100
3.1.10;1.10 Einfache Ein- und Ausgabe;102
3.1.10.1;1.10.1 Standardein- und -ausgabe;102
3.1.10.2;1.10.2 Ein- und Ausgabe mit Dateien;105
3.2;2 Programmstrukturierung;110
3.2.1;2.1 Funktionen;110
3.2.1.1;2.1.1 Aufbau und Prototypen;111
3.2.1.2;2.1.2 Gültigkeitsbereiche und Sichtbarkeit in Funktionen;113
3.2.1.3;2.1.3 Lokale static-Variable: Funktion mit Gedächtnis;114
3.2.2;2.2 Schnittstellen zum Datentransfer;115
3.2.2.1;2.2.1 Übergabe per Wert;116
3.2.2.2;2.2.2 Übergabe per Referenz;120
3.2.2.3;2.2.3 Gefahren bei der Rückgabe von Referenzen;121
3.2.2.4;2.2.4 Vorgegebene Parameterwerte und unterschiedliche Parameterzahl;122
3.2.2.5;2.2.5 Überladen von Funktionen;123
3.2.2.6;2.2.6 Funktion main();124
3.2.2.7;2.2.7 Beispiel Taschenrechnersimulation;125
3.2.2.8;2.2.8 Spezifikation von Funktionen;130
3.2.2.9;2.2.9 Alternative Funktions-Syntax;130
3.2.3;2.3 Modulare Programmgestaltung;130
3.2.3.1;2.3.1 Steuerung der Übersetzung nur mit #include;131
3.2.3.2;2.3.2 Einbinden vorübersetzter Programmteile;131
3.2.3.3;2.3.3 Übersetzungseinheit, Deklaration, Definition;133
3.2.3.4;2.3.4 Dateiübergreifende Gültigkeit und Sichtbarkeit;135
3.2.3.5;2.3.5 Präprozessordirektiven und Makros;137
3.2.4;2.4 Namensräume;145
3.2.5;2.5 inline-Funktionen und -Variable;147
3.2.5.1;2.5.1 inline-Variablen;148
3.2.6;2.6 constexpr-Funktionen;148
3.2.7;2.7 Rückgabetyp auto;150
3.2.8;2.8 Funktions-Templates;152
3.2.8.1;2.8.1 Spezialisierung von Templates;154
3.2.8.2;2.8.2 Einbinden von Templates;155
3.2.9;2.9 C++-Header;157
3.2.9.1;2.9.1 Einbinden von C-Funktionen;159
3.3;3 Objektorientierung 1;160
3.3.1;3.1 Abstrakter Datentyp;161
3.3.2;3.2 Klassen und Objekte;162
3.3.2.1;3.2.1 const-Objekte und Methoden;165
3.3.2.2;3.2.2 inline-Elementfunktionen;166
3.3.3;3.3 Initialisierung und Konstruktoren;167
3.3.3.1;3.3.1 Standardkonstruktor;167
3.3.3.2;3.3.2 Direkte Initialisierung der Attribute;169
3.3.3.3;3.3.3 Allgemeine Konstruktoren;169
3.3.3.4;3.3.4 Kopierkonstruktor;172
3.3.3.5;3.3.5 Typumwandlungskonstruktor;175
3.3.3.6;3.3.6 Konstruktor und mehr vorgeben oder verbieten;177
3.3.3.7;3.3.7 Einheitliche Initialisierung und Sequenzkonstruktor;177
3.3.3.8;3.3.8 Delegierender Konstruktor;180
3.3.3.9;3.3.9 constexpr-Konstruktor und -Methoden;181
3.3.4;3.4 Beispiel: Rationale Zahlen;184
3.3.4.1;3.4.1 Aufgabenstellung;184
3.3.4.2;3.4.2 Entwurf;185
3.3.4.3;3.4.3 Implementation;188
3.3.5;3.5 Destruktoren;193
3.3.6;3.6 Wie kommt man zu Klassen und Objekten? Ein Beispiel;195
3.3.7;3.7 Gegenseitige Abhängigkeit von Klassen;200
3.4;4 Intermezzo: Zeiger;202
3.4.1;4.1 Zeiger und Adressen;203
3.4.2;4.2 C-Arrays;206
3.4.2.1;4.2.1 C-Array, std::size() und sizeof;208
3.4.2.2;4.2.2 Initialisierung von C-Arrays;209
3.4.2.3;4.2.3 Zeigerarithmetik;209
3.4.2.4;4.2.4 Indexoperator bei C-Arrays;210
3.4.2.5;4.2.5 C-Array mit begin() und end() durchlaufen;210
3.4.3;4.3 C-Zeichenketten;211
3.4.3.1;4.3.1 Schleifen und C-Strings;214
3.4.4;4.4 Dynamische Datenobjekte;218
3.4.4.1;4.4.1 Freigeben dynamischer Objekte;221
3.4.5;4.5 Zeiger und Funktionen;223
3.4.5.1;4.5.1 Parameterübergabe mit Zeigern;223
3.4.5.2;4.5.2 Array als Funktionsparameter;225
3.4.5.3;4.5.3 const und Zeiger-Parameter;226
3.4.5.4;4.5.4 Parameter des main-Programms;226
3.4.5.5;4.5.5 Gefahren bei der Rückgabe von Zeigern;227
3.4.6;4.6 this-Zeiger;228
3.4.7;4.7 Mehrdimensionale C-Arrays;230
3.4.7.1;4.7.1 Statische mehrdimensionale C-Arrays;230
3.4.7.2;4.7.2 Mehrdimensionales Array als Funktionsparameter;231
3.4.7.3;4.7.3 Dynamisch erzeugte mehrdimensionale Arrays;234
3.4.7.4;4.7.4 Klasse für dynamisches zweidimensionales Array;236
3.4.8;4.8 Binäre Ein-/Ausgabe;242
3.4.9;4.9 Zeiger auf Funktionen;245
3.4.10;4.10 Typumwandlungen für Zeiger;249
3.4.11;4.11 Zeiger auf Elementfunktionen und -daten;250
3.4.11.1;4.11.1 Zeiger auf Elementfunktionen;250
3.4.11.2;4.11.2 Zeiger auf Elementdaten;251
3.4.12;4.12 Komplexe Deklarationen lesen;251
3.4.12.1;4.12.1 Lesbarkeit mit typedef und using verbessern;252
3.4.13;4.13 Alternative zu rohen Zeigern, new und delete;254
3.5;5 Objektorientierung 2;256
3.5.1;5.1 Eine String-Klasse;256
3.5.1.1;5.1.1 friend-Funktionen;262
3.5.2;5.2 String-Ansicht;263
3.5.3;5.3 Klassenspezifische Daten und Funktionen;266
3.5.3.1;5.3.1 Klassenspezifische Konstante;270
3.5.4;5.4 Klassen-Templates;272
3.5.4.1;5.4.1 Ein Stack-Template;272
3.5.4.2;5.4.2 Stack mit statisch festgelegter Größe;274
3.5.5;5.5 Typbestimmung mit decltype und declval;276
3.6;6 Vererbung;280
3.6.1;6.1 Vererbung und Initialisierung;286
3.6.2;6.2 Zugriffsschutz;287
3.6.3;6.3 Typbeziehung zwischen Ober- und Unterklasse;289
3.6.4;6.4 Code-Wiederverwendung;290
3.6.4.1;6.4.1 Konstruktor erben;291
3.6.5;6.5 Überschreiben von Funktionen in abgeleiteten Klassen;293
3.6.5.1;6.5.1 Virtuelle Funktionen;295
3.6.5.2;6.5.2 Abstrakte Klassen;300
3.6.5.3;6.5.3 Virtueller Destruktor;305
3.6.5.4;6.5.4 Private virtuelle Funktionen;308
3.6.6;6.6 Probleme der Modellierung mit Vererbung;310
3.6.7;6.7 Mehrfachvererbung;313
3.6.7.1;6.7.1 Namenskonflikte;315
3.6.7.2;6.7.2 Virtuelle Basisklassen;316
3.6.8;6.8 Standard-Typumwandlungsoperatoren;320
3.6.9;6.9 Typinformationen zur Laufzeit;323
3.6.10;6.10 Using-Deklaration für protected-Funktionen;324
3.6.11;6.11 Private- und Protected-Vererbung;325
3.7;7 Fehlerbehandlung;330
3.7.1;7.1 Ausnahmebehandlung;332
3.7.1.1;7.1.1 Exception-Spezifikation in Deklarationen;335
3.7.1.2;7.1.2 Exception-Hierarchie in C++;336
3.7.1.3;7.1.3 Besondere Fehlerbehandlungsfunktionen;338
3.7.1.4;7.1.4 Erkennen logischer Fehler;339
3.7.1.5;7.1.5 Arithmetische Fehler / Division durch 0;341
3.7.2;7.2 Speicherbeschaffung mit new;342
3.7.3;7.3 Exception-Sicherheit;343
3.8;8 Überladen von Operatoren;346
3.8.1;8.1 Rationale Zahlen — noch einmal;348
3.8.1.1;8.1.1 Arithmetische Operatoren;348
3.8.1.2;8.1.2 Ausgabeoperator <<;350
3.8.2;8.2 Eine Klasse für Vektoren;352
3.8.2.1;8.2.1 Index-Operator [ ];355
3.8.2.2;8.2.2 Zuweisungsoperator =;357
3.8.2.3;8.2.3 Mathematische Vektoren;360
3.8.2.4;8.2.4 Multiplikationsoperator;361
3.8.3;8.3 Inkrement-Operator ++;362
3.8.4;8.4 Typumwandlungsoperator;366
3.8.5;8.5 Smart Pointer: Operatoren -> und *;368
3.8.5.1;8.5.1 Smart Pointer und die C++-Standardbibliothek;373
3.8.6;8.6 Objekt als Funktion;374
3.8.7;8.7 new und delete überladen;376
3.8.7.1;8.7.1 Unterscheidung zwischen Heap- und Stack-Objekten;379
3.8.7.2;8.7.2 Fehlende delete-Anweisung entdecken;381
3.8.7.3;8.7.3 Eigene Speicherverwaltung für einen bestimmten Typ;382
3.8.7.4;8.7.4 Empfehlungen im Umgang mit new und delete;386
3.8.8;8.8 Operatoren für Literale;387
3.8.8.1;8.8.1 Stringliterale;388
3.8.8.2;8.8.2 Benutzerdefinierte Literale;389
3.8.9;8.9 Mehrdimensionale Matrizen;391
3.8.9.1;8.9.1 Zweidimensionale Matrix als Vektor von Vektoren;392
3.8.9.2;8.9.2 Dreidimensionale Matrix;395
3.8.10;8.10 Zuweisung und Vergleich bei Vererbung;397
3.9;9 Dateien und Ströme;406
3.9.1;9.1 Ausgabe;408
3.9.1.1;9.1.1 Formatierung der Ausgabe;408
3.9.2;9.2 Eingabe;411
3.9.3;9.3 Manipulatoren;414
3.9.3.1;9.3.1 Eigene Manipulatoren;419
3.9.4;9.4 Fehlerbehandlung;421
3.9.5;9.5 Typumwandlung von Dateiobjekten nach bool;422
3.9.6;9.6 Arbeit mit Dateien;423
3.9.6.1;9.6.1 Positionierung in Dateien;424
3.9.6.2;9.6.2 Lesen und Schreiben in derselben Datei;425
3.9.7;9.7 Umleitung auf Strings;426
3.9.8;9.8 Tabelle formatiert ausgeben;428
3.9.9;9.9 Formatierte Daten lesen;429
3.9.9.1;9.9.1 Eingabe benutzerdefinierter Typen;429
3.9.10;9.10 Blockweise lesen und schreiben;430
3.9.10.1;9.10.1 vector-Objekt binär lesen und schreiben;431
3.9.10.2;9.10.2 array-Objekt binär lesen und schreiben;432
3.9.10.3;9.10.3 Matrix binär lesen und schreiben;433
3.9.11;9.11 Ergänzungen;435
3.10;10 Die Standard Template Library (STL);436
3.10.1;10.1 Container, Iteratoren, Algorithmen;437
3.10.2;10.2 Iteratoren im Detail;442
3.10.3;10.3 Beispiel verkettete Liste;443
4;Teil II: Fortgeschrittene Themen;448
4.1;11 Performance, Wert- und Referenzsemantik;450
4.1.1;11.1 Performanceproblem Wertsemantik;451
4.1.1.1;11.1.1 Auslassen der Kopie;452
4.1.1.2;11.1.2 Temporäre Objekte bei der Zuweisung;453
4.1.2;11.2 Referenzsemantik für R-Werte;454
4.1.3;11.3 Optimierung durch Referenzsemantik für R-Werte;456
4.1.3.1;11.3.1 Bewegender Konstruktor;459
4.1.3.2;11.3.2 Bewegender Zuweisungsoperator;459
4.1.4;11.4 Die move()-Funktion;460
4.1.4.1;11.4.1 Regel zur Template-Auswertung von &&-Parametern;462
4.1.5;11.5 Ein effizienter binärer Plusoperator;463
4.1.5.1;11.5.1 Return Value Optimization (RVO);464
4.1.5.2;11.5.2 Kopien temporärer Objekte eliminieren;464
4.1.5.3;11.5.3 Verbesserung durch verzögerte Auswertung;465
4.1.5.4;11.5.4 Weitere Optimierungsmöglichkeiten;467
4.1.6;11.6 Rule of three/five/zero;468
4.1.6.1;11.6.1 Rule of three;468
4.1.6.2;11.6.2 Rule of five;468
4.1.6.3;11.6.3 Rule of zero;469
4.2;12 Lambda-Funktionen;470
4.2.1;12.1 Eigenschaften;471
4.2.1.1;12.1.1 Äquivalenz zum Funktionszeiger;472
4.2.1.2;12.1.2 Lambda-Funktion und Klasse;473
4.2.2;12.2 Generische Lambda-Funktionen;473
4.2.3;12.3 Parametererfassung mit [];476
4.3;13 Template-Metaprogrammierung;478
4.3.1;13.1 Grundlagen;478
4.3.2;13.2 Variadic Templates: Templates mit variabler Parameterzahl;481
4.3.2.1;13.2.1 Ablauf der Auswertung durch den Compiler;482
4.3.2.2;13.2.2 Anzahl der Parameter;483
4.3.2.3;13.2.3 Parameterexpansion;483
4.3.3;13.3 Fold-Expressions;485
4.3.3.1;13.3.1 Weitere Varianten;486
4.3.3.2;13.3.2 Fold-Expression mit Kommaoperator;487
4.3.4;13.4 Klassen-Template mit variabler Stelligkeit;489
4.4;14 Reguläre Ausdrücke;490
4.4.1;14.1 Elemente regulärer Ausdrücke;491
4.4.1.1;14.1.1 Greedy oder lazy?;493
4.4.2;14.2 Interaktive Auswertung;494
4.4.3;14.3 Auszug des regex-API;497
4.4.4;14.4 Verarbeitung von \n;499
4.4.5;14.5 Anwendungen;500
4.5;15 Threads;502
4.5.1;15.1 Zeit und Dauer;503
4.5.2;15.2 Threads;504
4.5.3;15.3 Die Klasse thread;508
4.5.3.1;15.3.1 Thread-Group;510
4.5.4;15.4 Synchronisation kritischer Abschnitte;511
4.5.5;15.5 Thread-Steuerung: Pausieren, Fortsetzen, Beenden;514
4.5.5.1;15.5.1 Data Race;519
4.5.6;15.6 Warten auf Ereignisse;519
4.5.7;15.7 Reader/Writer-Problem;525
4.5.7.1;15.7.1 Wenn Threads verhungern;529
4.5.7.2;15.7.2 Reader/Writer-Varianten;530
4.5.8;15.8 Atomare Veränderung von Variablen;530
4.5.9;15.9 Asynchrone verteilte Bearbeitung einer Aufgabe;533
4.5.10;15.10 Thread-Sicherheit;535
4.6;16 Grafische Benutzungsschnittstellen;536
4.6.1;16.1 Ereignisgesteuerte Programmierung;537
4.6.2;16.2 GUI-Programmierung mit Qt;538
4.6.2.1;16.2.1 Installation und Einsatz;538
4.6.2.2;16.2.2 Meta-Objektsystem;539
4.6.2.3;16.2.3 Der Programmablauf;540
4.6.2.4;16.2.4 Ereignis abfragen;541
4.6.3;16.3 Signale, Slots und Widgets;542
4.6.4;16.4 Dialog;551
4.6.5;16.5 Qt oder Standard-C++?;554
4.6.5.1;16.5.1 Threads;555
4.6.5.2;16.5.2 Verzeichnisbaum durchwandern;556
4.7;17 Internet-Anbindung;558
4.7.1;17.1 Protokolle;559
4.7.2;17.2 Adressen;559
4.7.3;17.3 Socket;563
4.7.3.1;17.3.1 Bidirektionale Kommunikation;566
4.7.3.2;17.3.2 UDP-Sockets;568
4.7.3.3;17.3.3 Atomuhr mit UDP abfragen;569
4.7.4;17.4 HTTP;572
4.7.4.1;17.4.1 Verbindung mit GET;573
4.7.4.2;17.4.2 Verbindung mit POST;578
4.7.5;17.5 Mini-Webserver;579
4.8;18 Datenbankanbindung;588
4.8.1;18.1 C++-Interface;589
4.8.2;18.2 Anwendungsbeispiel;593
5;Teil III: Ausgewählte Methoden und Werkzeuge der Softwareentwicklung;600
5.1;19 Effiziente Programmerzeugung mit make;602
5.1.1;19.1 Wirkungsweise;604
5.1.2;19.2 Variablen und Muster;606
5.1.3;19.3 Universelles Makefile für einfache Projekte;607
5.1.4;19.4 Automatische Ermittlung von Abhängigkeiten;608
5.1.4.1;19.4.1 Getrennte Verzeichnisse: src, obj, bin;610
5.1.5;19.5 Makefile für Verzeichnisbäume;612
5.1.5.1;19.5.1 Rekursive Make-Aufrufe;613
5.1.5.2;19.5.2 Ein Makefile für alles;615
5.1.6;19.6 Automatische Erzeugung von Makefiles;616
5.1.6.1;19.6.1 Makefile für rekursive Aufrufe erzeugen;617
5.1.7;19.7 Erzeugen von Bibliotheken;618
5.1.7.1;19.7.1 Statische Bibliotheksmodule;618
5.1.7.2;19.7.2 Dynamische Bibliotheksmodule;620
5.1.8;19.8 Code Bloat bei der Instanziierung von Templates vermeiden;623
5.1.8.1;19.8.1 extern-Template;624
5.1.9;19.9 CMake;625
5.1.10;19.10 GNU Autotools;627
5.2;20 Unit-Test;628
5.2.1;20.1 Werkzeuge;629
5.2.2;20.2 Test Driven Development;630
5.2.3;20.3 Boost Unit Test Framework;631
5.2.3.1;20.3.1 Beispiel: Testgetriebene Entwicklung einer Operatorfunktion;633
5.2.3.2;20.3.2 Fixture;637
5.2.3.3;20.3.3 Testprotokoll und Log-Level;638
5.2.3.4;20.3.4 Prüf-Makros;639
5.2.3.5;20.3.5 Kommandozeilen-Optionen;643
6;Teil IV: Das C++-Rezeptbuch: Tipps und Lösungen für typische Aufgaben;644
6.1;21 Sichere Programmentwicklung;646
6.1.1;21.1 Regeln zum Design von Methoden;646
6.1.2;21.2 Defensive Programmierung;648
6.1.2.1;21.2.1 double- und float-Werte richtig vergleichen;649
6.1.2.2;21.2.2 const und constexpr verwenden;650
6.1.2.3;21.2.3 Anweisungen nach for/if/while einklammern;650
6.1.2.4;21.2.4 int und unsigned/size_t nicht mischen;650
6.1.2.5;21.2.5 size_t oder auto statt unsigned int verwenden;651
6.1.2.6;21.2.6 Postfix++ mit Präfix++ implementieren;651
6.1.2.7;21.2.7 Ein Destruktor darf keine Exception werfen;652
6.1.2.8;21.2.8 explicit-Typumwandlungsoperator bevorzugen;652
6.1.2.9;21.2.9 explicit-Konstruktor für eine Typumwandlung bevorzugen;652
6.1.2.10;21.2.10 Leere Standardkonstruktoren vermeiden;652
6.1.2.11;21.2.11 Mit override Schreibfehler reduzieren;652
6.1.2.12;21.2.12 Kopieren und Zuweisung verbieten;652
6.1.2.13;21.2.13 Vererbung verbieten;653
6.1.2.14;21.2.14 Überschreiben einer virtuellen Methode verhindern;654
6.1.2.15;21.2.15 >>Rule of zero<< beachten;654
6.1.2.16;21.2.16 One Definition Rule;654
6.1.2.17;21.2.17 Defensiv Objekte löschen;654
6.1.2.18;21.2.18 Speicherbeschaffung und -freigabe kapseln;655
6.1.2.19;21.2.19 Programmierrichtlinien einhalten;655
6.1.3;21.3 Exception-sichere Beschaffung von Ressourcen;655
6.1.3.1;21.3.1 Sichere Verwendung von unique_ptr und shared_ptr;655
6.1.3.2;21.3.2 So vermeiden Sie new und delete!;656
6.1.3.3;21.3.3 shared_ptr für Arrays korrekt verwenden;657
6.1.3.4;21.3.4 unique_ptr für Arrays korrekt verwenden;658
6.1.3.5;21.3.5 Exception-sichere Funktion;659
6.1.3.6;21.3.6 Exception-sicherer Konstruktor;659
6.1.3.7;21.3.7 Exception-sichere Zuweisung;660
6.1.4;21.4 Empfehlungen zur Thread-Programmierung;661
6.1.4.1;21.4.1 Warten auf die Freigabe von Ressourcen;661
6.1.4.2;21.4.2 Deadlock-Vermeidung;662
6.1.4.3;21.4.3 notify_all oder notify_one?;662
6.1.4.4;21.4.4 Performance mit Threads verbessern?;663
6.2;22 Von der UML nach C++;664
6.2.1;22.1 Vererbung;664
6.2.2;22.2 Interface anbieten und nutzen;665
6.2.3;22.3 Assoziation;667
6.2.3.1;22.3.1 Aggregation;670
6.2.3.2;22.3.2 Komposition;670
6.3;23 Algorithmen für verschiedene Aufgaben;672
6.3.1;23.1 Algorithmen mit Strings;673
6.3.1.1;23.1.1 String splitten;673
6.3.1.2;23.1.2 String in Zahl umwandeln;674
6.3.1.3;23.1.3 Zahl in String umwandeln;676
6.3.1.4;23.1.4 Strings sprachlich richtig sortieren;677
6.3.1.5;23.1.5 Umwandlung in Klein- bzw. Großschreibung;679
6.3.1.6;23.1.6 Strings sprachlich richtig vergleichen;681
6.3.1.7;23.1.7 Von der Groß-/Kleinschreibung unabhängiger Zeichenvergleich;682
6.3.1.8;23.1.8 Von der Groß-/Kleinschreibung unabhängige Suche;683
6.3.2;23.2 Textverarbeitung;684
6.3.2.1;23.2.1 Datei durchsuchen;684
6.3.2.2;23.2.2 Ersetzungen in einer Datei;686
6.3.2.3;23.2.3 Lines of Code (LOC) ermitteln;688
6.3.2.4;23.2.4 Zeilen, Wörter und Zeichen einer Datei zählen;689
6.3.2.5;23.2.5 CSV-Datei lesen;689
6.3.2.6;23.2.6 Kreuzreferenzliste;690
6.3.3;23.3 Operationen auf Folgen;693
6.3.3.1;23.3.1 Container anzeigen;694
6.3.3.2;23.3.2 Folge mit gleichen Werten initialisieren;694
6.3.3.3;23.3.3 Folge mit Werten eines Generators initialisieren;695
6.3.3.4;23.3.4 Folge mit fortlaufenden Werten initialisieren;695
6.3.3.5;23.3.5 Summe und Produkt;696
6.3.3.6;23.3.6 Mittelwert und Standardabweichung;697
6.3.3.7;23.3.7 Skalarprodukt;697
6.3.3.8;23.3.8 Folge der Teilsummen oder -produkte;698
6.3.3.9;23.3.9 Folge der Differenzen;699
6.3.3.10;23.3.10 Kleinstes und größtes Element finden;700
6.3.3.11;23.3.11 Elemente rotieren;702
6.3.3.12;23.3.12 Elemente verwürfeln;703
6.3.3.13;23.3.13 Dubletten entfernen;703
6.3.3.14;23.3.14 Reihenfolge umdrehen;705
6.3.3.15;23.3.15 Stichprobe;706
6.3.3.16;23.3.16 Anzahl der Elemente, die einer Bedingung genügen;707
6.3.3.17;23.3.17 Gilt ein Prädikat für alle, keins oder wenigstens ein Element einer Folge?;708
6.3.3.18;23.3.18 Permutationen;709
6.3.3.19;23.3.19 Lexikografischer Vergleich;712
6.3.4;23.4 Sortieren und Verwandtes;713
6.3.4.1;23.4.1 Partitionieren;713
6.3.4.2;23.4.2 Sortieren;715
6.3.4.3;23.4.3 Stabiles Sortieren;716
6.3.4.4;23.4.4 Partielles Sortieren;717
6.3.4.5;23.4.5 Das n.-größte oder n.-kleinste Element finden;718
6.3.4.6;23.4.6 Verschmelzen (merge);719
6.3.5;23.5 Suchen und Finden;722
6.3.5.1;23.5.1 Element finden;722
6.3.5.2;23.5.2 Element einer Menge in der Folge finden;723
6.3.5.3;23.5.3 Teilfolge finden;724
6.3.5.4;23.5.4 Teilfolge mit speziellem Algorithmus finden;725
6.3.5.5;23.5.5 Bestimmte benachbarte Elemente finden;727
6.3.5.6;23.5.6 Bestimmte aufeinanderfolgende Werte finden;728
6.3.5.7;23.5.7 Binäre Suche;729
6.3.6;23.6 Mengenoperationen auf sortierten Strukturen;731
6.3.6.1;23.6.1 Teilmengenrelation;732
6.3.6.2;23.6.2 Vereinigung;733
6.3.6.3;23.6.3 Schnittmenge;734
6.3.6.4;23.6.4 Differenz;734
6.3.6.5;23.6.5 Symmetrische Differenz;735
6.3.7;23.7 Heap-Algorithmen;736
6.3.7.1;23.7.1 pop_heap;737
6.3.7.2;23.7.2 push_heap;738
6.3.7.3;23.7.3 make_heap;738
6.3.7.4;23.7.4 sort_heap;739
6.3.7.5;23.7.5 is_heap;739
6.3.8;23.8 Vergleich von Containern auch ungleichen Typs;740
6.3.8.1;23.8.1 Unterschiedliche Elemente finden;740
6.3.8.2;23.8.2 Prüfung auf gleiche Inhalte;742
6.3.9;23.9 Rechnen mit komplexen Zahlen: Der C++-Standardtyp complex;743
6.3.10;23.10 Schnelle zweidimensionale Matrix;745
6.3.10.1;23.10.1 Optimierung mathematischer Array-Operationen;748
6.3.11;23.11 Vermischtes;751
6.3.11.1;23.11.1 Erkennung eines Datums;751
6.3.11.2;23.11.2 Erkennung einer IPv4-Adresse;753
6.3.11.3;23.11.3 Erzeugen von Zufallszahlen;754
6.3.11.4;23.11.4 for_each — Auf jedem Element eine Funktion ausführen;759
6.3.11.5;23.11.5 Verschiedene Möglichkeiten, Container-Bereiche zu kopieren;759
6.3.11.6;23.11.6 Vertauschen von Elementen, Bereichen und Containern;762
6.3.11.7;23.11.7 Elemente transformieren;762
6.3.11.8;23.11.8 Ersetzen und Varianten;764
6.3.11.9;23.11.9 Elemente herausfiltern;765
6.3.11.10;23.11.10 Grenzwerte von Zahltypen;767
6.3.11.11;23.11.11 Minimum und Maximum;767
6.3.11.12;23.11.12 Wert begrenzen;769
6.3.11.13;23.11.13 ggT und kgV;770
6.3.12;23.12 Parallelisierbare Algorithmen;771
6.4;24 Datei- und Verzeichnisoperationen;772
6.4.1;24.1 Übersicht;773
6.4.2;24.2 Pfadoperationen;774
6.4.3;24.3 Datei oder Verzeichnis löschen;775
6.4.3.1;24.3.1 Möglicherweise gefülltes Verzeichnis löschen;776
6.4.4;24.4 Datei oder Verzeichnis kopieren;777
6.4.5;24.5 Datei oder Verzeichnis umbenennen;778
6.4.6;24.6 Verzeichnis anlegen;778
6.4.7;24.7 Verzeichnis anzeigen;779
6.4.8;24.8 Verzeichnisbaum anzeigen;780
7;Teil V: Die C++-Standardbibliothek;782
7.1;25 Aufbau und Übersicht;784
7.1.1;25.1 Auslassungen;786
7.1.2;25.2 Beispiele des Buchs und die C++-Standardbibliothek;787
7.2;26 Hilfsfunktionen und -klassen;790
7.2.1;26.1 Relationale Operatoren;790
7.2.2;26.2 Unterstützung der Referenzsemantik für R-Werte;791
7.2.2.1;26.2.1 move();791
7.2.2.2;26.2.2 forward();792
7.2.3;26.3 Paare;793
7.2.4;26.4 Tupel;795
7.2.5;26.5 bitset;797
7.2.6;26.6 Indexfolgen;800
7.2.7;26.7 variant statt union;801
7.2.8;26.8 Funktionsobjekte;802
7.2.8.1;26.8.1 Arithmetische, vergleichende und logische Operationen;802
7.2.8.2;26.8.2 Binden von Argumentwerten;803
7.2.8.3;26.8.3 Funktionen in Objekte umwandeln;805
7.2.9;26.9 Templates für rationale Zahlen;807
7.2.10;26.10 Hüllklasse für Referenzen;808
7.2.11;26.11 Optionale Objekte;809
7.2.12;26.12 Type Traits;811
7.2.12.1;26.12.1 Wie funktionieren Type Traits? — ein Beispiel;812
7.2.12.2;26.12.2 Abfrage von Eigenschaften;814
7.2.12.3;26.12.3 Abfrage numerischer Eigenschaften;816
7.2.12.4;26.12.4 Typbeziehungen;816
7.2.12.5;26.12.5 Typumwandlungen;817
7.2.13;26.13 Auswahl weiterer Traits;817
7.2.13.1;26.13.1 decay;817
7.2.13.2;26.13.2 enable_if;817
7.2.13.3;26.13.3 conditional;818
7.2.13.4;26.13.4 default_order;818
7.3;27 Container;820
7.3.1;27.1 Gemeinsame Eigenschaften;822
7.3.1.1;27.1.1 Initialisierungslisten;824
7.3.1.2;27.1.2 Konstruktion an Ort und Stelle;824
7.3.1.3;27.1.3 Reversible Container;825
7.3.2;27.2 Sequenzen;826
7.3.2.1;27.2.1 vector;827
7.3.2.2;27.2.2 vector


Prof. Dr. Ulrich Breymann lehrte Informatik an der Hochschule Bremen. Er engagierte sich im DIN-Arbeitskreis zur ersten Standardisierung von C++ und ist ein renommierter Autor zum Thema C++. Aus seiner Tätigkeit in Industrie und Hochschule weiß er genau, worauf es bei der Softwareentwicklung mit C++ ankommt. Er versteht es, auch komplexe Sachverhalte verständlich darzustellen.



Ihre Fragen, Wünsche oder Anmerkungen
Vorname*
Nachname*
Ihre E-Mail-Adresse*
Kundennr.
Ihre Nachricht*
Lediglich mit * gekennzeichnete Felder sind Pflichtfelder.
Wenn Sie die im Kontaktformular eingegebenen Daten durch Klick auf den nachfolgenden Button übersenden, erklären Sie sich damit einverstanden, dass wir Ihr Angaben für die Beantwortung Ihrer Anfrage verwenden. Selbstverständlich werden Ihre Daten vertraulich behandelt und nicht an Dritte weitergegeben. Sie können der Verwendung Ihrer Daten jederzeit widersprechen. Das Datenhandling bei Sack Fachmedien erklären wir Ihnen in unserer Datenschutzerklärung.