Wolf / Guddat | Grundkurs C++ | E-Book | sack.de
E-Book

E-Book, Deutsch, 542 Seiten

Reihe: Rheinwerk Computing

Wolf / Guddat Grundkurs C++


5. Auflage 2025
ISBN: 978-3-367-10454-3
Verlag: Rheinwerk
Format: EPUB
Kopierschutz: 0 - No protection

E-Book, Deutsch, 542 Seiten

Reihe: Rheinwerk Computing

ISBN: 978-3-367-10454-3
Verlag: Rheinwerk
Format: EPUB
Kopierschutz: 0 - No protection



Dieser Grundkurs ist genau das Richtige für alle, die einen schnellen Einstieg in die Programmiersprache C++ und einen Überblick über die Grundlagen ohne viel Beiwerk suchen. Ausführlich und jederzeit verständlich erklären Martin Guddat und Jürgen Wolf alles, was notwendig ist, damit Sie modernes C++ lernen und objektorientiert programmieren können.
Von der ersten Seite an geht es sofort los mit einfachen Programmen bis hin zur Entwicklung komplexerer Anwendungen. Übungen am Ende jedes Kapitels helfen Einsteiger*innen und vor allem Selbstlerner*innen beim Verstehen der Sprache. Die kompakte Darstellung macht das Buch zu einer unverzichtbaren Referenz für die Arbeit mit C++.
Diese fünfte Auflage wurde umfassend überarbeitet und modernisiert.
Das Buch eignet sich hervorragend als Begleiter für das Studium der Informatik und anderer technischer Fächer.

Aus dem Inhalt:

  • Das erste Programm in C++
  • Basisdatentypen
  • Typumwandlung
  • Verzweigungen
  • Schleifen
  • Funktionen
  • Präprozessor-Direktiven
  • Arrays und Zeichenketten (Strings)
  • Zeiger (Pointer)
  • Dynamische Speicherobjekte und Strukturen
  • Namensräume
  • Modulare Programmierung
  • Klassen und Objekte
  • Vererbung
  • Operatoren überladen
  • Templates
  • Exceptionhandling (Fehlerbehandlung)
  • Modernes C++ bis C++23


Jürgen Wolf ist seit über 20 Jahren Autor und seit mehr als 10 Jahren passionierter Digitalfotograf. Seine Buchthemen sind Bildbearbeitung, Fotografie, Webentwicklung, Betriebssysteme und Programmierung. Und egal welches Thema: Bei jedem Buch ist es sein Ziel, auch komplexe Zusammenhänge klar und verständlich zu erklären.
Wolf / Guddat Grundkurs C++ jetzt bestellen!

Weitere Infos & Material


