C++11 und c++14

Holger Jakobs
Holger Jakobsfreelance IT developer, project manager, translator and trainer um freelancer
C++11 und C++14 
Was bringen die neuen Standards? 
Holger Jakobsholger@jakobs.com – http://plausibolo.de
kurze Geschichte von C++ 
●Erfinder von C++ ist BjarneStroustrup 
●1979: C with Classes 
●1984: Umbenennung in C++ 
●1985: C++ 1.0 
●1989: C++ 2.0 
●1998: ISO C++ 
●2011: ISO C++11 
●2014: ISO C++14
Haupt-Eigenschaften 
●Code läuft als nativer Code direkt auf Hardware – keine virtuelle Maschine. 
●Code ist typsicher (weitestgehend, Ausnahmen beruhen auf C-Kompatibilität). 
●Destruktoren räumen den Speicher auf, keine Garbage Collection – denn Speicher ist nicht alles! 
●Objekte werden auf dem Stack erzeugt, nicht ständig mit new auf dem Heap!
Haupt-Eigenschaften 
●C++ gehört niemandem. 
●Es gibt eine umfangreiche Standardbibliothek, aber ihr fehlen noch wesentliche Dinge: 
–GUI-Programmierung (große Auswahl vorhanden: Qt, Tk, Gtk+, wxWidgets, … – aber kein Standard) 
–XML-Bibliothek 
–Unterstützung für Web-Programmierung
C++ 1.0 - 1985 
Hauptsächliche Neuigkeiten: 
●Overloading von Funktionen/Methoden 
●virtuelle Funktionen, virtual 
●Referenzen als Ergänzung zu Zeigern 
●echte Konstanten 
●Kommentare mit //
C++ 2.0 - 1989 
Hauptsächliche Neuigkeiten: 
●Mehrfachvererbung 
●abstrakte Klassen 
●statische Methoden 
●Schlüsselwort protected
ISO C++98 
●STL wurde Teil der C++ Standard Library 
●Deklaration von lokalen Laufvariablen in for 
●Typecasts: a = double (y); 
●Weglassen des .h beim #include: #include <iostream> 
●Namespaces, Datentypen string bool 
●stringstream statt strstream 
●eine Reihe neuer Schlüsselwörter
ISO C++11 
●Eigentlich war C++0x geplant … 
●Ziele (Stroustrup) 
–Make C++ a better language for systems programming and library building 
–Make C++ easier to teach and learn 
●Stroustrup: The range of abstractions that C++ can express elegantly, flexibly, and at zero costs compared to hand-crafted specialized code has greatly increased.
Neuerungen in ISO C++11 
●Rvalues und Move Semantics 
●echte enum-Typen 
●long long (mind. 64 bit) 
●generalisierte konstante Ausdrücke constexpr 
●Nullpointer nullptr 
●Kontrolle durch default delete 
●Typherleitung durch auto 
●Initialisierung durch { … }
Neuerungen in ISO C++11 
●static_assert 
●raw Strings 
●Lambda-Ausdrücke 
●reguläre Ausdrücke (bei g++ erst ab 4.9) 
●Threads 
●variabel lange Parameterlisten für Templates 
●„smart“ pointers 
●Zeitbibliothek chrono
Rvalue und Move-Semantics 
●Kopierkonstruktor X(const X&); 
●neu: Move-Konstruktor X(X&&); 
●Zuweisung X& operator=(const X&); 
●neu: Move-Zuweisung X& operator=(X&&); 
●Gründe hierfür: 
–Speicherplatz sparen 
–Performance verbessern 
–Rückgabemöglichkeit ohne Zeiger
Rvalue und Move-Semantics 
●siehe matrix-move.cpp 
●Was man nicht machen darf: mit new neuen Speicher in operator+ holen und dann eine Referenz darauf zurückgeben. 
●Grund: Wer ist für die Dereferenzierung verantwortlich? Was passiert, wenn vor der Rückgabe eine Exception geworfen wird? 
●Also: Nirgendwo new machen, wo das zugehörige delete nicht dabei ist.
Rvalue und Move-Semantics 
●Compiler erzeugt automatisch: 
–default-Konstruktor 
–copy-Konstruktor und copy-Zuweisung 
–move-Konstruktor und move-Zuweisung 
–Destruktor 
●Wenn man nur eines davon selbst definiert, fehlen die anderen! 
●Lösung (hier am Beispiel des move-Konstruktors): X(X&&) = default;
Rvalue und Move-Semantics 
●Woher weiß der Compiler, ob er move oder copy machen soll? 
●Bei Werterückgaben weiß er das. 
●sonst Hinweis geben mit std::move(x); template <typename T> void swap (T &a, T &b) { T tmp = std::move(a); a = std::move(b); b = std::move(tmp); }
Consider how to return a potentially large number of elements from a function. Here is a conventional C++98 function returning the indices of string matches: 
vector<int>* find_all (vector<string>& vs, const string& s) { vector<int>* res = new vector<int>; for (int i = 0; i < vs->size(); ++i) if (vs[i] == s) res->push_back(i); return res; } 
vector<int>* pvi = find_all(some_vec,"vindaloo"); for (vector<int>::iterator p = pvi->begin(); p!=pvi->end(); ++p) cout << *p << " is a matchn"; // … delete pvi; 
Quelle: http://www.informit.com/articles/article.aspx?p=2080042 
sonst: memory leak!
Move semantics allows a significant simplification: 
vector<int> find_all(vector<string>& vs, const string& s) { vector<int> res; for (int i = 0; i<vs.size(); ++i) if (vs[i] == s) res.push_back(i); return res; } 
for (int x: find_all(some_vec,"vindaloo")) cout << x << " is a matchn"; 
Auch die Wiedergabe ist viele einfacher! 
Natürlich kann es auch kein Memory Leak geben, denn es muss nichts mit delete freigegeben werden. 
move-Semantik
unique_ptr und shared_ptr 
●unique_ptr kann nicht kopiert werden. 
●Ihm gehört der Speicher, auf den er zeigt. 
●Geht er out of scope, gibt er den Speicher frei. 
●Eigentümerschaft kann übertragen werden. 
●shared_ptr kann mehrere Eigentümer haben. 
●Er hat einen Referenzzähler. 
●Geht der Zähler auf 0, wird der Speicher freigegeben.
weak_ptr 
●weak_ptr zeigt auf einen shared_ptr 
●Referenzzähler wird für weak_ptr nicht hochgezählt. 
●Daher kann das Objekt auch jederzeit gelöscht werden. 
●Vor Zugriff muss er in einen shared_ptr umgewandelt werden mittels lock()
Was sollten C-Programmierer sofort vergessen? 
Eigentlich alles, was Stress macht bzw. gefährlich ist (buffer overflow): 
●Zeichenketten à la C, also char[] und char*, stattdessen string verwenden! 
●Alle Arrays, stattdessen Standardcontainer verwenden: array vector list deque forward_list set map 
●C-I/O wie printf() fprintf() fgets(), stattdessen iostream verwenden. 
●Zeiger zur Parameterübergabe oder Wertrückgabe, stattdessen const& und Move-Semantik verwenden
Neu in C++14 
C++14 ist nur ein Finetuning, nicht vergleichbar mit C++11 
void sort(Container& c); vector<string> vs {"Hello", "new", "World"}; sort(vs);// fine: vs is a Container 
template<Sortable Cont> void sort(Cont& container); vector<double> vec {1.2, 4.5, 0.5, -1.2}; list<int> lst {1, 3, 5, 4, 6, 8,2}; sort(vec);// OK: a vector is Sortablesort(lst); // Error at (this) point of use: // Sortable requires random access
Neu in C++14 
template<class T> constexpr T pi = T(3.1415926535897932385); 
//C++14, a variable template in usetemplate<typename T> T circular_area(T r) { return pi<T> * r * r; } 
double darea = circular_area(5.5); //uses pi<double> 
float farea = circular_area(5.5f); //uses pi<float> 
Template-Variablen sind nicht auf eingebaute Typen beschränkt. matrix<T>, complex<T> usw. gehen auch.
Danke für eure Zeit und Aufmerk- samkeit! 
Holger@Jakobs.com http://plausibolo.de
C++11 und c++14
1 von 23

