https://en.cppreference.com/w/
https://en.cppreference.com/w/cpp/language/history
- K&R C → ISO C 90 → (C95) → C99 (→ C11 → C18 …)
- "C with classes" → ISO C++98 → (C++03) → C++11 → C++14 (→ C++17 → C++20 … )
- ISO C, ISO C++, POSIX, …
- C: "Trust the programmer"
- C++: "You don't pay for what you don't need"
- Fluch und Segen: Kompatibilität (zu C und zu älteren C++-Versionen)
https://en.cppreference.com/w/cpp/language/translation_phases
-
de jure 9 Schritte/"Phases", de facto können sie zusammengefasst werden ("as-if" rule)
-
Praxis, meist folgende 4 Schritte
- "Präprozessor" (.hh+.cc → .ii) – Phases 1…4
- Compiler ( → .s) – Phase 7
- "translation unit"
- Template-Instanziierungen (implizit, explizit) – Phase 8
- Assembler (→ .o)
- Linker (→ .so, .a, executable) – Phase 9
- "linkage"
- Link-time optimization (LTO)
-
Exkurs: Wie werden C/C++-Programme üblicherweise gelinkt?
-
identifier vs. names – https://en.cppreference.com/w/cpp/language/identifiers#Names
- Reserved identifier: keywords,
…__…,_X…,::_…_ - Nicht-ASCII-Zeichen sind möglich (nicht alle), aber unüblich
- "Ungarische Notation" ist unüblich und i.A. misbilligt (mag aber in manchen Libs andere Konventionen geben)
- Reserved identifier: keywords,
-
declaration vs. definition
- One-definition rule – Ausnahmen ("inline") – https://en.cppreference.com/w/cpp/language/definition
-
Sichtbarkeit, Name Lookup
-
object vs. function
- Lebensdauer (storage duration)
-
Value categories
- rvalue, lvalue, prvalue, glvalue, xvalue
- https://en.cppreference.com/w/cpp/language/value_category#prvalue
-
Beobachtbares Verhalten – https://en.cppreference.com/w/cpp/language/as_if
-
Auswertungsreihenfolge (evaluation order, sequence order)
- https://en.cppreference.com/w/cpp/language/eval_order
- "sequence points" (vor C++11)
- "sequenced-before" (seit C++11)
- Regeln änder(te)n des öfteren. Nicht "zu schlau" coden!
-
Implementation-defined behavior, unspecified behavior, undefined behavior
- https://en.cppreference.com/w/cpp/language/ub
- UB macht das gesamte Programm ungültig!
-
RAII
- Zur sicheren Verwaltung aller Ressourcen, nicht nur von Speicher
- exception-safety
https://en.cppreference.com/w/cpp/language/type
-
incomplete types vs. complete types
-
Nullzeiger
-
Pointer vs. Array —
const char* p = "Foobar":vs.const char a[] = "Foobar"; -
Pointer vs. References
-
type qualifiers
const,volatile- const-pointer vs. pointer-to-const
mutable
-
constexpr – https://en.cppreference.com/w/cpp/language/constexpr
-
Zeichenliterale und Zeichenkettenliterale
Typ Literal C++-String-Typ Literal Bemerkung char'f'"foo"std::string"foo"swchar_tL'f'L"foo"std::wstringL"foo"s"wide strings", Wie in C char16_tu'f'u"foo"std::u16stringu"foo"sUTF-16 char32_tU'f'U"foo"std::u32stringU"foo"sUTF-32 -
Und UTF-8?
u8"foo"— char-Array, aber garantiert UTF-8, seit C++11u8'f'— seit C++17, nur 0x00…0x7f- seit C++20:
char8_t– wieunsigned char, aber eigener Datentyp.std::u8string - de-factor einfach
charundstd::stringin Verwendung
-
"raw strings":
const char* s = R"--(foo bar)--";
-
-
Funktionen und Funktionszeiger
double (*mean)(double, double) = &arithmetic_mean;- https://en.cppreference.com/w/cpp/language/pointer#Pointers_to_functions
-
komplexe Deklarationen:
char *(*(**foo[][8])())[];http://unixwiz.net/techtips/reading-cdecl.html- Lösung:
typedef using declaration typedef unsigned long int ulong;using ulong = unsigned long int;typedef void (*func_t)(int, int);using func_t = void (*)(int, int);typedef int (Foo::*Bar)(int);using Bar = int (Foo::*)(int);❌ template <class T> Symbol = std::map<std::string, T>;
- Lösung:
-
Typ"umwandlungen":
- implizit vs. explizit – https://en.cppreference.com/w/cpp/language/implicit_conversion
- Promotion, Conversion
- werterhaltend vs. verlustbehaftet
- vordefiniert (built-in) vs. benutzerdefiniert
static_cast,dynamic_cast,const_cast,reinterpret_cast, Function-Style casts und C-Style casts:int i=(int)3.14;- Umwandlungen von Zeigertypen
char*→const char*✅char**→const char**❌
struct,class,union,enum- Member (data member, member functions, virtual member functions)
constMember, Referenzen als Member
- Speicherlayout
- Empty base optimization – https://en.cppreference.com/w/cpp/language/ebo
- Konstruktoren, Destruktoren, Operatoren
- Copy-C'tor, Move-C'tor, "Rule of 3", RAII,
explicit =default,=deleteoperator()- Konvertierungsoperatoren
- Copy-C'tor, Move-C'tor, "Rule of 3", RAII,
- Vererbung
- Mehrfachvererbung, "virtual base class"
- Abstrakte (Basis-)klassen
- Pointer to member
int T::*pm = &T::x; T t; t.*pm = 42;
- Unterschiede zu Klassen
- globaler Namensraum
- unbenannte / anonyme Namensräume
https://en.cppreference.com/w/cpp/language/lambda
- catch clause
- return type
- generic Lambdas (seit C++14)
https://en.cppreference.com/w/cpp/language/templates
- Klassentemplates, Funktionstemplates, Variablen-Template
- Aliastypes
- Type parameter, non-type parameter, template parameter
- variadic templates
- Templates statt Vererbung ("Compilezeit-Polymophie" statt Laufzeit-Polymorphie)
- Iteratorkonzept
- Halboffene Intervalle
- Iteratorkategorien https://en.cppreference.com/w/cpp/iterator
- Iterator-Adapter
- Reverse-Iterator
- Insert-Iterator
- Move-Iterator
std::basic_string<T>T=char,wchar_t,char16_t,char32_t- kann NUL characters
"Foo"s(seit C++14)- kein genormter Zeichensatz/Zeichenkodierung. UTF-8 ist üblich heute unter Unix
std::string_view(C++17) od.boost::string_view(C++11/14)
https://en.cppreference.com/w/cpp/container
- Heterogene Container:
std::vector<Base*>vs.std::vector< shared_ptr<Base> >vsboost::ptr_vector<Base>- Vererbung:
vector<Base>ist nicht verwandt mitvector<Derived>
https://en.cppreference.com/w/cpp/algorithm
- Ranges über Iteratoren
- Input-Range i.d.R. begrenzt (begin, end), Output i.d.R. unbegrenzt.