zpracovano nekolik otazek z programovani v c++
This commit is contained in:
@@ -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.)
|
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í
|
# Principy objektového programování
|
||||||
1) Jaký je rozdíl mezi třídou a objektem?
|
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];
|
Trida* objekty = new Trida[7];
|
||||||
delete[] objekty; //uvolni cele pole objektu
|
delete[] objekty; //uvolni cele pole objektu
|
||||||
```
|
```
|
||||||
### Jaká je návratová hodnota destruktoru?
|
### 7) Jaká je návratová hodnota destruktoru?
|
||||||
### Co je třeba zajistit při dynamické alokaci? Uveďte příklad.
|
Destruktor nemá návratovou hodnotu. Jako u funkce void se z něj dá vrátit pomocí `return;`
|
||||||
### Co je to výjimka a k čemu je dobrá? Uveďte příklad.
|
### 8) Co je třeba zajistit při dynamické alokaci? Uveďte příklad.
|
||||||
### Kolik výjimek je možné v programu ošetřit?
|
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).
|
||||||
### Co je to generická funkce?
|
|
||||||
### Jak lze vytvořit explicitní instanci generické funkce? K čemu je to dobré?
|
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.
|
||||||
### 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?
|
```cpp
|
||||||
### Co je to zapouzdření a čemu je dobré?
|
#include <memory> //tohle je na smart ukazatele
|
||||||
### Jak lze využít implicitní hodnoty argumentu funkce? Uveďte příklad.
|
#include <vector>
|
||||||
### Jaký je rozdíl mezi deklarací třídy pomocí class a struct?
|
|
||||||
### Co je to konverzní konstruktor?
|
struct Node {int value;};
|
||||||
### Jaký je rozdíl mezi statickou a dynamickou vazbou?
|
|
||||||
### Jaký je význam klíčového slova auto? Lze ho použít vždy?
|
void main(void){
|
||||||
### Co přesouvací (move) kontruktor?
|
auto p = std::make_unique<Node>(); // alokace
|
||||||
### Co je pravidlo tří (rule of three)?
|
} //po konci main automatické uvolnění
|
||||||
### Jaký je tvar definice lambda funkce v C++? Uveďte příklad a popište, co funkce dělá.
|
```
|
||||||
|
### 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 <typename T>`, 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 <typename T>
|
||||||
|
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, 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 <typename T>
|
||||||
|
T secti(T a, T b);
|
||||||
|
```
|
||||||
|
|
||||||
|
ale můžu místo toho do `cpp` souboru napsat:
|
||||||
|
```cpp
|
||||||
|
template <typename T>
|
||||||
|
T secti(T a, T b) {
|
||||||
|
return a + b;
|
||||||
|
}
|
||||||
|
|
||||||
|
template int secti<int>(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
|
# STL kontejnery
|
||||||
### 1) Co je to kontejner?
|
### 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.
|
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.
|
||||||
|
|||||||
Reference in New Issue
Block a user