Recomendados

SEROM 2018 - 11/14/17/20 - C++ gestern heute und morgen von
SEROM 2018 - 11/14/17/20 - C++ gestern heute und morgenSEROM 2018 - 11/14/17/20 - C++ gestern heute und morgen
SEROM 2018 - 11/14/17/20 - C++ gestern heute und morgenDr. Herwig Henseler
1.3K views37 Folien
Inter Prozedurale Zeigeranalyse von
Inter Prozedurale ZeigeranalyseInter Prozedurale Zeigeranalyse
Inter Prozedurale ZeigeranalyseTim Furche
410 views53 Folien
2010-JOGL-08-Torus-Knoten von
2010-JOGL-08-Torus-Knoten2010-JOGL-08-Torus-Knoten
2010-JOGL-08-Torus-KnotenJohannes Diemke
682 views18 Folien
OpenCL Grundlagen von
OpenCL GrundlagenOpenCL Grundlagen
OpenCL Grundlagenfg.informatik Universität Basel
3K views24 Folien
Einführung in minimale Spannbäume und deren Berechnung (Vortrag) von
Einführung in minimale Spannbäume und deren Berechnung (Vortrag)Einführung in minimale Spannbäume und deren Berechnung (Vortrag)
Einführung in minimale Spannbäume und deren Berechnung (Vortrag)Johannes Diemke
563 views13 Folien
BIT I WiSe 2014 | Basisinformationstechnologie I - 08: Programmiersprachen I von
BIT I WiSe 2014 | Basisinformationstechnologie I - 08: Programmiersprachen IBIT I WiSe 2014 | Basisinformationstechnologie I - 08: Programmiersprachen I
BIT I WiSe 2014 | Basisinformationstechnologie I - 08: Programmiersprachen IInstitute for Digital Humanities, University of Cologne
767 views46 Folien

Más contenido relacionado

Was ist angesagt?

TMQL tutorial - part 4 von
TMQL tutorial - part 4TMQL tutorial - part 4
TMQL tutorial - part 4Lutz Maicher
657 views34 Folien
Aufgaben Flächenberechnung von
Aufgaben FlächenberechnungAufgaben Flächenberechnung
Aufgaben Flächenberechnungoberprima
1.5K views8 Folien
Garbage Collection von
Garbage CollectionGarbage Collection
Garbage CollectionTim Furche
721 views69 Folien
JSTF-Workshop Teil 1 von
JSTF-Workshop Teil 1JSTF-Workshop Teil 1
JSTF-Workshop Teil 1Tobias Adam
448 views52 Folien
Polynomdivision von
PolynomdivisionPolynomdivision
Polynomdivisionoberprima
1.2K views9 Folien
Das lustige Überlebenshandbuch für JavaScript von
Das lustige Überlebenshandbuch für JavaScriptDas lustige Überlebenshandbuch für JavaScript
Das lustige Überlebenshandbuch für JavaScriptBenjamin Schmid
1.2K views56 Folien

Was ist angesagt?(18)

TMQL tutorial - part 4 von Lutz Maicher
TMQL tutorial - part 4TMQL tutorial - part 4
TMQL tutorial - part 4
Lutz Maicher657 views
Aufgaben Flächenberechnung von oberprima
Aufgaben FlächenberechnungAufgaben Flächenberechnung
Aufgaben Flächenberechnung
oberprima1.5K views
Garbage Collection von Tim Furche
Garbage CollectionGarbage Collection
Garbage Collection
Tim Furche721 views
JSTF-Workshop Teil 1 von Tobias Adam
JSTF-Workshop Teil 1JSTF-Workshop Teil 1
JSTF-Workshop Teil 1
Tobias Adam448 views
Polynomdivision von oberprima
PolynomdivisionPolynomdivision
Polynomdivision
oberprima1.2K views
Das lustige Überlebenshandbuch für JavaScript von Benjamin Schmid
Das lustige Überlebenshandbuch für JavaScriptDas lustige Überlebenshandbuch für JavaScript
Das lustige Überlebenshandbuch für JavaScript
Benjamin Schmid1.2K views
Schneller Einstieg in OpenCL mit C++ Bindings von Patrick Charrier
Schneller Einstieg in OpenCL mit C++ BindingsSchneller Einstieg in OpenCL mit C++ Bindings
Schneller Einstieg in OpenCL mit C++ Bindings
Patrick Charrier810 views
Aufgaben Flächenberechnung von oberprima
Aufgaben FlächenberechnungAufgaben Flächenberechnung
Aufgaben Flächenberechnung
oberprima995 views
Integralrechnung von oberprima
IntegralrechnungIntegralrechnung
Integralrechnung
oberprima661 views
Übersetzen alter Arcade-Spiele in JavaScript von norbert_kehrer
Übersetzen alter Arcade-Spiele in JavaScriptÜbersetzen alter Arcade-Spiele in JavaScript
Übersetzen alter Arcade-Spiele in JavaScript
norbert_kehrer1.4K views
07 abiturvorbereitung analysis newton von PaulFestl
07 abiturvorbereitung analysis newton07 abiturvorbereitung analysis newton
07 abiturvorbereitung analysis newton
PaulFestl18 views
Java Streams und Lambdas von Nane Kratzke
Java Streams und LambdasJava Streams und Lambdas
Java Streams und Lambdas
Nane Kratzke3.7K views

