@ü.li:Listing 1: Automatische Typableitung mit auto @li: 1 #include 2 3 int myAdd(int a,int b){ return a+b; } 4 5 int main(){ 6 7 // int-value 8 int i= 5; // explicit 9 auto i1= 5; // auto 10 11 // reference to an int 12 int& b= i; // explicit 13 auto& b1= i; // auto 14 15 // pointer to a function 16 int (*add)(int,int)= myAdd; // explicit 17 auto add1= myAdd; // auto 18 19 // iterator 20 std::vector vec; 21 for (std::vector::iterator it= vec.begin(); it != vec.end(); ++it){} 22 for (auto it1= vec.begin(); it1 != vec.end(); ++it1) {} 23 24 } @ü.li:Listing 2: Undefiniertes Verhalten @li: 1 #include 2 #include 3 4 struct T1 {}; 5 6 int n; 7 8 int main(){ 9 int n; 10 std::string s; 11 T1 t1; 12 13 std::cout << "::n " << ::n << std::endl; 14 std::cout << "n: " << n << std::endl; 15 std::cout << "s: " << s << std::endl; 16 } @ü.li:Listing 3: Initialisieren erzwingen @li: 1 #include 2 #include 3 4 struct T1 {}; 5 6 auto n= 0; 7 8 int main(){ 9 10 auto n= 0; 11 auto s=""s; 12 auto t1= T1(); 13 14 std::cout << "::n " << ::n << std::endl; 15 std::cout << "n: " << n << std::endl; 16 std::cout << "s: " << s << std::endl; 17 std::cout << "T2().mem: " << T2().mem << std::endl; 18 19 } @ü.li:Listing 4: Automatische Refaktorierung @li: 1 #include 2 #include 3 4 int main(){ 5 6 std::cout << std::endl; 7 8 auto a= 5; 9 auto b= 10; 10 auto sum= a * b * 3; 11 auto res= sum + 10; 12 std::cout << "typeid(res).name(): " << typeid(res).name() << std::endl; 13 14 auto a2= 5; 15 auto b2= 10.5; 16 auto sum2= a2 * b2 * 3; 17 auto res2= sum2 * 10; 18 std::cout << "typeid(res2).name(): " << typeid(res2).name() << std::endl; 19 20 auto a3= 5; 21 auto b3= 10; 22 auto sum3= a3 * b3 * 3.1f; 23 auto res3= sum3 * 10; 24 std::cout << "typeid(res3).name(): " << typeid(res3).name() << std::endl; 25 26 std::cout << std::endl; 27 28 } @ü.li:Listing 5: Vereinheitlichte Initialisierung mit geschweiften Klammern @li: 1 #include 2 #include 3 #include 4 5 class Array{ 6 public: 7 Array(): myData{1,2,3,4,5}{} 8 private: 9 int myData[5]; 10 }; 11 12 class MyClass{ 13 public: 14 int x; 15 double y; 16 }; 17 18 class MyClass2{ 19 public: 20 MyClass2(int fir, double sec):x{fir},y{sec} {}; 21 private: 22 int x; 23 double y; 24 }; 25 26 int main(){ 27 28 int intArray[]= {1,2,3,4,5}; 29 std::vector intArray1{1,2,3,4,5}; 30 std::map myMap{{"Scott",1976}, {"Dijkstra",1972}}; 31 32 const float* pData= new const float[3]{1.1,2.2,3.3}; 33 34 Array arr; 35 36 int i{}; // i ist 0 37 std::string s{}; // s ist "" 38 std::vector v{}; // v ist der leere Vektor 39 double d{}; // d ist 0.0 40 41 MyClass myClass{2011,3.14}; 42 MyClass myClass1= {2011,3.14}; 43 44 MyClass2 myClass2{2011,3.14}; 45 MyClass2 myClass3= {2011,3.14}; 46 47 } @ü.li:Listing 6: Verengung verhindern @li: 1 #include 2 int main(){ 3 4 char c1{999}; 5 char c2= {999}; 6 std::cout << "c1: " << c1 << std::endl; 7 std::cout << "c2: " << c2 << std::endl; 8 9 int i1{3.14}; 10 int i2= {3.14}; 11 std::cout << "i1: " << i1 << std::endl; 12 std::cout << "i2: " << i2 << std::endl; 13 14 char c3{5}; 15 std::cout << "c3: " << c3 << std::endl; 16 17 } @ü.li:Listing 7: Klassische Aufzählungstypen @li: 1 #include 2 3 int main(){ 4 5 std::cout << std::endl; 6 7 enum Colour{red= 0,green= 2,blue}; 8 9 std::cout << "red: " << red << std::endl; 10 std::cout << "green: " << green << std::endl; 11 std::cout << "blue: " << blue << std::endl; 12 13 int red2= red; 14 15 std::cout << "red2: " << red2 << std::endl; 16 17 // int red= 5; ERROR 18 19 } @ü.li:Listing 8: Streng typisierte Aufzählungstypen @li: 1 #include 2 #include 3 4 enum struct Colour0: bool{ 5 red, // 0 6 blue // 1 7 }; 8 9 enum Colour1{ 10 red= -5, 11 blue, // -4 12 green // -3 13 }; 14 15 enum struct Colour2: char{ 16 red= 100, 17 blue, // 101 18 green // 102 19 }; 20 21 enum class Colour3: long long int{ 22 red= std::numeric_limits::min() 23 blue, // std::numeric_limits::min() + 1 24 green // std::numeric_limits::min() + 2 25 }; 26 27 int main(){ 28 29 std::cout << std::endl; 30 31 std::cout << "sizeof(Colour0)= " << sizeof(Colour0) << std::endl; 32 std::cout << "sizeof(Colour1)= " << sizeof(Colour1) << std::endl; 33 std::cout << "sizeof(Colour2)= " << sizeof(Colour2) << std::endl; 34 std::cout << "sizeof(Colour3)= " << sizeof(Colour3) << std::endl; 35 36 std::cout << std::endl; 37 38 std::cout << "Colour0::red: " << static_cast(Colour0::red) << std::endl; 39 std::cout << "red: " << red << std::endl; 40 std::cout << "Colour2::red: " << static_cast(Colour2::red) << std::endl; 41 std::cout << "Colour3::red: " << static_cast(Colour3::red) << std::endl; 42 43 std::cout << std::endl; 44 45 } @ü.li:Listing 9: Die Zahl 0 @li: 1 #include 2 #include 3 4 int main(){ 5 6 std::cout << std::endl; 7 8 int a= 0; 9 int* b= 0; 10 auto c= 0; 11 std::cout << typeid(c).name() << std::endl; 12 13 auto res= a+b+c; 14 std::cout << "res: " << res << std::endl; 15 std::cout << typeid(res).name() << std::endl; 16 17 std::cout << std::endl; 18 19 } @ü.li:Listing 10: Das Makro NULL @li 1 :#include 2 #include 3 4 std::string overloadTest(int){ 5 return "int"; 6 } 7 8 std::string overloadTest(long int){ 9 return "long int"; 10 } 11 12 int main(){ 13 14 std::cout << std::endl; 15 16 int a= NULL; 17 int* b= NULL; 18 auto c= NULL; 19 20 std::cout << "overloadTest(NULL)= " << overloadTest(NULL) << std::endl; 21 22 std::cout << std::endl; 23 24 } @ü.li:Listing 11: nullptr @li: 1 #include 2 #include 3 4 std::string overloadTest(char*){ 5 return "char*"; 6 } 7 8 std::string overloadTest(long int){ 9 return "long int"; 10 } 11 12 int main(){ 13 14 std::cout << std::endl; 15 16 long int* pi = nullptr; 17 // long int i= nullptr; // ERROR 18 auto nullp= nullptr; // type std::nullptr_t 19 20 bool b = nullptr; 21 std::cout << std::boolalpha << "b: " << b << std::endl; 22 auto val= 5; 23 if ( nullptr < &val ){ std::cout << "nullptr < &val" << std::endl; } 24 25 // calls char* 26 std::cout << "overloadTest(nullptr)= " << overloadTest(nullptr)<< std::endl; 27 28 std::cout << std::endl; 29 30 } @ü.li:Listing 12: Nullzeiger in generischem Code @li: 1 #include 2 3 template 4 void functionTemplate(P p){ 5 int* a= p; 6 } 7 8 int main(){ 9 int* a= 0; 10 int* b= NULL; 11 int* c= nullptr; 12 13 functionTemplate(0); 14 functionTemplate(NULL); 15 functionTemplate(nullptr); 16 } @ü.li:Listing 13: Typsichere Arithmetik @li: 1 #include 2 #include 3 4 using namespace Distance::Unit; 5 6 int main(){ 7 8 std:: cout << std::endl; 9 10 auto work= 63.0_km; 11 auto workPerDay= 2 * work; 12 auto abbrevationToWork= 5400.0_m; 13 auto workout= 2 * 1600.0_m; 14 auto shopping= 2 * 1200.0_m; 15 16 auto distPerWeek1= 4*workPerDay-3*abbrevationToWork+ workout+ shopping; 17 auto distPerWeek2= 4*workPerDay-3*abbrevationToWork+ 2*workout; 18 auto distPerWeek3= 4*workout + 2*shopping; 19 auto distPerWeek4= 5*workout + shopping; 20 21 std::cout << "distPerWeek1: " << distPerWeek1 << std::endl; 22 23 auto averageDistance= getAverageDistance({distPerWeek1,distPerWeek2,distPerWeek3,distPerWeek4}); 24 std::cout<< "averageDistance: " << averageDistance << std::endl; 25 26 std::cout << std::endl; 27 28 } @ü.li:Listing 14: MyDistance-Klasse @li: 1 #ifndef DISTANCE_H 2 #define DISTANCE_H 3 4 #include 5 #include 6 7 namespace Distance{ 8 class MyDistance{ 9 public: 10 MyDistance(double i):m(i){} 11 12 friend MyDistance operator+(const MyDistance& a, const MyDistance& b){ 13 return MyDistance(a.m + b.m); 14 } 15 friend MyDistance operator-(const MyDistance& a,const MyDistance& b){ 16 return MyDistance(a.m - b.m); 17 } 18 19 friend MyDistance operator*(double m, const MyDistance& a){ 20 return MyDistance(m*a.m); 21 } 22 23 friend MyDistance operator/(const MyDistance& a, int n){ 24 return MyDistance(a.m/n); 25 } 26 27 friend std::ostream& operator<< (std::ostream &out, const MyDistance& myDist){ 28 out << myDist.m << " m"; 29 return out; 30 } 31 32 private: 33 double m; 34 35 }; 36 37 } 38 39 Distance::MyDistance getAverageDistance(std::initializer_list inList){ 40 auto sum= Distance::MyDistance{0.0}; 41 for (auto i: inList) sum = sum + i ; 42 return sum/inList.size(); 43 } 44 45 #endif @ü.li:Listing 15: Literal-Operatoren @li: 1 #ifndef UNIT_H 2 #define UNIT_H 3 4 #include 5 6 namespace Distance{ 7 8 namespace Unit{ 9 MyDistance operator "" _km(long double d){ 10 return MyDistance(1000*d); 11 } 12 MyDistance operator "" _m(long double m){ 13 return MyDistance(m); 14 } 15 MyDistance operator "" _dm(long double d){ 16 return MyDistance(d/10); 17 } 18 MyDistance operator "" _cm(long double c){ 19 return MyDistance(c/100); 20 } 21 } 22 } 23 24 #endif @ü.li:Listing 16: Built-in Literale @li: 1 #include 2 #include 3 4 using namespace std::literals::chrono_literals; 5 6 int main(){ 7 8 std::cout << std::endl; 9 10 auto schoolHour= 45min; 11 12 auto shortBreak= 300s; 13 auto longBreak= 0.25h; 14 15 auto schoolWay= 15min; 16 auto homework= 2h; 17 18 auto schoolDayInSeconds= 2*schoolWay + 6 * schoolHour + 4 * shortBreak + longBreak + homework; 19 20 std::cout << "School day in seconds: " << schoolDayInSeconds.count() << std::endl; 21 22 std::chrono::duration> schoolDayInHours = schoolDayInSeconds; 23 std::cout << "School day in hours: " << schoolDayInHours.count() << std::endl; 24 25 std::cout << std::endl; 26 27 }