PB161 Programování v jazyce C++ Přednáška 5
|
|
- Markéta Vacková
- před 6 lety
- Počet zobrazení:
Transkript
1 PB161 Programování v jazyce C++ Přednáška 5 Práce s pamětí Princip RAII Lehký úvod do výjimek Nikola Beneš 16. října 2018 PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
2 Přetypování (cast) Co už jste (možná) pochopili (-Wold-style-cast) v moderním C++ nechceme používat Céčkové přetypování (typ)hodnota divná syntax, nejasná priorita; není typově bezpečné Jaké máme možnosti v C++? static_cast<typ>(hodnota) základní přetypování; většinou bezpečné const_cast<typ>(hodnota) umožňuje porušit const jen pokud skutečně víte, co děláte; pozor na nedefinované chování reinterpret_cast<typ>(hodnota) donutí kompilátor dívat se na kus paměti jako na jiný typ to velmi často není to, co chcete má občas použití v nízkoúrovňovém kódu (práce s binárními soubory) dynamic_cast<typ>(hodnota) použití při dědičnosti; uvidíme později PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
3 Přetypování (cast) Co už jste (možná) pochopili (-Wold-style-cast) v moderním C++ nechceme používat Céčkové přetypování (typ)hodnota divná syntax, nejasná priorita; není typově bezpečné Jaké máme možnosti v C++? Nepoužívejte, pokud vám to explicitně nepovolíme static_cast<typ>(hodnota) základní přetypování; většinou bezpečné const_cast<typ>(hodnota) umožňuje porušit const jen pokud skutečně víte, co děláte; pozor na nedefinované chování reinterpret_cast<typ>(hodnota) donutí kompilátor dívat se na kus paměti jako na jiný typ to velmi často není to, co chcete má občas použití v nízkoúrovňovém kódu (práce s binárními soubory) dynamic_cast<typ>(hodnota) použití při dědičnosti; uvidíme později PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
4 Práce s pamětí PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
5 Připomenutí Ukazatel proměnná, která drží adresu v paměti aritmetika ukazatelů (přičtení čísla k ukazateli, rozdíl ukazatelů) rozdíl mezi const int* a int* const a případně const int* const speciální ukazatel nullptr (od C++11) dříve NULL nepoužívat v novém kódu! PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
6 Alokace paměti znáte z C Alokace na zásobníku (stack) lokální proměnné; automatické uvolnění paměti na konci bloku (v C++ navíc automatické volání destruktorů) PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
7 Alokace paměti znáte z C Alokace na zásobníku (stack) lokální proměnné; automatické uvolnění paměti na konci bloku (v C++ navíc automatické volání destruktorů) Statická alokace globální proměnné, statické proměnné ve funkcích (v C++ navíc statické atributy uvidíme později) alokace před spuštěním programu inicializace před začátkem funkce main (složitější) dealokace po skončení programu (v C++ navíc volání destruktorů) PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
8 Alokace paměti znáte z C Alokace na zásobníku (stack) lokální proměnné; automatické uvolnění paměti na konci bloku (v C++ navíc automatické volání destruktorů) Statická alokace globální proměnné, statické proměnné ve funkcích (v C++ navíc statické atributy uvidíme později) alokace před spuštěním programu inicializace před začátkem funkce main (složitější) dealokace po skončení programu (v C++ navíc volání destruktorů) Dynamická alokace na haldě (heap) explicitní žádost o paměť explicitní uvolnění paměti znáte z C: malloc/free (v C++ nepoužíváme) nebezpečné: žádná typová kontrola, bez inicializace PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
9 Práce s pamětí v C++ Nízkoúrovňová (ruční) operátory new a delete new alokuje paměť na haldě a zavolá konstruktor delete zavolá destruktor a dealokuje paměť moderní C++: příliš nepoužívat, jen v nutných případech nicméně je dobré vědět, jak funguje PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
10 Práce s pamětí v C++ Nízkoúrovňová (ruční) operátory new a delete new alokuje paměť na haldě a zavolá konstruktor delete zavolá destruktor a dealokuje paměť moderní C++: příliš nepoužívat, jen v nutných případech nicméně je dobré vědět, jak funguje Vysokoúrovňová (automatická) využití standardní knihovny, příp. jiných knihoven (boost apod.) už jsme vlastně viděli vector, string a jiné kontejnery vnitřně alokují a dealokují paměť na haldě jiné možnosti: chytré ukazatele automatické uvolnění paměti unique_ptr (od C++11 ve standardní knihovně) a jiné PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
11 Nízkoúrovňová správa paměti Dva způsoby alokace jeden objekt pole objektů int* ptr = new int; int* array = new int[20]; když se alokace nezdaří, vyhodí výjimku (o těch bude řeč později) není proto třeba kontrolovat na nullptr PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
12 Nízkoúrovňová správa paměti Dva způsoby alokace jeden objekt pole objektů int* ptr = new int; int* array = new int[20]; když se alokace nezdaří, vyhodí výjimku (o těch bude řeč později) není proto třeba kontrolovat na nullptr Odpovídající způsoby dealokace delete ptr; delete [] array; musí odpovídat použitému new nehlídá kompilátor (někdy ovšem umí dát warning)! Proč? lecture05_01.cpp, lecture05_02.cpp PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
13 Nízkoúrovňová správa paměti (pokr.) Inicializace alokovaných objektů funguje podobně jako inicializace lokálních objektů int* ptr1 = new int; // neinicializovaná paměť int* ptr2 = new int(17); // paměť inicializovaná na 17 int* ptr3 = new int(); // paměť inicializovaná na 0 PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
14 Nízkoúrovňová správa paměti (pokr.) Inicializace alokovaných objektů funguje podobně jako inicializace lokálních objektů int* ptr1 = new int; // neinicializovaná paměť int* ptr2 = new int(17); // paměť inicializovaná na 17 int* ptr3 = new int(); // paměť inicializovaná na 0 Obj* ptr4 = new Obj; // zavolá se konstruktor Obj::Obj() Obj* ptr5 = new Obj(3, 5); // konstruktor Obj::Obj(int, int) PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
15 Nízkoúrovňová správa paměti (pokr.) Inicializace alokovaných objektů funguje podobně jako inicializace lokálních objektů int* ptr1 = new int; // neinicializovaná paměť int* ptr2 = new int(17); // paměť inicializovaná na 17 int* ptr3 = new int(); // paměť inicializovaná na 0 Obj* ptr4 = new Obj; // zavolá se konstruktor Obj::Obj() Obj* ptr5 = new Obj(3, 5); // konstruktor Obj::Obj(int, int) Alokace a inicializace polí int* arr1 = new int[200]; // neinicializovaná paměť int* arr2 = new int[200](); // paměť inicializovaná na 0 lecture05_03.cpp PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
16 Nízkoúrovňová správa paměti (pokr.) Inicializace alokovaných objektů funguje podobně jako inicializace lokálních objektů int* ptr1 = new int; // neinicializovaná paměť int* ptr2 = new int(17); // paměť inicializovaná na 17 int* ptr3 = new int(); // paměť inicializovaná na 0 Obj* ptr4 = new Obj; // zavolá se konstruktor Obj::Obj() Obj* ptr5 = new Obj(3, 5); // konstruktor Obj::Obj(int, int) Alokace a inicializace polí int* arr1 = new int[200]; // neinicializovaná paměť int* arr2 = new int[200](); // paměť inicializovaná na 0 Obj* arr3 = new Obj[200]; // zavolá se konstruktor Obj::Obj() samozřejmě funguje i inicializace pomocí {} lecture05_03.cpp PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
17 Nízkoúrovňová správa paměti (pokr.) Problémy správy paměti (některé znáte z C) PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
18 Nízkoúrovňová správa paměti (pokr.) Problémy správy paměti (některé znáte z C) memory leak (alokovaná paměť, na kterou již nemáme ukazatel) zápis do/čtení z nealokované paměti čtení z neinicializované paměti volání delete na špatný ukazatel volání delete místo delete [] a naopak volání free na paměť alokovanou new, nebo delete/delete[] na pamět alokovanou malloc PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
19 Nízkoúrovňová správa paměti (pokr.) Problémy správy paměti (některé znáte z C) memory leak (alokovaná paměť, na kterou již nemáme ukazatel) zápis do/čtení z nealokované paměti čtení z neinicializované paměti volání delete na špatný ukazatel volání delete místo delete [] a naopak volání free na paměť alokovanou new, nebo delete/delete[] na pamět alokovanou malloc v C++ nikdy nepoužíváme free/malloc (leda by to vyžadovala použitá C knihovna)! PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
20 Nízkoúrovňová správa paměti (pokr.) Problémy správy paměti (některé znáte z C) memory leak (alokovaná paměť, na kterou již nemáme ukazatel) zápis do/čtení z nealokované paměti čtení z neinicializované paměti volání delete na špatný ukazatel volání delete místo delete [] a naopak volání free na paměť alokovanou new, nebo delete/delete[] na pamět alokovanou malloc v C++ nikdy nepoužíváme free/malloc (leda by to vyžadovala použitá C knihovna)! Motivace pro chytré ukazatele chceme ukazatel, který sám provede delete, když je potřeba PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
21 Vysokoúrovňová správa paměti Chytré ukazatele několik druhů ve standardní knihovně (od C++11), příp. v jiných knihovnách (boost) v tomto předmětu si ukážeme pouze jeden PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
22 Vysokoúrovňová správa paměti Chytré ukazatele několik druhů ve standardní knihovně (od C++11), příp. v jiných knihovnách (boost) v tomto předmětu si ukážeme pouze jeden std::unique_ptr nejjednodušší, ale pokrývá většinu potřeb má nulovou režii (overhead) za běhu, na rozdíl od jiných použitelný pro jednotlivé objekty i pole PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
23 Vysokoúrovňová správa paměti Chytré ukazatele několik druhů ve standardní knihovně (od C++11), příp. v jiných knihovnách (boost) v tomto předmětu si ukážeme pouze jeden std::unique_ptr nejjednodušší, ale pokrývá většinu potřeb má nulovou režii (overhead) za běhu, na rozdíl od jiných použitelný pro jednotlivé objekty i pole základní princip: objekt, který uvnitř drží ukazatel (koncept vlastnictví) na konci života objektu se zavolá delete na vlastněný ukazatel (tedy zavolá destruktor a dealokuje) vlastnictví se nedá sdílet (proto unique) ale může se explicitně předat PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
24 Vysokoúrovňová správa paměti (pokr.) Základní použití std::unique_ptr alokace pokud neinicializujeme, je automaticky nullptr std::unique_ptr<object> ptr(new Object(params)); // v C++11 // od C++14 používejte raději takto auto ptr = std::make_unique<object>(params); lecture05_04.cpp, lecture05_05.cpp PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
25 Vysokoúrovňová správa paměti (pokr.) Základní použití std::unique_ptr alokace pokud neinicializujeme, je automaticky nullptr std::unique_ptr<object> ptr(new Object(params)); // v C++11 // od C++14 používejte raději takto auto ptr = std::make_unique<object>(params); přístup k objektu stejně jak u klasických ukazatelů (*, ->) pozor, nedefinované chování, pokud by byl ptr == nullptr ptr->method(); function(*ptr); lecture05_04.cpp, lecture05_05.cpp PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
26 Vysokoúrovňová správa paměti (pokr.) Základní použití std::unique_ptr alokace pokud neinicializujeme, je automaticky nullptr std::unique_ptr<object> ptr(new Object(params)); // v C++11 // od C++14 používejte raději takto auto ptr = std::make_unique<object>(params); přístup k objektu stejně jak u klasických ukazatelů (*, ->) pozor, nedefinované chování, pokud by byl ptr == nullptr ptr->method(); function(*ptr); dealokace, zavolání destruktoru objektu lokální unique_ptr: automaticky, na konci bloku unique_ptr jako atribut: automaticky po destruktoru hlavního objektu explicitně: zavoláním metody reset() lecture05_04.cpp, lecture05_05.cpp PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
27 Vysokoúrovňová správa paměti (pokr.) zjištění, zda unique_ptr obsahuje nějaký ukazatel if (ptr) {... } lecture05_06.cpp PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
28 Vysokoúrovňová správa paměti (pokr.) zjištění, zda unique_ptr obsahuje nějaký ukazatel if (ptr) {... } přímý přístup ke spravovanému ukazateli (k čemu je to dobré?) Object* rawptr = ptr.get(); // ptr je stále vlastníkem ukazatele lecture05_06.cpp PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
29 Vysokoúrovňová správa paměti (pokr.) zjištění, zda unique_ptr obsahuje nějaký ukazatel if (ptr) {... } přímý přístup ke spravovanému ukazateli (k čemu je to dobré?) Object* rawptr = ptr.get(); // ptr je stále vlastníkem ukazatele vzdání se vlastnictví (k čemu je to dobré?) // tohle raději nedělejte! Object* rawptr = ptr.release(); // ptr už není vlastníkem ukazatele, který je nyní uložen // v rawptr, a je třeba jej uvolnit ručně! lecture05_06.cpp PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
30 Vysokoúrovňová správa paměti (pokr.) předávání vlastnictví jinému unique_ptr unique_ptr se nedá kopírovat! // tohle nebude fungovat std::unique_ptr<object> newptr = ptr; // chyba! PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
31 Vysokoúrovňová správa paměti (pokr.) předávání vlastnictví jinému unique_ptr unique_ptr se nedá kopírovat! // tohle nebude fungovat std::unique_ptr<object> newptr = ptr; // chyba! unique_ptr se umí tzv. přesouvat (move) využívá rvalue semantics, mimo záběr předmětu std::unique_ptr<object> newptr = std::move(ptr); // newptr teď vlastní ukazatel, který předtím vlastnil ptr // ptr teď nevlastní nic, je tedy ekvivalentní nullptr PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
32 Vysokoúrovňová správa paměti (pokr.) předávání vlastnictví jinému unique_ptr unique_ptr se nedá kopírovat! // tohle nebude fungovat std::unique_ptr<object> newptr = ptr; // chyba! unique_ptr se umí tzv. přesouvat (move) využívá rvalue semantics, mimo záběr předmětu std::unique_ptr<object> newptr = std::move(ptr); // newptr teď vlastní ukazatel, který předtím vlastnil ptr // ptr teď nevlastní nic, je tedy ekvivalentní nullptr funguje nejen při inicializaci, ale i při přiřazení auto ptra = std::make_unique<object>(); auto ptrb = std::make_unique<object>(); ptra = std::move(ptrb); // kdo co vlastní teď? lecture05_07.cpp PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
33 Vysokoúrovňová správa paměti (pokr.) použití pro alokaci polí // v C++11 std::unique_ptr<object[]> ptr(new Object[size]); // od C++14 používejte raději takto auto ptr = std::make_unique<object[]>(size); // alokuje paměť pro size objektů // a všechny inicializuje bezparametrickým konstruktorem PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
34 Vysokoúrovňová správa paměti (pokr.) použití pro alokaci polí // v C++11 std::unique_ptr<object[]> ptr(new Object[size]); // od C++14 používejte raději takto auto ptr = std::make_unique<object[]>(size); // alokuje paměť pro size objektů // a všechny inicializuje bezparametrickým konstruktorem použití pro alokací polí primitivních typů auto ptr = std::make_unique<int[]>(size); // alokuje paměť pro size intů // a všechny inicializuje na 0 inicializuje tedy jako new int[size]() lecture05_08.cpp PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
35 Vysokoúrovňová správa paměti (pokr.) Jak správně pracovat s ukazateli v moderním C++ jasně si rozmyslete, kdo bude vlastníkem ukazatele ten pak má unique_ptr ukazující na daný objekt ostatní (ne-vlastníci) smí mít klasický (surový, raw) ukazatel na tentýž objekt (nebo lépe referenci) je třeba zaručit, aby vlastník ukazatele přežil všechny ne-vlastníky, kteří ukazovaný objekt používají Jak předávat unique_ptr do funkce? lecture05_09.cpp PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
36 Vysokoúrovňová správa paměti (pokr.) Jak správně pracovat s ukazateli v moderním C++ jasně si rozmyslete, kdo bude vlastníkem ukazatele ten pak má unique_ptr ukazující na daný objekt ostatní (ne-vlastníci) smí mít klasický (surový, raw) ukazatel na tentýž objekt (nebo lépe referenci) je třeba zaručit, aby vlastník ukazatele přežil všechny ne-vlastníky, kteří ukazovaný objekt používají Jak předávat unique_ptr do funkce? hodnotou typu unique_ptr: volající pak musí použít std::move a tím se vzdává vlastnictví ukazatele referencí: volaná funkce může sebrat vlastnictví (nedoporučované) const referencí: v podstatě OK, ale volaná funkce může modifikovat odkazovaný objekt (je to jakoby Object* const) surový ukazatel: může být Object * nebo const Object * úplně nejlépe referencí na Object: lecture05_09.cpp volající musí zajistit, že není nullptr PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
37 Vysokoúrovňová správa paměti (pokr.) Datové struktury a unique_ptr je třeba rozmyslet strukturu vlastnictví lecture05_10.cpp PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
38 Vysokoúrovňová správa paměti (pokr.) Datové struktury a unique_ptr je třeba rozmyslet strukturu vlastnictví není možné mít ve vlastnictví cykly (proč?) lecture05_10.cpp PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
39 Vysokoúrovňová správa paměti (pokr.) Datové struktury a unique_ptr je třeba rozmyslet strukturu vlastnictví není možné mít ve vlastnictví cykly (proč?) není možné, aby dva vlastnili stejný objekt lecture05_10.cpp PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
40 Vysokoúrovňová správa paměti (pokr.) Datové struktury a unique_ptr je třeba rozmyslet strukturu vlastnictví není možné mít ve vlastnictví cykly (proč?) není možné, aby dva vlastnili stejný objekt oboustranně zřetězený seznam (v prvcích) next je unique_ptr, prev je ukazatel (v seznamu) first je unique_ptr, last je ukazatel nebo naopak lecture05_10.cpp PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
41 Vysokoúrovňová správa paměti (pokr.) Datové struktury a unique_ptr je třeba rozmyslet strukturu vlastnictví není možné mít ve vlastnictví cykly (proč?) není možné, aby dva vlastnili stejný objekt oboustranně zřetězený seznam (v prvcích) next je unique_ptr, prev je ukazatel (v seznamu) first je unique_ptr, last je ukazatel nebo naopak binární strom vztah rodič vlastní potomky left a right jsou unique_ptr, případný parent je ukazatel apod. lecture05_10.cpp PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
42 Správa paměti v moderním C++ Doporučení používejte vysokoúrovňovou správu paměti (unique_ptr) nepoužívejte new a delete ale naučte se jim rozumět často je uvidíte v cizím kódu do funkcí předávejte objekty pokud možno referencí (toto doporučení už bylo!) předávejte unique_ptr hodnotou, pokud se chcete vzdát vlastnictví implementujete-li složitější datovou strukturu s ukazateli, rozmyslete si strukturu vlastnictví (kdo koho vlastní) PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
43 Správa zdrojů princip RAII ACQUIRE USE RELEASE PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
44 Správa zdrojů Co to je zdroj? PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
45 Správa zdrojů Co to je zdroj? něco, co se získá (acquire) potom se to používá (use) nakonec se to uvolní (release) Příklady zdrojů PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
46 Správa zdrojů Co to je zdroj? něco, co se získá (acquire) potom se to používá (use) nakonec se to uvolní (release) Příklady zdrojů paměť na haldě PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
47 Správa zdrojů Co to je zdroj? něco, co se získá (acquire) potom se to používá (use) nakonec se to uvolní (release) Příklady zdrojů paměť na haldě soubory síťová připojení zámky, mutexy, semafory, apod. PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
48 Správa zdrojů Co to je zdroj? něco, co se získá (acquire) potom se to používá (use) nakonec se to uvolní (release) Příklady zdrojů paměť na haldě soubory síťová připojení zámky, mutexy, semafory, apod. v C++ vše funguje na stejném principu Různé jazyky často implementují automatickou správu paměti, ale ne automatickou správu zdrojů (v posledních letech se to trochu zlepšuje). C++ má automatickou správu zdrojů už skoro od svého počátku. PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
49 Správa zdrojů v C++ Princip RAII Resource Acquisition Is Initialisation někdy též zváno scope-based resource management správa zdroje spjatá s životním cyklem objektu inicializace objektu: získání zdroje (acquire) destruktor: uvolnění zdroje (release) ideálně: jeden objekt spravuje jeden zdroj PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
50 Správa zdrojů v C++ Princip RAII Resource Acquisition Is Initialisation někdy též zváno scope-based resource management správa zdroje spjatá s životním cyklem objektu inicializace objektu: získání zdroje (acquire) destruktor: uvolnění zdroje (release) ideálně: jeden objekt spravuje jeden zdroj Kde se používá RAII? skoro všude! string, vector, všechny kontejnery práce se soubory v C++ (později) chytré ukazatele: unique_ptr (C++11) zamykání, mutexy (C++11, nad rámec kurzu) PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
51 Princip RAII Příklad dynamické pole intů (pamatujete na Rule of Three?) class IntArray { size_t size; int* array; public: IntArray(size_t size) : size(size), array(new int[size]) {} ~IntArray() { delete [] array; } IntArray(const IntArray& other) : size(other.size), array(new int[size]) { std::copy(other.array, other.array + size, array); } IntArray& operator=(const IntArray& other) { // viz další slajdy } } lecture05_11.cpp PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
52 Příklad dynamické pole intů Jak implementovat přiřazovací operátor? IntArray& operator=(const IntArray& other) { delete [] array; size = other.size; array = new int[size]; std::copy(other.array, other.array + size, array); return *this; } kde je problém? PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
53 Příklad dynamické pole intů Jak implementovat přiřazovací operátor? IntArray& operator=(const IntArray& other) { delete [] array; size = other.size; array = new int[size]; std::copy(other.array, other.array + size, array); return *this; } kde je problém? sebe-přiřazení (co se stane, když napíšu x = x;?) jak řešit? PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
54 Příklad dynamické pole intů (pokr.) Kontrola sebe-přiřazení IntArray& operator=(const IntArray& other) { if (&other == this) return *this; delete [] array; size = other.size; array = new int[size]; std::copy(other.array, other.array + size, array); return *this; } optimalizace není třeba dělat delete [] a new [], pokud jsou velikosti stejné PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
55 Příklad dynamické pole intů (pokr.) Jiná možnost, tzv. copy-and-swap idiom void swap(intarray& other) { using std::swap; swap(size, other.size); swap(array, other.array); } IntArray& operator=(intarray other) { // HODNOTOU! swap(other); return *this; } co se děje? PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
56 ke třem dříve zmíněným se přidá metoda swap copy-and-swap idiom silně doporučujeme! PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28 Příklad dynamické pole intů (pokr.) Jiná možnost, tzv. copy-and-swap idiom void swap(intarray& other) { using std::swap; swap(size, other.size); swap(array, other.array); } IntArray& operator=(intarray other) { // HODNOTOU! swap(other); return *this; } co se děje? Rule of Three and a Half
57 Princip RAII Jiné příklady (pro ilustraci) třída File konstruktor otevře soubor destruktor zavře soubor kopírování nejspíše zakážeme PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
58 Princip RAII Jiné příklady (pro ilustraci) třída File konstruktor otevře soubor destruktor zavře soubor kopírování nejspíše zakážeme třída Mutex konstruktor zamkne mutex destruktor odemkne mutex kopírování opět zakážeme PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
59 Princip RAII Jiné příklady (pro ilustraci) třída File konstruktor otevře soubor destruktor zavře soubor kopírování nejspíše zakážeme třída Mutex konstruktor zamkne mutex destruktor odemkne mutex kopírování opět zakážeme třída Texture konstruktor načte texturu ze souboru do paměti GPU destruktor uvolní paměť GPU kopírování: vytvoření nové textury PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
60 Princip RAII v jiných jazycích Některé jazyky mají RAII C++, D, Ada, Rust umí plné RAII tak trochu: Perl, Python (CPython), PHP mají reference counting Správa zdrojů v jiných jazycích garbage collector: správa paměti, typicky neumožňuje správu zdrojů (není žádná záruka, kdy a jestli vůbec se zavolají destruktory) Java (od 1.7) synchronized try(resource res = new Resource(...)) {... } Python (od 2.5) with get_resource() as resource: C# using(resource res = new Resource(...)) {... } PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
61 Lehký úvod do výjimek Výjimky způsob, jak řešit výjimečné situace (chyby) za běhu programu vyhození výjimky: throw zachycení výjimky: try {... } catch(...) {... } standardní výjimky v knihovně: <stdexcept> testování v Catch2: REQUIRE_THROWS_AS(výraz, typ výjimky) apod. int main() { try { throw std::runtime_error("something bad happened."); } catch (std::runtime_error& ex) { std::cout << ex.what() << '\n'; } } lecture05_12.cpp PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
62 Lehký úvod do výjimek (pokr.) Pár pravidel (podrobněji se k nim dostaneme později) výjimkami řešte pouze výjimečné situace házejte hodnotou, chytejte referencí nevyhazujte výjimky z destruktorů vyhazujte výjimky z konstruktorů, pokud nedokážete smysluplně dokončit konstrukci objektu PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
63 Lehký úvod do výjimek (pokr.) Pár pravidel (podrobněji se k nim dostaneme později) výjimkami řešte pouze výjimečné situace házejte hodnotou, chytejte referencí nevyhazujte výjimky z destruktorů vyhazujte výjimky z konstruktorů, pokud nedokážete smysluplně dokončit konstrukci objektu Vztah výjimek a RAII destrukory lokálních objektů se zavolají vždy při opuštění bloku to se týká i opuštění bloku při vyhození výjimky srovnejte použití std::unique_ptr a explicitního new a delete ve chvíli, kdy uvnitř bloku vznikne výjimka lecture05_13.cpp PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října / 28
PB161 Programování v jazyce C++ Přednáška 5
PB161 Programování v jazyce C++ Přednáška 5 Práce s pamětí Princip RAII Nikola Beneš 16. října 2017 PB161 přednáška 5: práce s pamětí, princip RAII 16. října 2017 1 / 25 Práce s pamětí PB161 přednáška
PB161 Programování v jazyce C++ Přednáška 4
PB161 Programování v jazyce C++ Přednáška 4 Dynamická alokace Kopírovací konstruktor Přetypování v C++ Nikola Beneš 12. října 2015 PB161 přednáška 4: dynamická alokace, kopírovací konstruktor, casting
PB161 Programování v jazyce C++ Přednáška 8
.. PB161 Programování v jazyce C++ Přednáška 8 Výjimky Správa prostředků (RAII) Nikola Beneš 9. listopadu 2015 PB161 přednáška 8: výjimky, RAII 9. listopadu 2015 1 / 24 . PB161 přednáška 8: výjimky, RAII
PB přednáška (12. října 2015)
PB161 3. přednáška (12. října 2015) Poznámky k domácímu úkolu Dynamická alokace Statická vs. dynamická alokace statická alokace na zásobníku (stack) deklarace uvnitř bloku (lokální proměnné) automatické
PB161 Programování v jazyce C++ Přednáška 4
PB161 Programování v jazyce C++ Přednáška 4 Přetěžování funkcí Konstruktory a destruktory Nikola Beneš 9. října 2017 PB161 přednáška 4: přetěžování funkcí, konstruktory, destruktory 9. října 2017 1 / 20
2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.
Informatika 10. 9. 2013 Jméno a příjmení Rodné číslo 1) Napište algoritmus pro rychlé třídění (quicksort). 2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus
PB161 Programování v jazyce C++ Přednáška 9
PB161 Programování v jazyce C++ Přednáška 9 Jmenné prostory Výjimky podrobně Nikola Beneš 20. listopadu 2018 PB161 přednáška 9: jmenné prostory, výjimky 20. listopadu 2018 1 / 32 Jmenné prostory PB161
PB161 Programování v jazyce C++ Přednáška 9
PB161 Programování v jazyce C++ Přednáška 9 Právo friend Přetěžování operátorů Nikola Beneš 16. listopadu 2015 PB161 přednáška 9: friend, přetěžování operátorů 16. listopadu 2015 1 / 30 Reklama PB173 Tematicky
PB161 Programování v jazyce C++ Přednáška 9
PB161 Programování v jazyce C++ Přednáška 9 Jmenné prostory Výjimky podrobně Nikola Beneš 20. listopadu 2018 PB161 přednáška 9: jmenné prostory, výjimky 20. listopadu 2018 1 / 32 Jmenné prostory PB161
Ukazatele, dynamická alokace
Ukazatele, dynamická alokace Karel Richta a kol. katedra počítačů FEL ČVUT v Praze Přednášky byly připraveny s pomocí materiálů, které vyrobili Ladislav Vágner, Pavel Strnad, Martin Mazanec Karel Richta,
IUJCE 07/08 Přednáška č. 6
Správa paměti Motivace a úvod v C (skoro vždy) ručně statické proměnné o datový typ, počet znám v době překladu o zabírají paměť po celou dobu běhu programu problém velikosti definovaných proměnných jak
Správa paměti. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016
Správa paměti Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016 Objektové modelování, B36OMO 10/2016, Lekce 2 https://cw.fel.cvut.cz/wiki/courses/xxb36omo/start
Více o konstruktorech a destruktorech
Více o konstruktorech a destruktorech Více o konstruktorech a o přiřazení... inicializovat objekt lze i pomocí jiného objektu lze provést přiřazení mezi objekty v původním C nebylo možné provést přiřazení
PB161 Programování v jazyce C++ Přednáška 11
PB161 Programování v jazyce C++ Přednáška 11 Pokročilé C++(14) povrchně Nikola Beneš 6. prosince 2016 PB161 přednáška 10: pokročilé C++(14) povrchně 6. prosince 2016 1 / 31 Organizační Dnešní přednáška
PB161 Programování v jazyce C++ Přednáška 2
PB161 Programování v jazyce C++ Přednáška 2 Základy objektů Reference, const Nikola Beneš 25. září 2018 PB161 přednáška 2: objekty, reference, const 25. září 2018 1 / 30 Jak funguje std::vector? (pro zvídavé)
PB161 Programování v jazyce C++ Přednáška 11
PB161 Programování v jazyce C++ Přednáška 11 Pokročilé C++(17) povrchně Nikola Beneš 4. prosince 2018 PB161 přednáška 10: pokročilé C++(17) povrchně 4. prosince 2018 1 / 34 Organizační Dnešní přednáška
Generické programování
Generické programování Od C# verze 2.0 = vytváření kódu s obecným datovým typem Příklad generická metoda, zamění dva parametry: static void Swap(ref T p1, ref T p2) T temp; temp = p1; p1 = p2; p2 =
Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007
Úvod do programovacích jazyků (Java) Michal Krátký 1 Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2006/2007 c 2006 Michal Krátký Úvod do programovacích jazyků
Mělká a hluboká kopie
Karel Müller, Josef Vogel (ČVUT FIT) Mělká a hluboká kopie BI-PA2, 2011, Přednáška 5 1/28 Mělká a hluboká kopie Ing. Josef Vogel, CSc Katedra softwarového inženýrství Katedra teoretické informatiky, Fakulta
Dynamika objektů. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze
Dynamika objektů Karel Richta a kol. katedra počítačů FEL ČVUT v Praze Přednášky byly připraveny s pomocí materiálů, které vyrobili Ladislav Vágner, Pavel Strnad Karel Richta, Martin Hořeňovský, Aleš Hrabalík,
Programování v C++ 2, 4. cvičení
Programování v C++ 2, 4. cvičení statické atributy a metody, konstruktory 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled Přístupová práva
Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody
Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody Dynamická alokace paměti Jazyky C a C++ poskytují programu možnost vyžádat si část volné operační paměti pro
Hrátky s funkcemi. PV173 Programování v C++11. Vladimír Štill, Jiří Weiser. Fakulta Informatiky, Masarykova Univerzita. 29.
Hrátky s funkcemi PV173 Programování v C++11 Vladimír Štill, Jiří Weiser Fakulta Informatiky, Masarykova Univerzita 29. září 2014 Hrátky s funkcemi PV173 29. září 2014 1 / 23 Úvod Na co se podíváme? předávání
Správa paměti. doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 /
Správa paměti doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 / 597 324 213 http://www.cs.vsb.cz/benes Miroslav.Benes@vsb.cz Obsah přednášky Motivace Úrovně správy paměti. Manuální
PB přednáška (23. listopadu 2015)
PB161 10. přednáška (23. listopadu 2015) Šablony Motivace snaha o co nejmenší duplikaci kódu co když máme kód, který chceme použít pro různé typy? generická funkce (maximum, minimum, swap, ) kontejnery
Základy programování (IZP)
Základy programování (IZP) Deváté počítačové cvičení Brno University of Technology, Faculty of Information Technology Božetěchova 1/2, 612 66 Brno - Královo Pole Petr Veigend, iveigend@fit.vutbr.cz 27.11.2017,
IB111 Úvod do programování skrze Python Přednáška 7
IB111 Úvod do programování skrze Python Přednáška 7 Správa paměti (proměnné podrobněji) Práce se soubory Nikola Beneš 2. listopad 2016 IB111 přednáška 7: správa paměti, práce se soubory 2. listopad 2016
PB161 Programování v jazyce C++ Přednáška 7
PB161 Programování v jazyce C++ Přednáška 7 Statické položky tříd Základy OOP Nikola Beneš 6. listopadu 2018 PB161 přednáška 7: static, základy OOP 6. listopadu 2018 1 / 21 Klíčové slovo static Znáte z
PB161 Programování v jazyce C++ Přednáška 7
PB161 Programování v jazyce C++ Přednáška 7 Statické položky tříd Základy OOP Nikola Beneš 6. listopadu 2018 PB161 přednáška 7: static, základy OOP 6. listopadu 2018 1 / 21 Klíčové slovo static Znáte z
Programování v jazyce C a C++
Programování v jazyce C a C++ Richter 1 Petyovský 2 1. března 2015 1 Ing. Richter Miloslav, Ph.D., UAMT FEKT VUT Brno 2 Ing. Petyovský Petr, UAMT FEKT VUT Brno C++ Stručná charakteristika Nesdíĺı normu
Struktura programu v době běhu
Struktura programu v době běhu Miroslav Beneš Dušan Kolář Struktura programu v době běhu Vztah mezi zdrojovým programem a činností přeloženého programu reprezentace dat správa paměti aktivace podprogramů
Základy programování (IZP)
Základy programování (IZP) Jedenácté počítačové cvičení Brno University of Technology, Faculty of Information Technology Božetěchova 1/2, 612 66 Brno - Královo Pole Gabriela Nečasová, inecasova@fit.vutbr.cz
Dědění, polymorfismus
Programování v jazyce C/C++ Ladislav Vagner úprava Pavel Strnad Dědění. Polymorfismus. Dnešní přednáška Statická a dynamická vazba. Vnitřní reprezentace. VMT tabulka virtuálních metod. Časté chyby. Minulá
Ukazatele #2, dynamická alokace paměti
Ukazatele #2, dynamická alokace paměti BI-PA1 Programování a Algoritmizace 1 Miroslav Baĺık, Ladislav Vagner a Josef Vogel Katedra teoretické informatiky a Katedra softwarového inženýrství Fakulta informačních
Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007
Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2006/2007 c 2006 Michal Krátký Úvod do programovacích jazyků
PB161 Programování v jazyce C++ Přednáška 2
PB161 Programování v jazyce C++ Přednáška 2 Základy objektů Reference, const Testování Nikola Beneš 25. září 2017 PB161 přednáška 2: objekty, reference, const, testování 25. září 2017 1 / 35 Jak funguje
Úvod. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík,2016
Úvod Karel Richta a kol. katedra počítačů FEL ČVUT v Praze Karel Richta, Martin Hořeňovský, Aleš Hrabalík,2016 Přednášky byly připraveny i s pomocí materiálů, které vyrobili Ladislav Vágner a Pavel Strnad
PB071 Programování v jazyce C Jaro 2015
Programování v jazyce C Jaro 2015 Argumenty main(), Typový systém, Dynamická alokace Organizační Polosemestrální test Úterý 7. dubna v 10:00 a 11:00 v D1 20 bodů rozdíl mezi E a C Zdroj: http://www.bugemos.com/?node=342
konstruktory a destruktory (o)
konstruktory a destruktory (o) - slouží k ovlivnění vzniku (inicializace) a zániku (úklid) objektu - základní myšlenkou je, že proměnná by měla být inicializována (nastavena do počátečního stavu) a zároveň
Konstruktory a destruktory
Konstruktory a destruktory Nedostatek atributy po vytvoření objektu nejsou automaticky inicializovány hodnota atributů je náhodná vytvoření metody pro inicializaci, kterou musí programátor explicitně zavolat,
Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky
JAVA Třídy Definice třídy úplná definice [public] [abstract] [final] class Jmeno [extends Predek] [impelements SeznamInterfacu] {... // telo tridy public veřejná třída abstract nesmí být vytvářeny instance
Vláknové programování část V
Vláknové programování část V Lukáš Hejmánek, Petr Holub {xhejtman,hopet@ics.muni.cz Laboratoř pokročilých síťových technologií PV192 2014 03 25 1/25 Přehled přednášky Paměťový model Javy GUI v Javě Vlákna
Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15
Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15 KAPITOLA 1 Úvod do programo vání v jazyce C++ 17 Základní pojmy 17 Proměnné a konstanty 18 Typy příkazů 18 IDE integrované vývojové
Jazyk C# (seminář 6)
Jazyk C# (seminář 6) Pavel Procházka KMI 29. října 2014 Delegát motivace Delegáty a události Jak docílit v C# funkcionální práce s metodami v C je to pomocí pointerů na funkce. Proč to v C# nejde pomocí
Práce s polem a pamětí
3 Práce s polem a pamětí Inicializace jednorozměrného pole Jednorozměrné pole lze inicializovat přímo v deklaraci. int array[length] = {1, 5, 8, 9; array1d Prvky pole umístíte do složených závorek a oddělíte
Ukazatel (Pointer) jako datový typ - proměnné jsou umístěny v paměti na určitém místě (adrese) a zabírají určitý prostor (počet bytů), který je daný
Ukazatel (Pointer) jako datový typ - proměnné jsou umístěny v paměti na určitém místě (adrese) a zabírají určitý prostor (počet bytů), který je daný typem proměnné - ukazatel je tedy adresa společně s
PREPROCESOR POKRAČOVÁNÍ
PREPROCESOR POKRAČOVÁNÍ Chybová hlášení V C# podobně jako v C++ existuje direktiva #error, která způsobí vypsání chybového hlášení překladačem a zastavení překladu. jazyk C# navíc nabízí direktivu #warning,
Programování v C++ 3, 3. cvičení
Programování v C++ 3, 3. cvičení úvod do objektově orientovaného programování 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled Dokončení spojového
PB161 Programování v jazyce C++ Přednáška 10
.. PB161 Programování v jazyce C++ Přednáška 10 Šablony Nikola Beneš 23. listopadu 2015 PB161 přednáška 10: šablony 23. listopadu 2015 1 / 29 K zamyšlení Jaký je rozdíl mezi new int[10] a new int[10]()?
Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39
Programování v C# Hodnotové datové typy, řídící struktury Petr Vaněček 1 / 39 Obsah přednášky Referenční datové typy datové položky metody přístupové metody accessory, indexery Rozhraní Pole 2 / 39 Třídy
8 Třídy, objekty, metody, předávání argumentů metod
8 Třídy, objekty, metody, předávání argumentů metod Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost třídám a objektům, instančním
Matematika v programovacích
Matematika v programovacích jazycích Pavla Kabelíková am.vsb.cz/kabelikova pavla.kabelikova@vsb.cz Úvodní diskuze Otázky: Jaké programovací jazyky znáte? S jakými programovacími jazyky jste již pracovali?
PB071 Programování v jazyce C Jaro 2017
Programování v jazyce C Jaro 2017 Typový systém, Dynamická alokace Typový systém Typový systém - motivace Celé znaménkové číslo se reprezentuje nejčastěji v dvojkovém doplňkovém kódu ival1 = 5 (dvojkový
PŘETĚŽOVÁNÍ OPERÁTORŮ
PŘETĚŽOVÁNÍ OPERÁTORŮ Jazyk C# podobně jako jazyk C++ umožňuje přetěžovat operátory, tj. rozšířit definice některých standardních operátorů na uživatelem definované typy (třídy a struktury). Stejně jako
Programování v C++, 2. cvičení
Programování v C++, 2. cvičení 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled 1 Operátory new a delete 2 3 Operátory new a delete minule
Tabulka symbolů. Vazba (binding) Vazba - příklad. Deklarace a definice. Miroslav Beneš Dušan Kolář
Vazba (binding) Tabulka symbolů Miroslav Beneš Dušan Kolář vazba = spojení mezi entitou a vlastností okamžik vazby (binding time) při návrhu jazyka při implementaci jazyka během překladu/spojování/zavádění
Dynamická alokace paměti
Dynamická alokace paměti doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 13. března 2017 Jiří Dvorský (VŠB TUO) Dynamická alokace
Principy objektově orientovaného programování
Principy objektově orientovaného programování Třídy a objekty doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 / 597 324 213 http://www.cs.vsb.cz/benes Miroslav.Benes@vsb.cz C E T
Dynamicky vázané metody. Pozdní vazba, virtuální metody
Dynamicky vázané metody Pozdní vazba, virtuální metody Motivace... class TBod protected: float x,y; public: int vrat_pocet_bodu() return 1; ; od třídy TBod odvodíme: class TUsecka: public TBod protected:
Programování v C++ 1, 17. cvičení
Programování v C++ 1, 17. cvičení výjimky 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled 1 2 Shrnutí minule procvičené látky Binární vyhledávací
Spojová implementace lineárních datových struktur
Spojová implementace lineárních datových struktur doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 13. března 2017 Jiří Dvorský (VŠB
Programování v C++ VI
Programování v C++ VI Konstruktory, destruktory a dědičnost Konstruktory a dědičnost I když jsme se bavili o dědičnosti, trochu jsme zapomněli na konstruktory to se ale nevyplácí, vzpomeňte si, jak důležitý
Abstraktní datové typy
Karel Müller, Josef Vogel (ČVUT FIT) Abstraktní datové typy BI-PA2, 2011, Přednáška 10 1/27 Abstraktní datové typy Ing. Josef Vogel, CSc Katedra softwarového inženýrství Katedra teoretické informatiky,
Programování v C++ 1, 5. cvičení
Programování v C++ 1, 5. cvičení konstruktory, nevirtuální dědění 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled 1 2 3 Shrnutí minule procvičené
14.4.2010. Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.
Základy programování (IZAPR) Přednáška 7 Ing. Michael Bažant, Ph.D. Katedra softwarových technologií Kancelář č. 229, Náměstí Čs. legií Michael.Bazant@upce.cz Obsah přednášky 7 Parametry metod, předávání
Dědičnost (inheritance)
Dědičnost (inheritance) Úvod Umožňuje objektům převzít (zdědit) členy jiných objektů a pouze je rozšířit o Auto: lze odvodit Vztah je osobní auto, cisterna jsou auta Základní pojmy Bázová třída (rodič)
Singleton obsah. Motivace Základní myšlenka Implementace Problémy. Dědičnost Obecná implementace Shrnutí. destrukce vícevláknovost
Singleton Singleton obsah Motivace Základní myšlenka Implementace Problémy destrukce vícevláknovost Dědičnost Obecná implementace Shrnutí Singleton motivace Co mají následující příklady společného? DatabaseConnectionPool
Programování v jazyce C a C++
Programování v jazyce C a C++ Příklad na tvorbu třídy Richter 1 4. prosince 2017 1 Ing. Richter Miloslav, Ph.D., UAMT FEKT VUT Brno Dvourozměrné pole pomocí tříd Zadání Navrhněte a napište třídu pro realizace
Datové typy v Javě. Tomáš Pitner, upravil Marek Šabo
Datové typy v Javě Tomáš Pitner, upravil Marek Šabo Úvod k datovým typům v Javě Existují dvě základní kategorie datových typů: primitivní a objektové Primitivní v proměnné je uložena přímo hodnota např.
MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ
MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ 1) PROGRAM, ZDROJOVÝ KÓD, PŘEKLAD PROGRAMU 3 2) HISTORIE TVORBY PROGRAMŮ 3 3) SYNTAXE A SÉMANTIKA 3 4) SPECIFIKACE
Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007
Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2006/2007 c 2006 Michal Krátký Úvod do programovacích jazyků
PB071 Principy nízkoúrovňového programování
Principy nízkoúrovňového programování Typový systém, Dynamická alokace Slidy pro komentáře (děkuji!): https://drive.google.com/open?id=1tnv JzyDVOb_2p9emjqyv-z-7vs80AyYQ Pokus: komentáře ke slidům Komentář
Z. Kotala, P. Toman: Java ( Obsah )
Z. Kotala, P. Toman: Java ( Obsah ) 13. Výjimky Výjimka (exception) je definována jako událost, která nastane během provádění programu a která naruší normální běh instrukcí. Výjimka je vyvolána například
Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace
Programování v jazyce C a C# část I. Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace Předmět: Algoritmizace a programování Téma: Programování Vyučující: Ing. Milan Káža
Přetěžování operátorů, dynamika objektů 2
Přetěžování operátorů, dynamika objektů 2 Karel Richta a kol. katedra počítačů FEL ČVUT v Praze Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016 Programování v C++, A7B36PJC 03/2016, Lekce 6 https://cw.fel.cvut.cz/wiki/courses/a7b36pjc/start
C++ přetěžování funkcí a operátorů. Jan Hnilica Počítačové modelování 19
C++ přetěžování funkcí a operátorů 1 Přetěžování funkcí jazyk C++ umožňuje napsat více funkcí se stejným názvem, těmto funkcím říkáme přetížené přetížené funkce se musí odlišovat typem nebo počtem parametrů,
Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky
JAVA Třídy Definice třídy úplná definice [public] [abstract] [final] class Jmeno [extends Predek] [impelements SeznamInterfacu] {... // telo tridy public veřejná třída abstract nesmí být vytvářeny instance
Ukazka knihy z internetoveho knihkupectvi www.kosmas.cz
Ukazka knihy z internetoveho knihkupectvi www.kosmas.cz Upozornění pro čtenáře a uživatele této knihy Všechna práva vyhrazena. Žádná část této tištěné či elektronické knihy nesmí být reprodukována a šířena
Základy programování 2 KMI/ZP2
Základy programování 2 KMI/ZP2 Petr Osička KATEDRA INFORMATIKY UNIVERZITA PALACKÉHO V OLOMOUCI Adresování paměti Adresování paměti Posloupnost bajtů očíslovaných od nuly podobně jako pole. Adresa = index
Programování v C++ 2, 8. cvičení
Programování v C++ 2, 8. cvičení návrhový vzor iterátor 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled 1 2 Shrnutí minule procvičené látky
Funkční objekty v C++.
Funkční objekty v C++. Funkční objekt je instance třídy, která má jako svou veřejnou metodu operátor (), tedy operátor pro volání funkce. V dnešním článku si ukážeme jak zobecnit funkci, jak používat funkční
PROGRAMOVÁNÍ V C++ CVIČENÍ. Michal Brabec
PROGRAMOVÁNÍ V C++ CVIČENÍ Michal Brabec ARCHITECTURE Input 2 / 15 TASK Vytvořte základní data pro filesystem (zatím v main) Jednu autorizační autoritu Jeden registr souborů Cyklus který zpracovává vstup
int ii char [16] double dd název adresa / proměnná N = nevyužito xxx xxx xxx N xxx xxx N xxx N
Struktura (union) - struktura a union jsou složené typy, které "v sobě" mohou obsahovat více proměnných - struktura obsahuje v každém okamžiku všechny své proměnné, union obsahuje (=je "aktivní") pouze
Programování II. Návrh programu I 2018/19
Programování II Návrh programu I 2018/19 Osnova přednášky Co víme? Objektový návrh programu. Příklad. Co víme? Třída Třída je popisem objektů se společnými vlastnostmi. class private:
IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33
Objekt jako proměnná Objekty a metody Objekt = proměnná referenčního typu vznik pomocí new, chování viz pole jako referenční proměnná minulý semestr Stack Heap objekt ref this 10 20 atr1 atr2 jinyobjekt
Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++
Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++ Třídy v C++ Třídy jsou uživatelsky definované typy podobné strukturám v C, kromě datových položek (proměnných) však mohou obsahovat i funkce
Bridge. Známý jako. Účel. Použitelnost. Handle/Body
Bridge Bridge Známý jako Handle/Body Účel odděluje abstrakci (rozhraní a jeho sémantiku) od její konkrétní implementace předchází zbytečnému nárůstu počtu tříd při přidávání implementací používá se v době
Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky
JAVA Třídy Definice třídy úplná definice [public] [abstract] [final] class Jmeno [extends Predek] [impelements SeznamInterfacu] {... // telo tridy public veřejná třída abstract nesmí být vytvářeny instance
NMIN102 Programování /2 Z, Zk
NMIN102 Programování 2 --- 2/2 Z, Zk Pavel Töpfer Katedra softwaru a výuky informatiky MFF UK MFF Malostranské nám., 4. patro, pracovna 404 pavel.topfer@mff.cuni.cz http://ksvi.mff.cuni.cz/~topfer Pavel
Pokročilé programování v jazyce C pro chemiky (C3220) Statické proměnné a metody, šablony v C++
Pokročilé programování v jazyce C pro chemiky (C3220) Statické proměnné a metody, šablony v C++ Globální konstantní proměnné Konstantní proměnné specifikujeme s klíčovým slovem const, tyto konstantní proměné
Distanční opora předmětu: Programování v jazyce C Tématický blok č. 6: Dynamická alokace paměti, typové konstrukce Autor: RNDr. Jan Lánský, Ph.D.
Distanční opora předmětu: Programování v jazyce C Tématický blok č. 6: Dynamická alokace paměti, typové konstrukce Autor: RNDr. Jan Lánský, Ph.D. Obsah kapitoly 1 Dynamická alokace paměti 2 Organizace
Programování v C++ 2, 7. cvičení
Programování v C++ 2, 7. cvičení spojový seznam 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled 1 2 Shrnutí minule procvičené látky Dědění
Objektově orientované programování
10. října 2011 Pragmatické informace Volitelný předmět, zápočet: zápočtový program(s dokumentací), aktivní účast na cvičení(body v CodExu), praktický test, zkouška: zkoušková písemka na objektový návrh
Základy C++ I. Jan Hnilica Počítačové modelování 18
Základy C++ I 1 Přechod z C na C++ jazyk C++ je nadmnožinou jazyka C z hlediska syntaxe se jedná o velmi podobné jazyky, spolu s dalšími jazyky "céčkovské" rodiny, jako je např. C# každý platný program
Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí
Kolekce obecně Seznamy a iterátory doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 / 597 324 213 http://www.cs.vsb.cz/benes Miroslav.Benes@vsb.cz Kolekce ::= homogenní sada prvků
7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd
7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd Algoritmizace (Y36ALG), Šumperk - 7. přednáška 1 Třída jako zdroj funkcionality Třída v jazyku Java je programová jednotka tvořená
4. ZÁKLADNÍ POJMY Z OBJEKTOVĚ ORIENTOVANÉHO PROGRAMOVÁNÍ
4. ZÁKLADNÍ POJMY Z OBJEKTOVĚ ORIENTOVANÉHO PROGRAMOVÁNÍ OBJEKT Program v Javě je staticky strukturován na třídy, jejichž instance (objekty) za běhu dynamicky programu vznikají a zanikají. Objekt je nejprve
Správné vytvoření a otevření textového souboru pro čtení a zápis představuje
f1(&pole[4]); funkci f1 předáváme hodnotu 4. prvku adresu 4. prvku adresu 5. prvku hodnotu 5. prvku symbolická konstanta pro konec souboru je eof EOF FEOF feof Správné vytvoření a otevření textového souboru
PB161 Programování v jazyce C++ Přednáška 1
PB161 Programování v jazyce C++ Přednáška 1 Organizace Úvod do C++ Nikola Beneš 18. září 2018 PB161 přednáška 1: organizace, úvod do C++ 18. září 2018 1 / 36 Cíle předmětu 1. ukázat možnosti jazyka C++
PB161 programování v C++ Výjimky Bezpečné programování
PB161 programování v C++ Výjimky Bezpečné programování Chyby... Snaha psát programy bez chyb myslet : ) Snaha psát programy se schopností fault tolerance. snaha se z chybového stavu dostat lze řešit testováním