1.  Einstieg in die Welt von C++ ... 19  1.1 ... Der C++-Standard ... 19  1.2 ... Die nötigen Werkzeuge für C++ ... 20  1.3 ... Übersetzen mit g++ und clang++ ... 24  1.4 ... Übersetzen mit einer Entwicklungsumgebung ... 26  1.5 ... Listings zum Buch ... 30  1.6 ... Kontrollfragen und Aufgaben im Buch ... 30  1.7 ... Aufgabe ... 30  1.8 ... Aufgabe zu C++ 23 ... 31  2.  Erste Schritte in C++ ... 33  2.1 ... Das erste Programm in C++ ... 33  2.2 ... Anweisungen und Ausdrücke ... 35  2.3 ... Die Standardeingabe- und -ausgabestreams ... 37  2.4 ... Einige Begriffe zu C++ ... 43  2.5 ... Kontrollfragen und Aufgaben ... 45  3.  Die eingebauten C++-Basisdatentypen ... 46  3.1 ... Variablen ... 46  3.2 ... Definition und Deklaration von Variablen ... 47  3.3 ... Initialisierung und Zuweisung von Werten ... 48  3.4 ... Ganzzahltypen ... 51  3.5 ... Ganzzahldatentyp für Zeichen ... 58  3.6 ... Fließkommazahlentypen ... 68  3.7 ... Der »auto«-Typ ... 71  3.8 ... Konstanten ... 72  3.9 ... Die Byte-Größe mit dem »sizeof«-Operator ... 73  3.10 ... Limits für die Basisdatentypen ... 74  3.11 ... Kontrollfragen und Aufgaben ... 77  4.  Arbeiten mit den eingebauten Typen ... 78  4.1 ... Arithmetische Operatoren ... 78  4.2 ... Ungenaue Fließkommazahlen ... 86  4.3 ... Typumwandlung ... 88  4.4 ... Formatierte Ausgabe von Werten ... 94  4.5 ... Kontrollfragen und Aufgaben ... 95  5.  Kontrollstrukturen ... 97  5.1 ... Der eingebaute Datentyp »bool« ... 97  5.2 ... Vergleichsoperatoren ... 98  5.3 ... Bedingte Anweisung mit »if« ... 101  5.4 ... Anweisungsblock für Kontrollstrukturen ... 102  5.5 ... Alternative »else«-Verzweigung ... 103  5.6 ... Bedingte Anweisung mit Initialisierung ... 105  5.7 ... Mehrfache Verzweigung ... 105  5.8 ... Der Bedingungsoperator »?:« ... 108  5.9 ... Logische Operatoren ... 109  5.10 ... Die Fallunterscheidung -- »switch« ... 111  5.11 ... Die kopfgesteuerte »while«-Schleife ... 114  5.12 ... Die fußgesteuerte »do-while«-Schleife ... 116  5.13 ... Die Zählschleife »for« ... 117  5.14 ... Kontrollierte Sprunganweisungen ... 121  5.15 ... Kontrollfragen und Aufgaben ... 123  6.  Arrays und Strings ... 125  6.1 ... Arrays ... 125  6.2 ... Strings in C++ ... 139  6.3 ... Kontrollfragen und Aufgaben ... 145  7.  Referenzen und Zeiger ... 146  7.1 ... Referenzen ... 146  7.2 ... Zeiger ... 149  7.3 ... Kontrollfragen und Aufgaben ... 158  8.  Funktionen ... 160  8.1 ... Grundlegendes zu Funktionen ... 160  8.2 ... Referenzen als Parameter und Rückgabe ... 180  8.3 ... Zeiger als Parameter und Rückgabewert ... 187  8.4 ... Übergabe großer Elemente als Funktionsparameter ... 188  8.5 ... C-Arrays oder C-Strings als Funktionsparameter ... 190  8.6 ... Kontrollfragen und Aufgaben ... 191  9.  Modularisierung und Präprozessor ... 193  9.1 ... Präprozessor-Direktiven ... 193  9.2 ... Modulare Programmierung ... 199  9.3 ... Namensräume ... 205  9.4 ... Spezifizierer und Qualifikatoren ... 217  9.5 ... Kontrollfragen und Aufgaben ... 223

10.  Strukturen, Aufzählungen und dynamische Speicherobjekte ... 226  10.1 ... Erste eigene Datentypen mit Strukturen ... 226  10.2 ... Der Aufzählungstyp »enum« ... 235  10.3 ... Eigene Namen mit »using« ... 237  10.4 ... Dynamische Speicherobjekte ... 238  10.5 ... Kontrollfragen und Aufgaben ... 249

11.  Klassen ... 250  11.1 ... Klassen ... 250  11.2 ... Konstruktoren ... 264  11.3 ... Destruktoren ... 281  11.4 ... Weitere Formen von Methoden ... 286  11.5 ... Kontrollfragen und Aufgaben ... 295

12.  Objekte und Klassenelemente ... 297  12.1 ... Objekt als Parameter ... 297  12.2 ... Freundfunktionen (»friend«) ... 302  12.3 ... Objekte einer Klasse als Rückgabewerte ... 304  12.4 ... Arrays von Objekten ... 310  12.5 ... Dynamische Objekte ... 311  12.6 ... Klassenobjekte als Klassenattribute ... 313  12.7 ... Eine Containerklasse als Klassenattribut ... 318  12.8 ... Smart Pointer als Klassenattribut ... 321  12.9 ... Statische und konstante Klassenelemente ... 325  12.10 ... Die Nullregel (Rule of Zero) ... 333  12.11 ... Kontrollfragen und Aufgaben ... 336

13.  Operatoren überladen ... 338  13.1 ... Das Schlüsselwort »operator« ... 340  13.2 ... Zweistellige (arithmetische) Operatoren überladen ... 341  13.3 ... Einstellige Operatoren überladen ... 348  13.4 ... Den Zuweisungsoperator überladen ... 352  13.5 ... Ausgabe- und Eingabeoperatoren überladen ... 357  13.6 ... Vergleichsoperatoren ... 361  13.7 ... Weitere Operatorüberladungen ... 364  13.8 ... Konvertierungsoperatoren ... 364  13.9 ... Kontrollfragen und Aufgaben ... 368

14.  Vererbung (Abgeleitete Klassen) ... 370  14.1 ... Die Vorbereitung ... 371  14.2 ... Das Ableiten einer Klasse ... 373  14.3 ... Kontrollfragen und Aufgaben ... 393

15.  Templates ... 395  15.1 ... Funktionstemplates ... 395  15.2 ... Klassentemplates ... 405  15.3 ... Kontrollfragen und Aufgaben ... 411

16.  Ausnahmebehandlung (Fehlerbehandlung) ... 413  16.1 ... Grundlagen der Fehlerbehandlung ... 413  16.2 ... Eine Ausnahme auslösen ... 415  16.3 ... Eine Ausnahme auffangen und behandeln ... 416  16.4 ... Standardausnahmen (Fehlerklassen) ... 426  16.5 ... Die Alternative »std::expected« ... 431  16.6 ... Vermeidung von Fehlern mit [[nodiscard]] ... 433  16.7 ... Fehlerdiagnose mit »std::source_location« ... 434  16.8 ... Kontrollfragen ... 435

17.  Ein-/Ausgabestreams für Dateien ... 436  17.1 ... Der Umgang mit Dateien in C++ ... 436  17.2 ... Verschiedene Streams für Dateien ... 436  17.3 ... Eine Datei öffnen und schließen ... 437  17.4 ... Mit »std::filesystem« arbeiten ... 449  17.5 ... Kontrollfragen und Aufgaben ... 450

18.  Die Standardbibliothek und weitere Sprachelemente ... 452  18.1 ... Die Container der Standardbibliothek ... 452  18.2 ... Algorithmen der Standardbibliothek ... 465  18.3 ... Fortgeschrittene Sprachelemente ... 468  18.4 ... Fortgeschrittene Funktionskonzepte ... 473  18.5 ... Smart Pointer ... 483  18.6 ... Textansichten und Formatierung ... 494  18.7 ... Die Zeitbibliothek ... 501  18.8 ... Ausblick auf das Multithreading ... 507  Anhang ... 509  A ... Lösungen der Übungsaufgaben ... 509  Index ... 533


2.3    Die Standardeingabe- und -ausgabestreams


Im Beispiel listing01.cpp sind Sie mit std::cout in Berührung gekommen. std::cout repräsentiert einen sogenannten Ausgabestream, dem Sie beispielsweise Text zur Ausgabe übergeben können. Sie werden in diesem Abschnitt neben std::cout noch einen weiteren Ausgabestream und einen Eingabestream näher kennenlernen.

Streams


In C++ wird beim Datenverkehr von einem Stream gesprochen. Übersetzt heißt dies in etwa so viel wie Datenstrom. Sie können sich einen solchen Stream wie eine Pipeline vorstellen, die die Daten von Ihrem Programm an die zugehörige Ausgabe weiterleitet.

2.3.1    Die Streams von C++


Wie schon erwähnt, ist die Ein- und Ausgabe in C++ kein Bestandteil der Sprache selbst. Die einfache Ein- und Ausgabe wird über die (objektorientierte) Streambibliothek iostream bereitgestellt, die dazu inkludiert (eingebunden) wird.

Der meistverwendete Stream ist der Standardausgabestream std::cout. Er entspricht der Ausgabe an die Konsole, in der das Programm gestartet worden ist. Diese Konsole kann auch von der Entwicklungsumgebung für Sie geöffnet werden.

2.3.2    Ausgabe mit »std::cout«