Destacado

Razones por las cuales estudiamos licenciatura en pedagogia infantil von
Razones por las cuales estudiamos licenciatura en pedagogia infantilRazones por las cuales estudiamos licenciatura en pedagogia infantil
Razones por las cuales estudiamos licenciatura en pedagogia infantilMerly Gonzalez
559 views4 Folien
Avance del multimedio von
Avance del multimedioAvance del multimedio
Avance del multimediojeycoga
277 views7 Folien
La cabellera von
La cabelleraLa cabellera
La cabelleralmorenoh
291 views8 Folien
Presentacion de culturismo von
Presentacion de culturismoPresentacion de culturismo
Presentacion de culturismoDarracha
348 views11 Folien
Presentacionins von
PresentacioninsPresentacionins
PresentacioninsCEIP Joan Veny I Clar
456 views20 Folien
Imagen von
ImagenImagen
ImagenESTRELLITABAILARINA
344 views15 Folien

Destacado(20)

Razones por las cuales estudiamos licenciatura en pedagogia infantil von Merly Gonzalez
Razones por las cuales estudiamos licenciatura en pedagogia infantilRazones por las cuales estudiamos licenciatura en pedagogia infantil
Razones por las cuales estudiamos licenciatura en pedagogia infantil
Merly Gonzalez559 views
Avance del multimedio von jeycoga
Avance del multimedioAvance del multimedio
Avance del multimedio
jeycoga277 views
La cabellera von lmorenoh
La cabelleraLa cabellera
La cabellera
lmorenoh291 views
Presentacion de culturismo von Darracha
Presentacion de culturismoPresentacion de culturismo
Presentacion de culturismo
Darracha348 views
Propuesta a los estudiantes medio ambiente (1) von Aleja Torres
Propuesta a los estudiantes medio ambiente (1)Propuesta a los estudiantes medio ambiente (1)
Propuesta a los estudiantes medio ambiente (1)
Aleja Torres532 views
Bereich Arbeitsschutz von BITE GmbH
Bereich ArbeitsschutzBereich Arbeitsschutz
Bereich Arbeitsschutz
BITE GmbH412 views
Présentation corpo 2015 von algodesign
Présentation corpo 2015Présentation corpo 2015
Présentation corpo 2015
algodesign401 views
Santa maría de la esperanza von marsegundo
Santa maría de la esperanzaSanta maría de la esperanza
Santa maría de la esperanza
marsegundo303 views

Similar a C++11 und c++14

Schulung: Einführung in das GPU-Computing mit NVIDIA CUDA von
Schulung: Einführung in das GPU-Computing mit NVIDIA CUDASchulung: Einführung in das GPU-Computing mit NVIDIA CUDA
Schulung: Einführung in das GPU-Computing mit NVIDIA CUDAJörn Dinkla
1.3K views237 Folien
Der C++ Standard von
Der C++ StandardDer C++ Standard
Der C++ Standardtutego
675 views11 Folien
Übungsaufgaben von
ÜbungsaufgabenÜbungsaufgaben
Übungsaufgabenmaikinger
277 views8 Folien
Übungsaufgaben SS2010 von
Übungsaufgaben SS2010Übungsaufgaben SS2010
Übungsaufgaben SS2010maikinger
254 views8 Folien
Go - Googles Sprache für skalierbare Systeme von
Go - Googles Sprache für skalierbare SystemeGo - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare SystemeFrank Müller
927 views73 Folien
GPU-Computing mit CUDA und OpenCL in der Praxis von
GPU-Computing mit CUDA und OpenCL in der PraxisGPU-Computing mit CUDA und OpenCL in der Praxis
GPU-Computing mit CUDA und OpenCL in der PraxisJörn Dinkla
2.1K views75 Folien

