Gottschling | Forschung mit modernem C++ | E-Book | www.sack.de
E-Book

E-Book, Deutsch, 508 Seiten

Gottschling Forschung mit modernem C++

C++17-Intensivkurs für Wissenschaftler, Ingenieure und Programmierer
1. Auflage 2019
ISBN: 978-3-446-45981-6
Verlag: Carl Hanser
Format: PDF
Kopierschutz: 1 - PDF Watermark

C++17-Intensivkurs für Wissenschaftler, Ingenieure und Programmierer

E-Book, Deutsch, 508 Seiten

ISBN: 978-3-446-45981-6
Verlag: Carl Hanser
Format: PDF
Kopierschutz: 1 - PDF Watermark



Das Programmieren von C ++ ist der schnellste Weg, um das gesamte Spektrum der auf heutiger Hardware verfügbaren Rechenleistung zu nutzen. Dieses Buch behandelt Techniken für das Programmieren von 'close to the bare metal' sowie abstraktere High-Level-Programmierkonstrukte. Es ist speziell für die C++-Programmierung von wissenschaftlichen und technischen Anwendungen konzipiert und führt den Leser zu den anspruchsvolleren Stilen und erweiterten Funktionen, die hierfür nötig sind.
Es bietet:
- C++-Wissen auf dem neuesten Stand von C++11/14/17
- Entwicklung geeigneter Abstraktionen, um schnell C ++-Programme für eine Vielzahl von Problembereichen schreiben zu können
- Viele Beispiele unter Verwendung technischer Algorithmen, z.B. Matrix Template Library MTL 4.
Das Material des Buches hat sich drei Jahre lang als Vorlesung und noch deutlich länger als Training professioneller Programmierer bewährt. Es deckt inhaltlich ein breites Spektrum ab: von der Tool Chain und dem Build-Prozess bis hin zu Templates, Lambdas und wissenschaftlichen Bibliotheken.
Gottschling Forschung mit modernem C++ jetzt bestellen!

Autoren/Hrsg.


Weitere Infos & Material