Um eine Ausgabe durch den Stream std::cout zu veranlassen, schieben Sie mit dem Ausgabeoperator << die auszugebenden Daten in den Stream. Die Form des Operators deutet dieses »Hineinschieben« bereits an. Der Ausgabeoperator ist so implementiert, dass Sie mit ihm alle grundlegenden Datentypen von C++ ohne weitere Vorkehrungen ausgeben können. Auf diese Datentypen selbst kommen wir im nächsten Kapitel zu sprechen.

00 // listings/02/listing02.cpp
01 #include
02 #include
03 int main() {
04 std::cout << "Einfache Ausgabe\n";
05 std::cout << "Lange Ausgabe mit "
06 << "mehr Text\n";
07 return EXIT_SUCCESS;
08 }

Mit der Anweisung in Zeile (04) schieben Sie die Zeichenkette "Einfache Ausgabe" in den Standardausgabestream std::cout. Es handelt sich hier wieder um eine Ausdrucksanweisung mit << als Operator zwischen den Operanden std::cout und "Einfache Ausgabe\n". Der Operator bewirkt, dass der Text in den Ausgabestream geschrieben wird, der hier als erster Operand angegeben wurde. Das Ergebnis dieses Ausdrucks ist wieder ein Ausgabestream std::cout, er wird hier aber nicht wieder verwendet.

Sie können mehrere Ausdrücke miteinander verketten, wie Sie in Zeile (05) und (06) sehen. Diesmal wird der Stream, der das Ergebnis des ersten Ausdrucks ist, weiterverwendet: als erster Operand zum Operator << in Zeile (06). Der zweite Operand ist "mehr Text\n". Die Formatierung in zwei Zeilen ist nicht relevant, die Anweisung könnte ebenso gut in einer Zeile stehen.

2.3.3    Ausgabe mit »std::print«


Seit C++23 gibt es auch die Möglichkeit, Ausgaben mit std::print und std::println zu erzeugen. Um sie zu verwenden, muss die Bibliothek über #include

00 // listings/02/listing03.cpp
01 #include
02 #include
03 int main() {
04 std::print("Einfache Ausgabe");
05 std::println("Lange Ausgabe mit "
06 "mehr Text über zwei Zeilen");
07 return EXIT_SUCCESS;
08 }

Um die beiden Befehle verwenden zu können, muss ein anderer Header eingebunden werden als für std::cout. Das passiert hier in Zeile (02). In Zeile (04) erfolgt eine Ausgabe mit std::print. Wie bei std::cout erfolgt hier kein automatischer Zeilenumbruch, die Ausgabe kann aber wie dort für einen Umbruch um \n ergänzt werden. Mit std::println als Kurzform für printline erfolgt automatisch ein Zeilenumbruch nach der Ausgabe.

Diese neue Syntax ist besonders für Einsteiger und Einsteigerinnen intuitiv. Sie wird sich in den kommenden Jahren voraussichtlich auch stark verbreiten. Aktuell ist sie allerdings noch selten. Die Ausgabe über Streams mit std::cout ist eng mit C++ und weiteren Konzepten verbunden. Wir verwenden daher im Buch beide Ausgabemethoden nebeneinander und std::println hauptsächlich an den Stellen, an denen es deutlich kompakter ist.

2.3.4    Eingabe mit »std::cin«


Analog zu std:cout bietet die Standardbibliothek mit std::cin einen Stream für die Eingabe, in der Regel per Tastatur. Er verwendet den Eingabeoperator >>. Der eingelesene Wert wird in einer Variablen gespeichert:

00 // listings/02/listing04.cpp
01 #include
02 #include
03 int main() {
04 int zahl = 0;
05 std::cout << "Bitte eine Ganzzahl: ";
06 std::cin >> zahl;
07 std::cout << "Sie haben " << zahl << " eingegeben\n";
08 return EXIT_SUCCESS;
09 }

Das Programm bei der Ausführung:

Bitte eine Ganzzahl: 1234
Sie haben die Zahl 1234 eingegeben

In Zeile (04) greifen wir dem nächsten Kapitel wieder ein wenig vor und definieren die Variable zahl vom Datentyp int (Integer = Ganzzahl). Den Wert setzen wir vorerst auf 0. Mit zahl haben wir jetzt ein benanntes Element, in dem wir eine Ganzzahl speichern und wieder abrufen können.

