2011 wurde der neue C++-Standard C++11 veröffentlicht (Stroustrup, 2011). Er ist nach einem guten Jahrzehnt die erste große C++-Neuerung, mit der C++ fit für neue Anforderungen gemacht wird. Rein quantitativ gesprochen, verdoppelt sich der C++-Standard nahezu von knapp 800 auf gut 1.300 Seiten. Da verwundert es nicht, wie Bjarne Stroustrup, der Erfinder von C++, C++11 charakterisiert:
Bjarne Stroustrup über C++11
Surprisingly, C++11 feels like a new language: The pieces just fit together better than they used to and I find a higher-level style of programming more natural than before and as efficient as ever.
(Erstaunlich, C++11 fühlt sich wie eine neue Sprache an: Die Einzelteile passen einfach besser zusammen als gewohnt, und ich finde das Programmieren auf abstrakterer Ebene natürlicher als früher und so effizient wie immer.) (Stroustrup, 2011)
Threading, funktionale Programmierung, automatisches Speichermanagement, reguläre Ausdrücke ... das alles und noch viel, viel mehr ist nun ebenfalls enthalten. Dabei hat C++11 an seine zwei Zielgruppen gedacht.
Für den Einsteiger: einfacher zu lernen durch die vereinheitlichte Syntax und die mächtigen Bibliotheken, mit denen Standardaufgaben leichter erledigt werden können.
Für den Profi: eine bessere Programmiersprache für die Systemprogrammierung und das Schreiben von Bibliotheken durch neue und verbesserte Features der Kernsprache und der Bibliotheken.
Die entscheidenden Fragen eines C++-Entwicklers, bevor er sich den Herausforderungen des neuen C++11 stellt, sind meines Erachtens:
Welche Erweiterungen und Neuerungen bringt C++11 mit sich?
Warum ist C++11 das bessere C++?
Wie können die neuen Features möglichst effizient eingesetzt werden?
Mit dem Beantworten dieser Fragen will das Buch überzeugen – überzeugen, dass sich der Aufwand lohnt, sich mit dem neuen C++11 auseinanderzusetzen. Denn was bleibt, ist die Fähigkeit, die anspruchsvolle Programmiersprache C++ auf einem höheren Niveau zu beherrschen.
Dieses Buch richtet sich an C++-Programmierer, die sich mit dem neuen C++11-Standard vertraut machen möchten. Zwar setzt das Buch nicht explizit C++ Kenntnisse voraus, um die Theorie und die vielen Beispiele zu verstehen, jedoch lässt sich der große Schritt von C++11 zu C++ am besten ermessen, wenn Sie C++ kennen.
Das Buch besteht aus den folgenden vier großen Themenblöcken:
Tour de C++11
Neuerungen der Kernsprache
Multithreading mit C++11
Verbesserungen der Standardbibliothek
Einen ersten schnellen Überblick über C++11 gibt Teil I, auf rund 100 Seiten. Darin werde ich die Neuerungen von C++11 vorstellen, ohne besonders in die Tiefe zu gehen. Mit diesem Überblick besitzen Sie die notwendigen Voraussetzungen, um sich mehr mit den Details von C++11 zu beschäftigen, die in den nächsten drei Abschnitten des Buchs folgen.
Los geht es mit Teil II. Kapitel 6 geht auf die verbesserte Usability in C++11 ein: Diese besteht aus der Range-basierten For-Schleife für die einfache Ausgabe oder Modifikation von Containern, der automatischen Typableitung mit auto
, aus Lambda-Funktionen und der vereinheitlichten Initialisierung in C++11. Auf die verbesserte Usability folgt der mächtigere Entwurf von Klassen in Kapitel 7. Mächtiger, da C++11 Initialisiererlisten für Konstruktoren, die Delegation und Vererbung von Konstruktoren, aber auch das direkte Initialisieren von Klassenelementen anbietet. Mächtiger, da C++11 explizite Klassendefinitionen mit den Schlüsselwörtern default
und delete
, override
und final
, aber auch explizite Konvertierungsoperatoren unterstützt. In Kapitel 8 folgt das auf Performance optimierte Arbeiten mit Containern in Form von Move-Semantik und Perfect Forwarding. Deutlich mächtiger wird in C++11 auch die generische Programmierung, die in Kapitel 9 beschrieben wird. Sie werden Variadic Templates, also Templates mit beliebig vielen Argumenten, Zusicherungen zur Compile-Zeit an den Code und Aliase Templates kennenlernen. Abgeschlossen wird dieser Teil des Buchs zur Kernsprache von C++11 mit den erweiterten Datenkonzepten und Literalen. In Kapitel 10 stelle ich konstante Ausdrücke, die zur Compile-Zeit ausgewertet werden können, unbeschränkte Unions und streng typisierte Aufzählungstypen vor. Weiter geht es mit Raw-String-Literalen, benutzerdefinierten Literalen und der Unicode-Unterstützung in C++11.
Teil III ist der nächste Themenblock des Buchs, der sich den Details widmet. Behandelt werden in den Kapitel 12 bis 18 die atomaren Datentypen von C++11, die Erzeugung und Verwaltung von Threads sowie den Schutz von gemeinsam genutzten Daten durch Mutexe und Locks. Weiter geht es mit Bedingungsvariablen und Thread-lokalem Speicher. Den Abschluss bilden asynchrone Operationen. Mit ihnen lassen sich Tasks für den einfachen Umgang mit Threads definieren.
Bezogen sich die vorherigen Themenblöcke vorwiegend auf den C++11-Kern, so in Teil IV des Buchs die Standardbibliothek unser zentrales Thema. Im Besonderen werden Sie in Kapitel 19 die vielen neuen und verbesserten Bibliotheken kennenlernen. Detailliert vorstellen werde ich Ihnen in Theorie und Praxis die neuen Bibliotheken für das Arbeiten mit regulären Ausdrücken, für die Typintrospektion und -manipulation mit den Type-Traits, für das Erzeugen von Zufallszahlen und für den Umgang mit der neuen Zeitfunktionalität. Den Abschluss dieses Teils bilden die verbesserten Bibliotheken zu den Smart Pointern, zu den neuen Containern wie Arrays, Tupels und Hashtabellen und zu den neuen Algorithmen in Kapitel 20.
Was wäre ein C++11-Buch ohne Ausblick auf die weitere Entwicklung von C++? Genau diese Vorschau will Teil V, geben. Darin erfahren Sie einerseits, warum die wohl wichtigste Neuerung von C++11 – Concepts, ein Typsystem für Templates – aus dem C++11-Standard gestrichen wurde, und andererseits, welche Ziele die nächsten Standards C++14 und C++14 C++1y verfolgen.
Wie das Buch zu lesen ist
Den ersten Überblick gibt Teil I. Auf rund 100 Seiten werden die neuen Features von C++11 vorgestellt, ohne allzu sehr in die Tiefe zu gehen. Ist das große Bild gezeichnet, ist es Zeit, sich in die einzelnen Komponenten genauer anzusehen und die Tastatur zu nutzen. Die drei weiteren Teile zu den Neuerungen der Kernsprache, zur neuen Threading-Mächtigkeit und zu Verbesserungen der Standardbibliothek bilden den Kern dieses Buchs.
Auf die Suche in der Breite folgt die in der Tiefe. Diesem einfachen Muster aus der Graphentheorie werde ich folgen. Zuerst werde ich die neuen Features vorstellen und dann genauer auf die Details eingehen, um schließlich anhand des einen oder anderen Beispiels sowie im Besonderen mit Übungsaufgaben weiter in die Tiefen vorzustoßen.
Diese Strategie, sich der unbekannten Materie von verschiedenen Seiten und mit immer detaillierterem Anspruch zu nähern, halte ich für einen idealen Ansatz, das Neue zum Vertrauten zu machen. Die größte Gefahr dabei besteht darin, die Redundanz zu übertreiben. Ich hoffe, es ist mir gelungen, diese in Grenzen zu halten.
Um den größtmöglichen Nutzen aus den Übungsaufgaben zu ziehen, stehen die Musterlösungen der Übungsaufgaben unter Aufgaben zur Verfügung (Download unter http://examples.oreilly.de/german_examples/cplusplusleitfadenger/). Denn nichts hat mich in meinem Mathematikstudium mehr gestört als eine Übungsaufgabe, die nicht lösbar war.
Die vielen Exkurse sind zum Schmökern da. Sie sollen Hintergrundinformationen liefern, ohne den roten Faden des Buchs zu stören. Es schadet daher auch nicht, sie beim ersten Lesen des Werks zu ignorieren.
Im Anhang finden Sie weiterführende Informationen, die das Buch abrunden sollen.
Zum einen enthält er die Anleitung dazu, wie Sie einen aktuellen C++-Compiler und die Boost-Bibliothek installieren können. Beides sind notwendige Voraussetzungen, um alle Beispielprogramme in Aktion zu sehen.
Zum anderen finden Sie Hintergrundinformationen zu C++11, die zu umfangreich für einen Exkurs sind. Dies betrifft Themen wie Funktionsobjekte in C++, das bekannte C++-Idiom Anhang C, Promotion Traits, implizit erzeugte Methoden und Operatoren sowie insbesondere die funktionale Programmierung.
Der größte Nutzen lässt sich aus einem Buch zur Programmierung ziehen, wenn die neuen Features in der Anwendung dargestellt werden. Daher werde ich viele Codeschnipsel und lauffähige Programme in dem Werk verwenden und deren Ausgabe präsentieren. Noch mehr Nutzen besitzt das Buch, wenn Sie mit den Codebeispielen arbeiten, sie modifizieren und erweitern. Zur weiteren Vertiefung der neuen Funktionalität schließe ich die Kapitel mit Übungsaufgaben ab, die sich mit den neuen C++11-Features in der Regel komfortabel lösen lassen.
Entgegen meiner Gewohnheit werde ich die Codeblöcke nur um zwei Leerzeichen einrücken, um Platz zu sparen. Namensraumbezeichner wie std
werde ich, wenn möglich, im Quellcode verwenden. Damit ist eindeutig, zu welchem Namensraum eine Funktion oder Klasse gehört. Zur besseren Orientierung im Quellcode werde ich diesen nummeriert darstellen.
Alle Programme sowie die Musterlösungen der Übungsaufgaben des Buchs stehen hier zur Verfügung:
http://examples.oreilly.de/german_examples/cplusplusleitfadenger/
Das trifft auch auf die Programme zu, die mit dem aktuellen GCC 4.7 noch nicht lauffähig sind. Trotz großer Sorgfalt kann es insbesondere bei diesen Programmen vorkommen, dass sich noch der eine oder andere Bug darin eingenistet hat.
Im Anhang gehe ich darauf ein, wie Sie eine aktuelle Build-Umgebung für Windows oder Linux erhalten.
Einen aktuellen C++-Compiler (C++11 Compilers Support, 2013) vorausgesetzt, können Sie sofort loslegen, denn viele Features des neuen Standards stehen schon zur Verfügung.
Das trifft vor allem auf den GCC 4.7-C++-Compiler (C++11 Support in GCC 4.7, 2012) zu, deckt dieser doch nahezu den ganzen C++11-Standard ab. Um möglichst viele neue Features in Aktion zu sehen, werde ich daher auf den GCC 4.7 zurückgreifen. Diverse Beispiele, insbesondere Übungsaufgaben, habe ich mit dem aktuellen C++-Compiler von Microsoft, VC10, entwickelt. Vereinzelt kam auch der Clang-Compiler clang++ 3.1 zum Einsatz (Clang 3.1 Release Notes, 2013).
Wird bei aktuellen GCC-Compilern das Flag std=c++0x
(ab GCC 4.3) bzw. das Flag std=c++11
(ab GCC 4.7) angegeben, verwendet dieser neben der neuen Kernfunktionalität auch die neuen Bibliotheken. Lediglich für die Regulär-Expression- und die Threading-Bibliothek ist noch Bastelarbeit notwendig. Hierzu müssen Sie die Header-Dateien und Bibliotheken aus Boost (Boost.TR1) verwenden. Das ist aber durchaus legitim, dienen diese doch als Grundlage für die aktuelle C++-Bibliothekserweiterung TR1.
Fehlt die Ausgabe eines Listings, liegt das daran, dass der aktuelle GCC 4.7 dieses Feature noch nicht unterstützt. Schwarz auf weiß sehen Sie die detaillierte Übersicht zu den aktuellen GCCs in Abbildung 2 und Abbildung 3.
Copyright © Free Software Foundation, Inc. Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.
Neben dem aktuellen GCC ist auch das aktuelle Visual C++ 10.0 sehr weit in der Unterstützung des modernen C++11. Tabelle 1 (Lavavej, 2010) von Stephan T. Lavavej, die der Struktur der Abbildung 2 folgt, gibt einen genauen Überblick über Visual C++ 9.0 und Visual C++ 10.0.
C++0x Core Language Features | VC9 | VC10 | |
Rvalue references | No | v2 | |
Rvalue references v2 | No | v2 | |
Rvalue references for *this | No | v2 | |
Initialization of class objects by rvalues | Yes | Yes | |
static_assert | No | Yes | |
auto | No | Yes | |
Multi-declarator auto | No | Yes | |
Removing old auto | No | Yes | |
Trailing return types | No | Yes | |
Lambdas | No | v1.0 | |
decltype | No | Yes | |
Right angle brackets | Yes | Yes | |
Extern templates | Yes | Yes | |
nullptr | No | Yes | |
Strongly typed enums | Partial | Partial | |
Forward declared enums | No | No | |
Extended friend declarations | Partial | Partial | |
Local and unnamed types as template arguments | Yes | Yes | |
C++0x Core Language Features: Concurrency | |||
exception_ptr | No | Yes | |
Thread-local storage | Partial | Partial | |
C++0x Core Language Featues: C99 | |||
__func__ | Partial | Partial | |
C99 preprocessor | Partial | Partial | |
long long | Yes | Yes |
Zwei kleine Anmerkungen noch zu der Tabelle: Rvalue-Referenzen Version 2 (v2) beschreibt die Implementierung, die im kommenden C++11 Standard sein wird. Diese Version 2 bildet auch die Grundlage dieses Buchs. Lambda-Funktionen in VC10 weichen nur in Feinheiten (subleties) (Lavavej, 2010) von den C++11-Lambda-Funktionen ab.
Bei meiner Vorstellung des neuen C++11-Standards habe ich mich auf den neuen Standard »ISO International Standard ISO/IEC 14882:2011(E) Programming Language« C++ bezogen. Dieser wurde formal im August 2011 als neuer Standard zugelassen.
Im Jahr 2009 hielt ich einige Vorträge über C++0x bei meinem Arbeitgeber science + computing ag (science + computing ag, 2011). Für die reichlich konstruktive Kritik danke ich Mathias Fröhlich, Peter Hrenka, Götz Isenmann, Marc Lohrer, Ove Sommer, Daniel Trstenjak, Milosz Walter und den weiteren Teilnehmern der internen Fortbildungsrunde.
Mein Dank gilt Mathias Huber vom Linux Magazin (Linux Magazin), der mich bei meinen zwei Artikeln zu C++0x (Grimm, Erfrischend neu, 2010) und (Grimm, Reichhaltiges Angebot, 2010) redaktionell begleitete.
Danken möchte ich Johannes Schaub und Stefan Reuther, die mir einige Erläuterungen zum neuen C++11-Standard gegeben haben. Mein besonderer Dank gilt Daniel Krügler, Moderator der Newsgruppe de.comp.lang.iso-c++ (de.comp.lang.iso-c++, 2011), der mir zu einem tieferen Einblick in die C++11-Materie verhalf.
Ich danke meiner Lektorin Brigitte Bauer-Schiewek vom Addison-Wesley Verlag, bei dem die 1. Auflage dieses Buchs erschienen ist, sowie meinem Fachlektor Dirk Frischalowski und meiner Sprachlektorin Petra Kienle, die mich bei dem neuen Abenteuer, ein Buch zu schreiben, begleitet haben.
Mein größter Dank gilt natürlich meiner Frau Beatrix und unseren zwei Kindern Juliette und Marius, die mich dabei unterstützten, meinen ganzen Tagesablauf dem Buchprojekt C++11 unterzuordnen.
Viel konstruktive Kritik zu der ersten Auflage dieses Buch habe ich durch die C++-Community erfahren. Vielen Dank insbesondere an Haluk Erce Rodopman, Luc Deknock, Titus von Boxberg, Norbert Eichenseher und Stephan Leibbrandt.
Ich danke der Lektoratsleiterin Ariane Hesse und der Lektorin Alexandra Follenius. Dank ihnen hat mein Buch beim O’Reilly Verlag eine neue und dauerhafte Heimat gefunden.
Auf meiner Homepage www.grimm-jaud.de finden Sie eine detaillierte Liste meiner Errata. Denn wenn mich die erste Auflage des Buchs etwas gelehrt hat, dann die Einsicht, dass diese Seite leider notwendig ist.
Für Anregungen, Verbesserungen, Kritiken, positiv wie negativ, können Sie mich direkt unter meiner E-Mail-Adresse erreichen: