diff --git a/Zpracované Otázky.md b/Zpracované Otázky.md index f34ff02..3bcf1c5 100644 --- a/Zpracované Otázky.md +++ b/Zpracované Otázky.md @@ -1,4 +1,4 @@ -zatím nic moc, skoro nic nemám a není to moc podrobné + Poznámka: Příklady jsou zjednodušené a ne vždy jsou 100% syntakticky právně (nechci vždy psát int main(void)... etc.) # Principy objektového programování 1) Jaký je rozdíl mezi třídou a objektem? @@ -163,23 +163,105 @@ Používají se často alternativy, například smart pointer -> drží pointer Trida* objekty = new Trida[7]; delete[] objekty; //uvolni cele pole objektu ``` -### Jaká je návratová hodnota destruktoru? -### Co je třeba zajistit při dynamické alokaci? Uveďte příklad. -### Co je to výjimka a k čemu je dobrá? Uveďte příklad. -### Kolik výjimek je možné v programu ošetřit? -### Co je to generická funkce? -### Jak lze vytvořit explicitní instanci generické funkce? K čemu je to dobré? -### Jak jsou obvykle parametrizovány šablony tříd? -### V čem spočívá problém vícenásobného dědění? Jak je možné tomuto problému zabránit? -### Co je to zapouzdření a čemu je dobré? -### Jak lze využít implicitní hodnoty argumentu funkce? Uveďte příklad. -### Jaký je rozdíl mezi deklarací třídy pomocí class a struct? -### Co je to konverzní konstruktor? -### Jaký je rozdíl mezi statickou a dynamickou vazbou? -### Jaký je význam klíčového slova auto? Lze ho použít vždy? -### Co přesouvací (move) kontruktor? -### Co je pravidlo tří (rule of three)? -### Jaký je tvar definice lambda funkce v C++? Uveďte příklad a popište, co funkce dělá. +### 7) Jaká je návratová hodnota destruktoru? +Destruktor nemá návratovou hodnotu. Jako u funkce void se z něj dá vrátit pomocí `return;` +### 8) Co je třeba zajistit při dynamické alokaci? Uveďte příklad. +Při dynamické alokaci si hlavně musím dávat pozor na to, že mám nad pamětí nonstop kontrolu (například nikde neztratím ukazatel na ní) a že ji správně dealokuju (nedojde k úniku paměti). + +V moderním C++ to ale tolik řešit nemusím. Většinou použiju tzv. **smart pointer**. který automaticky dealokuje objekt, když skončí scope. + +```cpp +#include //tohle je na smart ukazatele +#include + +struct Node {int value;}; + +void main(void){ + auto p = std::make_unique(); // alokace +} //po konci main automatické uvolnění +``` +### 9) Co je to výjimka a k čemu je dobrá? Uveďte příklad. +Výjimky umožňuje kontrolovat chod programu a popasovat se s nečekanými chybami. Primárně jsou míněny pro řešení problémů, které programátor nemůže tak dobře ovlivnit, jako například práci se zdroji (třeba soubor) nebo množství dynamické paměti. + +Výjimky existují všeho různého druhu, zde je příklad kódu: +```cpp +try +{ + #nějaký kod +} + +//catch("Text") {} //nedává smysl, nechytá se hodnota, ale typ +catch(const std::bad_alloc& e) {} //vyjímka špatné alokace +catch(int) {} //chytí všechny integery - které manuálně vyhodím +catch(std::exception) {} //chytí všechny chyby (věci typu chyba) +catch(...) {} //chytí úplně všechno - i to co manuálně vyhodím +``` + +**Mám na tohle téma samostatný dokument, kde toto téma zpracovávám.** +### 10) Kolik výjimek je možné v programu ošetřit? +Tbh, nechápu tuhle otázku + +- Typů výjimek je hodně a kdyžtak si můžu vlastní dopsat. +- výjimek může program za běhu ošetřit neomezeně +- **Najednou (v jeden moment) je možné ošetřit pouze jednu výjimku. Pokud se jich objeví více (například z destruktorů), tak se pogram ukončí přes std::terminate** + +### 11) Co je to generická funkce? +Generická funkce je funkce, která umí přijímat či vracet libovolný datový typ. je to šikovná alternativa k přetěžování funkcí. + +K tomu používám `template `, kde `T` reprezentuje libovoloný datový typ (to je moje pojmenování, ale jmenovat se to může jak chce, T se používá často...). + +Příklad i s funkcí: +```cpp +template +T secti(T a, T b) +{ + return a + b; +} +``` +Zde sčítám nějaké 2 obecné datové typy. +### 12) Jak lze vytvořit explicitní instanci generické funkce? K čemu je to dobré? - DOCELA MIZERNĚ +[stackoverflow](https://stackoverflow.com/questions/2351148/explicit-template-instantiation-when-is-it-used#2351622) + +Explicitní instance je způsob, jak předem donutit kompilátor vytvořit šablonu - instanci generické funkce, než je použita. +```cpp +template int secti(int, int); +``` + +Ono to údajně umožní zrychlit kompilaci protože tomu řeknu, ať to vytvoří tu int verzi předem. +Normálně bych do `.h` souboru napsal: +``` +template +T secti(T a, T b); +``` + +ale můžu místo toho do `cpp` souboru napsat: +```cpp +template +T secti(T a, T b) { + return a + b; +} + +template int secti(int, int); // explicitní instance +``` + +kde se vytvoří verze s intem samostatně předem a pak místo toho, aby to kompilátor řešil 10x zrovna, když to potřebuje, tak to prostě zkopíruje. + +Also to umožní fungování je některým typům? + +Takže: +- umožní použití jen několik typů, které si určím +- zrychlý to kompilaci +### 13) Jak jsou obvykle parametrizovány šablony tříd? +### 14) V čem spočívá problém vícenásobného dědění? Jak je možné tomuto problému zabránit? +### 15) Co je to zapouzdření a čemu je dobré? +### 16) Jak lze využít implicitní hodnoty argumentu funkce? Uveďte příklad. +### 17) Jaký je rozdíl mezi deklarací třídy pomocí class a struct? +### 18) Co je to konverzní konstruktor? +### 19) Jaký je rozdíl mezi statickou a dynamickou vazbou? +### 20) Jaký je význam klíčového slova auto? Lze ho použít vždy? +### 21) Co přesouvací (move) kontruktor? +### 22) Co je pravidlo tří (rule of three)? +### 23) Jaký je tvar definice lambda funkce v C++? Uveďte příklad a popište, co funkce dělá. # STL kontejnery ### 1) Co je to kontejner? Kontejnery jsou datové struktury určené k ukládání kolekce dat (hodnot) a k manipulaci s nimi. Například to je `vector`, který funguje jako dynamické pole.