Similar a C++11 und c++14(20)

Schulung: Einführung in das GPU-Computing mit NVIDIA CUDA von Jörn Dinkla
Schulung: Einführung in das GPU-Computing mit NVIDIA CUDASchulung: Einführung in das GPU-Computing mit NVIDIA CUDA
Schulung: Einführung in das GPU-Computing mit NVIDIA CUDA
Jörn Dinkla1.3K views
Der C++ Standard von tutego
Der C++ StandardDer C++ Standard
Der C++ Standard
tutego 675 views
Übungsaufgaben von maikinger
ÜbungsaufgabenÜbungsaufgaben
Übungsaufgaben
maikinger277 views
Übungsaufgaben SS2010 von maikinger
Übungsaufgaben SS2010Übungsaufgaben SS2010
Übungsaufgaben SS2010
maikinger254 views
Go - Googles Sprache für skalierbare Systeme von Frank Müller
Go - Googles Sprache für skalierbare SystemeGo - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare Systeme
Frank Müller927 views
GPU-Computing mit CUDA und OpenCL in der Praxis von Jörn Dinkla
GPU-Computing mit CUDA und OpenCL in der PraxisGPU-Computing mit CUDA und OpenCL in der Praxis
GPU-Computing mit CUDA und OpenCL in der Praxis
Jörn Dinkla2.1K views
Differenzial Analyse in der Praxis (Florian Walther) von GEEKcon
Differenzial Analyse in der Praxis (Florian Walther)Differenzial Analyse in der Praxis (Florian Walther)
Differenzial Analyse in der Praxis (Florian Walther)
GEEKcon1.8K views
Skalierbare Anwendungen mit Google Go von Frank Müller
Skalierbare Anwendungen mit Google GoSkalierbare Anwendungen mit Google Go
Skalierbare Anwendungen mit Google Go
Frank Müller765 views
SchüLerscript Imperative Programmierung Mit Der Delphi Konsole von guestcf99
SchüLerscript   Imperative Programmierung Mit Der Delphi KonsoleSchüLerscript   Imperative Programmierung Mit Der Delphi Konsole
SchüLerscript Imperative Programmierung Mit Der Delphi Konsole
guestcf991.4K views
Multi-GPU-Computing: Eins, zwei, drei, ganz viele von Jörn Dinkla
Multi-GPU-Computing: Eins, zwei, drei, ganz vieleMulti-GPU-Computing: Eins, zwei, drei, ganz viele
Multi-GPU-Computing: Eins, zwei, drei, ganz viele
Jörn Dinkla1.9K views
Java und Go im Vergleich von QAware GmbH
Java und Go im VergleichJava und Go im Vergleich
Java und Go im Vergleich
QAware GmbH905 views
Scalaz introduction for Java programmers von Bernhard Huemer
Scalaz introduction for Java programmersScalaz introduction for Java programmers
Scalaz introduction for Java programmers
Bernhard Huemer884 views
nagiosplugin - eine Python-Biblioth­ek für Monitoring-Plug­ins von Christian Kauhaus
nagiosplugin - eine Python-Biblioth­ek für Monitoring-Plug­ins nagiosplugin - eine Python-Biblioth­ek für Monitoring-Plug­ins
nagiosplugin - eine Python-Biblioth­ek für Monitoring-Plug­ins
Christian Kauhaus1.9K views
Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program... von gedoplan
Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program...Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program...
Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program...
gedoplan86 views
Lösungsorientierte Fehlerbehandlung von roskakori
Lösungsorientierte FehlerbehandlungLösungsorientierte Fehlerbehandlung
Lösungsorientierte Fehlerbehandlung
roskakori483 views
Eine Reise durch den PostgreSQL Optimizer von psoo1978
Eine Reise durch den PostgreSQL OptimizerEine Reise durch den PostgreSQL Optimizer
Eine Reise durch den PostgreSQL Optimizer
psoo1978751 views
C/ C++ for Notes & Domino Developers von Ulrich Krause
C/ C++ for Notes & Domino DevelopersC/ C++ for Notes & Domino Developers
C/ C++ for Notes & Domino Developers
Ulrich Krause9.9K views
FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA von Marcus Riemer
FH Wedel - SS11 - Seminar - Marcus Riemer - LEDAFH Wedel - SS11 - Seminar - Marcus Riemer - LEDA
FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA
Marcus Riemer1K views