1;Vorwort;8
2;Danksagungen;13
3;Über den Autor;15
4;Inhalt;16
5;1 Grundlagen;26
5.1;1.1 Unser erstes Programm;26
5.2;1.2 Variablen;28
5.2.1;1.2.1 Fundamentale Typen;29
5.2.2;1.2.2 Characters und Strings;30
5.2.3;1.2.3 Variablen deklarieren;31
5.2.4;1.2.4 Konstanten;31
5.2.5;1.2.5 Literale;32
5.2.6;1.2.6 Werterhaltende Initialisierung;34
5.2.7;1.2.7 Gültigkeitsbereiche;35
5.3;1.3 Operatoren;37
5.3.1;1.3.1 Arithmetische Operatoren;38
5.3.2;1.3.2 Boolesche Operatoren;40
5.3.3;1.3.3 Bitweise Operatoren;41
5.3.4;1.3.4 Zuweisung;42
5.3.5;1.3.5 Programmablauf;43
5.3.6;1.3.6 Speicherverwaltung;44
5.3.7;1.3.7 Zugriffsoperatoren;44
5.3.8;1.3.8 Typbehandlung;44
5.3.9;1.3.9 Fehlerbehandlung;45
5.3.10;1.3.10 Überladung;45
5.3.11;1.3.11 Operatorprioritäten;45
5.3.12;1.3.12 Vermeiden Sie Seiteneffekte!;46
5.4;1.4 Ausdrücke und Anweisungen;48
5.4.1;1.4.1 Ausdrücke;48
5.4.2;1.4.2 Anweisungen;49
5.4.3;1.4.3 Verzweigung;49
5.4.4;1.4.4 Schleifen;52
5.4.5;1.4.5 goto;55
5.5;1.5 Funktionen;56
5.5.1;1.5.1 Argumente;56
5.5.2;1.5.2 Rückgabe der Ergebnisse;58
5.5.3;1.5.3 Inlining;59
5.5.4;1.5.4 Überladen;59
5.5.5;1.5.5 Die main-Funktion;61
5.6;1.6 Fehlerbehandlung;62
5.6.1;1.6.1 Zusicherungen;62
5.6.2;1.6.2 Ausnahmen;64
5.6.3;1.6.3 Statische Zusicherungen;68
5.7;1.7 I/O;69
5.7.1;1.7.1 Standard-Ausgabe;69
5.7.2;1.7.2 Standard-Eingabe;70
5.7.3;1.7.3 Ein-/Ausgabe mit Dateien;70
5.7.4;1.7.4 Generisches Stream-Konzept;71
5.7.5;1.7.5 Formatierung;72
5.7.6;1.7.6 I/O-Fehler behandeln;73
5.7.7;1.7.7 File-System;76
5.8;1.8 Arrays, Zeiger und Referenzen;77
5.8.1;1.8.1 Arrays;77
5.8.2;1.8.2 Zeiger;79
5.8.3;1.8.3 Intelligente Zeiger;82
5.8.4;1.8.4 Referenzen;85
5.8.5;1.8.5 Vergleich zwischen Zeigern und Referenzen;85
5.8.6;1.8.6 Nicht auf abgelaufene Daten verweisen!;86
5.8.7;1.8.7 Containers for Arrays;87
5.9;1.9 Strukturierung von Software-Projekten;89
5.9.1;1.9.1 Kommentare;89
5.9.2;1.9.2 Präprozessor-Direktiven;91
5.10;1.10 Aufgaben;95
5.10.1;1.10.1 Verengung;95
5.10.2;1.10.2 Literale;95
5.10.3;1.10.3 Operatoren;95
5.10.4;1.10.4 Verzweigung;95
5.10.5;1.10.5 Schleifen;95
5.10.6;1.10.6 I/O;96
5.10.7;1.10.7 Arrays und Zeiger;96
5.10.8;1.10.8 Funktionen;96
6;2 Klassen;97
6.1;2.1 Universell programmieren,nicht detailversessen;97
6.2;2.2 Member;99
6.2.1;2.2.1 Mitgliedervariablen;100
6.2.2;2.2.2 Zugriffsrechte;100
6.2.3;2.2.3 Zugriffsoperatoren;103
6.2.4;2.2.4 Der static-Deklarator für Klassen;103
6.2.5;2.2.5 Member-Funktionen;104
6.3;2.3 Konstruktoren und Zuweisungen;105
6.3.1;2.3.1 Konstruktoren;105
6.3.2;2.3.2 Zuweisungen;115
6.3.3;2.3.3 Initialisierungslisten;116
6.3.4;2.3.4 Einheitliche Initialisierung;118
6.3.5;2.3.5 Move-Semantik;120
6.3.6;2.3.6 Objekte aus Literalen konstruieren;126
6.4;2.4 Destruktoren;128
6.4.1;2.4.1 Implementierungsregeln;129
6.4.2;2.4.2 Richtiger Umgang mit Ressourcen;129
6.5;2.5 Zusammenfassung der Methodengenerierung;135
6.6;2.6 Zugriff auf Mitgliedervariablen;136
6.6.1;2.6.1 Zugriffsfunktionen;136
6.6.2;2.6.2 Index-Operator;137
6.6.3;2.6.3 Konstante Mitgliederfunktionen;138
6.6.4;2.6.4 Referenz-qualifizierte Mitglieder;140
6.7;2.7 Design von Operatorüberladung;141
6.7.1;2.7.1 Seien Sie konsistent!;141
6.7.2;2.7.2 Die Priorität respektieren;142
6.7.3;2.7.3 Methoden oder freie Funktionen;143
6.8;2.8 Aufgaben;146
6.8.1;2.8.1 Polynomial;146
6.8.2;2.8.2 Rational;146
6.8.3;2.8.3 Move-Zuweisung;147
6.8.4;2.8.4 Initialisierungsliste;147
6.8.5;2.8.5 Ressourcenrettung;147
7;3 Generische Programmierung;148
7.1;3.1 Funktions-Templates;148
7.1.1;3.1.1 Parametertyp-Deduktion;149
7.1.2;3.1.2 Mit Fehlern in Templates klarkommen;153
7.1.3;3.1.3 Gemischte Typen;154
7.1.4;3.1.4 Einheitliche Initialisierung;155
7.1.5;3.1.5 Automatischer Rückgabetyp;155
7.2;3.2 Namensräume und Funktionssuche;156
7.2.1;3.2.1 Namensräume;156
7.2.2;3.2.2 Argumentabhängiges Nachschlagen;159
7.2.3;3.2.3 Namensraum-Qualifizierung oder ADL;163
7.3;3.3 Klassen-Templates;165
7.3.1;3.3.1 Ein Container-Beispiel;165
7.3.2;3.3.2 Einheitliche Klassen- und Funktionsschnittstellen entwerfen;167
7.4;3.4 Typ-Deduktion und -Definition;173
7.4.1;3.4.1 Automatische Variablentypen;173
7.4.2;3.4.2 Typ eines Ausdrucks;173
7.4.3;3.4.3 decltype(auto);174
7.4.4;3.4.4 Deduzierte Klassen-Template-Parameter;176
7.4.5;3.4.5 Mehrere Typen deduzieren;177
7.4.6;3.4.6 Typen definieren;178
7.5;3.5 Etwas Theorie zu Templates: Konzepte;180
7.6;3.6 Template-Spezialisierung;181
7.6.1;3.6.1 Spezialisierung einer Klasse für einen Typ;181
7.6.2;3.6.2 Funktionen Spezialisieren und Überladen;183
7.6.3;3.6.3 Partielle Spezialisierung von Klassen;185
7.6.4;3.6.4 Partiell spezialisierte Funktionen;186
7.6.5;3.6.5 Strukturierte Bindung mit Nutzertypen;188
7.7;3.7 Nicht-Typ-Parameter für Templates;191
7.7.1;3.7.1 Container fester Größe;191
7.7.2;3.7.2 Nicht-Typ-Parameter deduzieren;194
7.8;3.8 Funktoren;194
7.8.1;3.8.1 Funktionsartige Parameter;196
7.8.2;3.8.2 Funktoren zusammensetzen;197
7.8.3;3.8.3 Rekursion;199
7.8.4;3.8.4 Generische Reduktion;202
7.9;3.9 Lambdas;203
7.9.1;3.9.1 Objekte erfassen;204
7.9.2;3.9.2 Generische Lambdas;208
7.10;3.10 Variablen-Templates;208
7.11;3.11 Variadische Templates;210
7.11.1;3.11.1 Rekursive Funktionen;210
7.11.2;3.11.2 Direkte Expansion;212
7.11.3;3.11.3 Indexsequenzen;213
7.11.4;3.11.4 Faltung;215
7.11.5;3.11.5 Typgeneratoren;216
7.11.6;3.11.6 Wachsende Tests;216
7.12;3.12 Übungen;218
7.12.1;3.12.1 String-Darstellung;218
7.12.2;3.12.2 String-Darstellung von Tupeln;218
7.12.3;3.12.3 Generischer Stack;219
7.12.4;3.12.4 Rationale Zahlen mit Typparameter;219
7.12.5;3.12.5 Iterator eines Vektors;219
7.12.6;3.12.6 Ungerader Iterator;219
7.12.7;3.12.7 Bereich von ungeraden Zahlen;220
7.12.8;3.12.8 Stack von bool;220
7.12.9;3.12.9 Stack mit nutzerdefinierter Größe;220
7.12.10;3.12.10 Deduktion von Nicht-Typ-Template-Argumenten;220
7.12.11;3.12.11 Trapez-Regel;221
7.12.12;3.12.12 Partielle Spezialisierung mit einer statischen Funktion;221
7.12.13;3.12.13 Funktor;221
7.12.14;3.12.14 Lambda;221
7.12.15;3.12.15 Implementieren Sie make_unique;222
8;4 Bibliotheken;223
8.1;4.1 Standard-Template-Library;224
8.1.1;4.1.1 Einführendes Beispiel;224
8.1.2;4.1.2 Iteratoren;225
8.1.3;4.1.3 Container;230
8.1.4;4.1.4 Algorithmen;239
8.1.5;4.1.5 Jenseits von Iteratoren;244
8.1.6;4.1.6 Parallele Berechnung;246
8.2;4.2 Numerik;247
8.2.1;4.2.1 Komplexe Zahlen;247
8.2.2;4.2.2 Zufallszahlengeneratoren;250
8.2.3;4.2.3 Mathematische Spezialfunktionen;259
8.3;4.3 Meta-Programmierung;260
8.3.1;4.3.1 Wertgrenzen;260
8.3.2;4.3.2 Typeigenschaften;262
8.4;4.4 Utilities;264
8.4.1;4.4.1 optional;264
8.4.2;4.4.2 Tupel;265
8.4.3;4.4.3 variant;268
8.4.4;4.4.4 any;270
8.4.5;4.4.5 string_view;271
8.4.6;4.4.6 function;272
8.4.7;4.4.7 Referenz-Wrapper;275
8.5;4.5 Die Zeit ist gekommen;277
8.6;4.6 Parallelität;279
8.6.1;4.6.1 Terminologie;279
8.6.2;4.6.2 Überblick;280
8.6.3;4.6.3 Threads;280
8.6.4;4.6.4 Rückmeldung an den Aufrufer;282
8.6.5;4.6.5 Asynchrone Aufrufe;283
8.6.6;4.6.6 Asynchroner Gleichungslöser;285
8.6.7;4.6.7 Variadische Mutex-Sperre;289
8.7;4.7 Wissenschaftliche Bibliotheken jenseits des Standards;291
8.7.1;4.7.1 Andere Arithmetiken;291
8.7.2;4.7.2 Intervallarithmetik;292
8.7.3;4.7.3 Lineare Algebra;292
8.7.4;4.7.4 Gewöhnliche Differentialgleichungen;293
8.7.5;4.7.5 Partielle Differentialgleichungen;293
8.7.6;4.7.6 Graphenalgorithmen;294
8.8;4.8 Übungen;294
8.8.1;4.8.1 Sortierung nach Betrag;294
8.8.2;4.8.2 Suche mit einem Lambda als Prädikat;294
8.8.3;4.8.3 STL-Container;295
8.8.4;4.8.4 Komplexe Zahlen;295
8.8.5;4.8.5 Parallele Vektoraddition;296
8.8.6;4.8.6 Refaktorisierung der parallelen Addition;296
9;5 Meta-Programmierung;298
9.1;5.1 Lassen Sie den Compiler rechnen;298
9.1.1;5.1.1 Kompilierzeitfunktionen;298
9.1.2;5.1.2 Erweiterte Kompilierzeitfunktionen;300
9.1.3;5.1.3 Primzahlen;302
9.1.4;5.1.4 Wie konstant sind unsere Konstanten?;304
9.1.5;5.1.5 Kompilierzeit-Lambdas;305
9.2;5.2 Typinformationen;306
9.2.1;5.2.1 Typabhängige Funktionsergebnisse;306
9.2.2;5.2.2 Bedingte Ausnahmebehandlung;310
9.2.3;5.2.3 Ein Beispiel für eine const-korrekte View;311
9.2.4;5.2.4 Standard-Typmerkmale;318
9.2.5;5.2.5 Domän-spezifische Type-Traits;318
9.2.6;5.2.6 Typeigenschaften mit Überladung;320
9.2.7;5.2.7 enable_if;322
9.2.8;5.2.8 Variadische Templates überarbeitet;326
9.3;5.3 Expression-Templates;329
9.3.1;5.3.1 Einfache Implementierung eines Additionsoperators;329
9.3.2;5.3.2 Eine Klasse für Expression-Templates;333
9.3.3;5.3.3 Generische Expression-Templates;335
9.4;5.4 Compiler-Optimierung mit Meta-Tuning;337
9.4.1;5.4.1 Klassisches Abrollen mit fester Größe;338
9.4.2;5.4.2 Geschachteltes Abrollen;342
9.4.3;5.4.3 Aufwärmung zum dynamischen Abrollen;348
9.4.4;5.4.4 Abrollen von Vektorausdrücken;349
9.4.5;5.4.5 Tuning von Expression-Templates;351
9.4.6;5.4.6 Tuning von Reduktionen;354
9.4.7;5.4.7 Tuning geschachtelter Schleifen;361
9.4.8;5.4.8 Resümee des Tunings;366
9.5;5.5 Turing-Vollständigkeit;368
9.6;5.6 Übungen;371
9.6.1;5.6.1 Type-Traits;371
9.6.2;5.6.2 Fibonacci-Sequenz;371
9.6.3;5.6.3 Meta-Programm für den größten gemeinsamen Divisor;371
9.6.4;5.6.4 Rationale Zahlen mit gemischten Typen;372
9.6.5;5.6.5 Vektor-Expression-Template;372
9.6.6;5.6.6 Meta-Liste;373
10;6 Objektorientierte Programmierung;374
10.1;6.1 Grundprinzipien;374
10.1.1;6.1.1 Basis- und abgeleitete Klassen;375
10.1.2;6.1.2 Konstruktoren erben;378
10.1.3;6.1.3 Virtuelle Funktionen;379
10.1.4;6.1.4 Funktoren über Vererbung;386
10.1.5;6.1.5 Abgeleitete Klassen für Ausnahmen;387
10.2;6.2 Redundanz entfernen;388
10.3;6.3 Mehrfachvererbung;390
10.3.1;6.3.1 Mehrere Eltern;390
10.3.2;6.3.2 Gemeinsame Großeltern;391
10.4;6.4 Dynamische Auswahl von Subtypen;396
10.5;6.5 Konvertierung;398
10.5.1;6.5.1 Umwandlungen zwischen abgeleiteten Klassen;399
10.5.2;6.5.2 const_cast;403
10.5.3;6.5.3 Umdeutung;404
10.5.4;6.5.4 Umwandlung im Funktionsstil;404
10.5.5;6.5.5 Implizite Umwandlungen;406
10.6;6.6 CRTP;407
10.6.1;6.6.1 Ein einfaches Beispiel;407
10.6.2;6.6.2 Ein wiederverwendbarer Indexoperator;409
10.7;6.7 Übungen;411
10.7.1;6.7.1 Nicht-redundante Raute;411
10.7.2;6.7.2 Vektorklasse mit Vererbung;411
10.7.3;6.7.3 Ausnahmen in Vektor refaktorisieren;411
10.7.4;6.7.4 Test auf geworfene Ausnahme;412
10.7.5;6.7.5 Klonfunktion;412
11;7 Wissenschaftliche Projekte;413
11.1;7.1 Implementierung von ODE-Lösern;413
11.1.1;7.1.1 Gewöhnliche Differentialgleichungen;413
11.1.2;7.1.2 Runge-Kutta-Algorithmen;416
11.1.3;7.1.3 Generische Implementierung;417
11.1.4;7.1.4 Ausblick;424
11.2;7.2 Projekte erstellen;424
11.2.1;7.2.1 Build-Prozess;425
11.2.2;7.2.2 Build-Tools;429
11.2.3;7.2.3 Separates Kompilieren;433
11.3;7.3 Einige abschließende Worte;439
12;A Weitschweifendes;441
12.1;A.1 Mehr über gute und schlechte Software;441
12.2;A.2 Grundlagen im Detail;447
12.2.1;A.2.1 Statische Variablen;447
12.2.2;A.2.2 Mehr über if;447
12.2.3;A.2.3 Duff’s Device;449
12.2.4;A.2.4 Programmaufrufe;449
12.2.5;A.2.5 Zusicherung oder Ausnahme?;450
12.2.6;A.2.6 Binäre I/O;451
12.2.7;A.2.7 I/O im Stile von C;452
12.2.8;A.2.8 Garbarge-Collection;453
12.2.9;A.2.9 Ärger mit Makros;454
12.3;A.3 Praxisbeispiel: Matrix-Invertierung;455
12.4;A.4 Klassendetails;465
12.4.1;A.4.1 Zeiger auf Mitglieder;465
12.4.2;A.4.2 Weitere Initialisierungsbeispiele;465
12.4.3;A.4.3 Zugriff auf mehrdimensionale Datenstrukturen;466
12.5;A.5 Methodengenerierung;469
12.5.1;A.5.1 Automatische Generierung;470
12.5.2;A.5.2 Steuerung der Generierung;472
12.5.3;A.5.3 Generierungsregeln;473
12.5.4;A.5.4 Fallstricke und Designrichtlinien;477
12.6;A.6 Template-Details;481
12.6.1;A.6.1 Einheitliche Initialisierung;481
12.6.2;A.6.2 Welche Funktion wird aufgerufen?;481
12.6.3;A.6.3 Spezialisierung auf spezifische Hardware;484
12.6.4;A.6.4 Variadisches binäres I/O;485
12.7;A.7 Mehr über Bibliotheken;486
12.7.1;A.7.1 std::vector in C++03 verwenden;486
12.7.2;A.7.2 variant mal nerdisch;487
12.8;A.8 Dynamische Auswahl im alten Stil;487
12.9;A.9 Mehr über Meta-Programmierung;488
12.9.1;A.9.1 Das erste Meta-Programm in der Geschichte;488
12.9.2;A.9.2 Meta-Funktionen;490
12.9.3;A.9.3 Rückwärtskompatible statische Zusicherung;491
12.9.4;A.9.4 Anonyme Typparameter;492
12.9.5;A.9.5 Benchmark-Quellen für dynamisches Abrollen;496
12.9.6;A.9.6 Benchmark für Matrixprodukt;497
13;B Werkzeuge;498
13.1;B.1 g++;498
13.2;B.2 Debugging;499
13.2.1;B.2.1 Textbasierte Debugger;499
13.2.2;B.2.2 Debugging mit graphischen Interface: DDD;501
13.3;B.3 Speicheranalyse;503
13.4;B.4 gnuplot;504
13.5;B.5 Unix, Linux und Mac OS;505
14;C Sprachdefinitionen;507
14.1;C.1 Wertkategorien;507
14.2;C.2 Konvertierungsregeln;510
14.2.1;C.2.1 Aufwertung;511
14.2.2;C.2.2 Andere Konvertierungen;511
14.2.3;C.2.3 Arithmetische Konvertierungen;512
14.2.4;C.2.4 Verengung;513
15;Literatur;514
16;Abbildungsverzeichnis;517
17;Tabellenverzeichnis;518
18;Index;519


1. Grundlagen
2. Klassen
3. Generische Programmierung
4. Bibliotheken
5. Meta-Programmierung
6. Objektorientierte Programmierung
7. Wissenschaftliche Projekte
A. Weitschweifendes
B. Werkzeuge
C. Sprachdefinitionen


Peter Gottschling ist Geschäftsführer und Gründer der Firma SimuNova. Er engagiert sich im ISO-C++-Standardisierungskomitee und ist Autor wissenschaftlicher Bibliotheken wie der Matrix Template Library 4.



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.