NPRG 041 Programování v C++ Programování v C David Bednárek Filip Zavoral
C vs. C++ � Vývoj ◦ ◦ ◦ ◦ � 1970 -3 1978 1983 1985 1998 1999 2011+ první verze C, společný vývoj s UNIXem, jádro v C Kerninghan, Ritchie: The C Programming Language Rick Mascitti: poprvé název C++ Stroustrup: The C++ Programming Language ISO/ANSI norma C++ ISO/ANSI norma C - 'C 99' C++11/14/17 � zásadní rozšíření jazyka - lambda, r-values, generic prog. , . . . Proč C v 21. století ◦ ◦ jádra OS, drivery, knihovny GPU, many-core embedded devices, 'pračky' údržba sw
C++ jako ostrá nadmnožina C. . . neboli co v C není � OOP ◦ classes, inheritance, member functions, constructors and destructors, virtual functions, access control, pointers to members, static members � Syntax ◦ templates, smart pointers, exceptions, references, overloading, default arguments, namespaces, new/delete, casting, friend, inline, RTTI, auto, lambda, rvalues, concepts, . . . � Libraries ◦ containers, iterators & algorithms ◦ strings ◦ streams
Odlišnosti C a C++ � bool b = true; _Bool b = TRUE; � � C 99 typedef enum bool_ { FALSE, TRUE} bool; bool b = TRUE; int b 2 = a > 1; struct & enum tags struct S { int x; }; typedef struct S_ { int x; } S; S s; struct S s; implicitní konverze - enum, void * enum E { NULA }; E e = NULA; int x = (int)e; int* p = (int*)malloc(sizeof(int)); � C ⊈ C++ enum E { NULA }; enum E e = NULA; int x = e; int* p = malloc(sizeof( int)); main - return 0; int main() {. . . } int main() {. . . return 0; }
Pole a ukazatele, aritmetika ukazatelů � � � T a[n]; T *p = &a[i]; p+j; p+=j; ++p p-j p 1 -p 2 int a[5]; int *p; a[2] = 20; p = &a[2]; pole prvků typu T ukazatel p ukazuje na prvek pole přičtení - posun o j prvků v rámci pole stejně jako iterátory odečtení - posun zpět odečtení ukazatelů - počet prvků mezi a 0 1 2 3 4 ? ? 20 ? ? 30 ? p reference na prvek pole a[0] = *p - 15; ++p; *p = 30; 5 ? 20 p inkrementace ukazatele posun na další prvek
Pole a ukazatele, aritmetika ukazatelů � p = &a[1]; *(p+3) = 40; � Operátor [] � � � p[i] *(p+i) &p[i] p+i 5 ? 20 přičtení čísla k ukazateli posun o n prvků indexování pole (ukazatele) je 'jen' jiný zápis přístupu přes ukazatel identifikátor pole je ukazatel na svůj nultý prvek � a &a[0] � Automatické konverze pole-ukazatel ◦ identifikátor pole se chová jako ukazatel na nultý prvek � Pole nelze přiřazovat ani předávat hodnotou ◦ p = a je ekvivalentní p = &a[0] 30 40 p
Řetězce � Každý řetězec musí být vždy ukončen nulou Řetězec - pole znaků (char) zakončené nulou ◦ konvence, knihovny "Ahoj" char buffer[4]; strcpy( buffer, "Ahoj"); pozor na uvozovky a apostrofy ! � � � X 'X' "X" 'A' 'h' 'o' 'j' '