zpracovano nekolik otazek z programovani v c++

This commit is contained in:
2026-03-29 20:26:51 +02:00
parent b32a47575d
commit e54496826d

View File

@@ -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.