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.)
|
||||
# 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 <memory> //tohle je na smart ukazatele
|
||||
#include <vector>
|
||||
|
||||
struct Node {int value;};
|
||||
|
||||
void main(void){
|
||||
auto p = std::make_unique<Node>(); // 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 <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
|
||||
### 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.
|
||||
|
||||
Reference in New Issue
Block a user