In Zeile (06) wartet das Programm bei der Ausführung, um über den Standardeingabestream std::cin von der Tastatur eine solche Ganzzahl in zahl einzulesen. Der eingegebene Wert wird nach der Bestätigung mit der Taste (¢) vom Eingabestream std::cin über den Eingabeoperator >> quasi in die Variable zahl hineingeschoben. Auch hier sehen Sie wieder einen Ausdruck mit zwei Operanden. Über den Datentyp des zweiten Operanden (hier die Variable zahl vom Typ int) hat der Compiler die Information, dass eine Ganzzahl erwartet wird. Damit kann er steuern, welche Eingabe überhaupt akzeptiert wird. Beim Einlesen mit std::cin und dem Operator >> gelten außerdem folgende Regeln:

  • Die Verarbeitung der Eingabe bricht an der Stelle ab, an der das erste Zeichen nicht mehr verarbeitet werden kann. Geben Sie beispielsweise bei der Ausführung des Programms aus listing04.cpp als Wert »1234Euro« ein, wird in der Variablen zahl nur der Wert 1234 gespeichert, weil der eingebaute Datentyp int nur Ganzzahlen kennt.

  • Führende Leerraumzeichen (Whitespace) wie Leerzeichen, Tabulator oder Newline (das Neue-Zeile-Zeichen) werden überlesen. Befindet sich vor dem eigentlichen Wert ein solches »Zeichen«, wird der Wert dennoch richtig eingelesen.

2.3.5    Ausgabe mit »std::cerr«


Sie haben schon die Ausgabe an den Standardausgabestream mit std:: cout kennengelernt. Mit dem Fehlerausgabestream std::cerr gibt es einen weiteren Kanal, und zwar zur Ausgabe von Fehlermeldungen. Auch std::cerr sendet seine Ausgabe standardmäßig an den Bildschirm. Damit scheint er das Gleiche zu tun wie std::cout. Es gibt allerdings einen wichtigen Unterschied: Sie können auf der Konsole die Ausgabe eines Programms in Dateien umleiten und dabei zwischen dem Stream zur allgemeinen Ausgabe und dem Stream zur Fehlerausgabe unterscheiden. Damit haben Sie die Möglichkeit, das »Ergebnis« eines Programms in eine Datei umzuleiten, aber seine Fehlermeldungen immer noch auf dem Bildschirm angezeigt zu bekommen. So müssen Sie die Fehlermeldungen nachher nicht aus der Ausgabe entfernen. Hierzu ein kurzes Beispiel:

00 // listings/02/listing05.cpp
...
01 int main() {
02 std::cout << "Das Ergebnis (std::cout)\n";
03 std::cerr << "Programmende(std::cerr)\n";
04 return EXIT_SUCCESS;
05 }

Auslassungen von Wiederholungen

Elemente, die sich wiederholen, werden im Verlauf des Buches in den Listings oft nur noch durch Auslassungszeichen angedeutet, um Platz zu sparen. In listing05.cpp sind das beispielsweise:

#include
#include

Sie sollten die notwendigen #include-Direktiven bald automatisch kennen. Neue Header werden im Text angekündigt und Sie können die Angabe auch in den Beispieldateien nachsehen.

Wenn Sie dieses Programm ausführen, erhalten Sie die folgende...


Wolf, Jürgen
Jürgen Wolf ist seit über 20 Jahren Autor und seit mehr als 10 Jahren passionierter Digitalfotograf. Seine Buchthemen sind Bildbearbeitung, Fotografie, Webentwicklung, Betriebssysteme und Programmierung. Und egal welches Thema: Bei jedem Buch ist es sein Ziel, auch komplexe Zusammenhänge klar und verständlich zu erklären.

Guddat, Martin
Prof. Dr. Martin Guddat lehrt an der Westfälischen Hochschule in Gelsenkirchen und Bocholt. Er hat langjährige Erfahrung in der Erstellung technischer Software, z. B. für Mobiltelefone und Fingerabdrucksensoren, zudem als IT-Projektleiter und als Berater im Bereich der Systemintegration großer Softwareprojekte.



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.