C++11 und c++14

  • 1. C++11 und C++14 Was bringen die neuen Standards? Holger Jakobsholger@jakobs.com – http://plausibolo.de
  • 2. kurze Geschichte von C++ ●Erfinder von C++ ist BjarneStroustrup ●1979: C with Classes ●1984: Umbenennung in C++ ●1985: C++ 1.0 ●1989: C++ 2.0 ●1998: ISO C++ ●2011: ISO C++11 ●2014: ISO C++14
  • 3. Haupt-Eigenschaften ●Code läuft als nativer Code direkt auf Hardware – keine virtuelle Maschine. ●Code ist typsicher (weitestgehend, Ausnahmen beruhen auf C-Kompatibilität). ●Destruktoren räumen den Speicher auf, keine Garbage Collection – denn Speicher ist nicht alles! ●Objekte werden auf dem Stack erzeugt, nicht ständig mit new auf dem Heap!
  • 4. Haupt-Eigenschaften ●C++ gehört niemandem. ●Es gibt eine umfangreiche Standardbibliothek, aber ihr fehlen noch wesentliche Dinge: –GUI-Programmierung (große Auswahl vorhanden: Qt, Tk, Gtk+, wxWidgets, … – aber kein Standard) –XML-Bibliothek –Unterstützung für Web-Programmierung
  • 5. C++ 1.0 - 1985 Hauptsächliche Neuigkeiten: ●Overloading von Funktionen/Methoden ●virtuelle Funktionen, virtual ●Referenzen als Ergänzung zu Zeigern ●echte Konstanten ●Kommentare mit //
  • 6. C++ 2.0 - 1989 Hauptsächliche Neuigkeiten: ●Mehrfachvererbung ●abstrakte Klassen ●statische Methoden ●Schlüsselwort protected
  • 7. ISO C++98 ●STL wurde Teil der C++ Standard Library ●Deklaration von lokalen Laufvariablen in for ●Typecasts: a = double (y); ●Weglassen des .h beim #include: #include <iostream> ●Namespaces, Datentypen string bool ●stringstream statt strstream ●eine Reihe neuer Schlüsselwörter
  • 8. ISO C++11 ●Eigentlich war C++0x geplant … ●Ziele (Stroustrup) –Make C++ a better language for systems programming and library building –Make C++ easier to teach and learn ●Stroustrup: The range of abstractions that C++ can express elegantly, flexibly, and at zero costs compared to hand-crafted specialized code has greatly increased.
  • 9. Neuerungen in ISO C++11 ●Rvalues und Move Semantics ●echte enum-Typen ●long long (mind. 64 bit) ●generalisierte konstante Ausdrücke constexpr ●Nullpointer nullptr ●Kontrolle durch default delete ●Typherleitung durch auto ●Initialisierung durch { … }
  • 10. Neuerungen in ISO C++11 ●static_assert ●raw Strings ●Lambda-Ausdrücke ●reguläre Ausdrücke (bei g++ erst ab 4.9) ●Threads ●variabel lange Parameterlisten für Templates ●„smart“ pointers ●Zeitbibliothek chrono
  • 11. Rvalue und Move-Semantics ●Kopierkonstruktor X(const X&); ●neu: Move-Konstruktor X(X&&); ●Zuweisung X& operator=(const X&); ●neu: Move-Zuweisung X& operator=(X&&); ●Gründe hierfür: –Speicherplatz sparen –Performance verbessern –Rückgabemöglichkeit ohne Zeiger
  • 12. Rvalue und Move-Semantics ●siehe matrix-move.cpp ●Was man nicht machen darf: mit new neuen Speicher in operator+ holen und dann eine Referenz darauf zurückgeben. ●Grund: Wer ist für die Dereferenzierung verantwortlich? Was passiert, wenn vor der Rückgabe eine Exception geworfen wird? ●Also: Nirgendwo new machen, wo das zugehörige delete nicht dabei ist.
  • 13. Rvalue und Move-Semantics ●Compiler erzeugt automatisch: –default-Konstruktor –copy-Konstruktor und copy-Zuweisung –move-Konstruktor und move-Zuweisung –Destruktor ●Wenn man nur eines davon selbst definiert, fehlen die anderen! ●Lösung (hier am Beispiel des move-Konstruktors): X(X&&) = default;
  • 14. Rvalue und Move-Semantics ●Woher weiß der Compiler, ob er move oder copy machen soll? ●Bei Werterückgaben weiß er das. ●sonst Hinweis geben mit std::move(x); template <typename T> void swap (T &a, T &b) { T tmp = std::move(a); a = std::move(b); b = std::move(tmp); }
  • 15. Consider how to return a potentially large number of elements from a function. Here is a conventional C++98 function returning the indices of string matches: vector<int>* find_all (vector<string>& vs, const string& s) { vector<int>* res = new vector<int>; for (int i = 0; i < vs->size(); ++i) if (vs[i] == s) res->push_back(i); return res; } vector<int>* pvi = find_all(some_vec,"vindaloo"); for (vector<int>::iterator p = pvi->begin(); p!=pvi->end(); ++p) cout << *p << " is a matchn"; // … delete pvi; Quelle: http://www.informit.com/articles/article.aspx?p=2080042 sonst: memory leak!
  • 16. Move semantics allows a significant simplification: vector<int> find_all(vector<string>& vs, const string& s) { vector<int> res; for (int i = 0; i<vs.size(); ++i) if (vs[i] == s) res.push_back(i); return res; } for (int x: find_all(some_vec,"vindaloo")) cout << x << " is a matchn"; Auch die Wiedergabe ist viele einfacher! Natürlich kann es auch kein Memory Leak geben, denn es muss nichts mit delete freigegeben werden. move-Semantik
  • 17. unique_ptr und shared_ptr ●unique_ptr kann nicht kopiert werden. ●Ihm gehört der Speicher, auf den er zeigt. ●Geht er out of scope, gibt er den Speicher frei. ●Eigentümerschaft kann übertragen werden. ●shared_ptr kann mehrere Eigentümer haben. ●Er hat einen Referenzzähler. ●Geht der Zähler auf 0, wird der Speicher freigegeben.
  • 18. weak_ptr ●weak_ptr zeigt auf einen shared_ptr ●Referenzzähler wird für weak_ptr nicht hochgezählt. ●Daher kann das Objekt auch jederzeit gelöscht werden. ●Vor Zugriff muss er in einen shared_ptr umgewandelt werden mittels lock()
  • 19. Was sollten C-Programmierer sofort vergessen? Eigentlich alles, was Stress macht bzw. gefährlich ist (buffer overflow): ●Zeichenketten à la C, also char[] und char*, stattdessen string verwenden! ●Alle Arrays, stattdessen Standardcontainer verwenden: array vector list deque forward_list set map ●C-I/O wie printf() fprintf() fgets(), stattdessen iostream verwenden. ●Zeiger zur Parameterübergabe oder Wertrückgabe, stattdessen const& und Move-Semantik verwenden
  • 20. Neu in C++14 C++14 ist nur ein Finetuning, nicht vergleichbar mit C++11 void sort(Container& c); vector<string> vs {"Hello", "new", "World"}; sort(vs);// fine: vs is a Container template<Sortable Cont> void sort(Cont& container); vector<double> vec {1.2, 4.5, 0.5, -1.2}; list<int> lst {1, 3, 5, 4, 6, 8,2}; sort(vec);// OK: a vector is Sortablesort(lst); // Error at (this) point of use: // Sortable requires random access
  • 21. Neu in C++14 template<class T> constexpr T pi = T(3.1415926535897932385); //C++14, a variable template in usetemplate<typename T> T circular_area(T r) { return pi<T> * r * r; } double darea = circular_area(5.5); //uses pi<double> float farea = circular_area(5.5f); //uses pi<float> Template-Variablen sind nicht auf eingebaute Typen beschränkt. matrix<T>, complex<T> usw. gehen auch.
  • 22. Danke für eure Zeit und Aufmerk- samkeit! Holger@Jakobs.com http://plausibolo.de