Search
Ve cvičení se seznámíme se základy tvorby tříd a objektů v C++.
Vzorové příklady najdete buď v repozitáři v adresáři tut03.
Třídu lze v C++ deklarovat pomocí klíčových slov class a struct.
class
struct
class TridaA { int value; }; struct TridaB { int value; };
Rozdíl mezi třídami A a B je ve viditelnosti členské proměnné value. Zatímco v prvním případě je private, v druhém případě je public. Praktickým důsledkem je nemožnost přímé nastavení hodnoty proměnné A.value.
A
B
value
private
public
A.value
Třída vytváří nový datový typ. Instanci třídy, objekt, tedy vytváříme jako proměnnou tohoto datového typu:
TridaA a; TridaB b;
Ke členským proměnným v tomto případě (proměnné jsou v zásobníku) přístupujeme stejně, jako ke členským proměnným struktury:
a.value = 10; b.value = 20;
Bude tato incializace fungovat?
Konstruktor je funkce, která je zodpovědná za vytvoření instance třídy. V C++ je to veřejná metoda třídy, která se jmenuje stejně jako třída a nemá návratový typ. Konstruktor je volán automaticky při vytváření objektu.
Pozorný čtenář si jistě všiml, že předchozí třídy žádný konstruktor neobsahovaly, přesto byl objekt vytvořen. Je to proto, že pokud není žádný konstuktor definován, použije kompilátor konstruktor implicitní - metodu bez parametrů a s prázdným tělem.
Následující kód ukáže, že je konstruktor, který je tentokrát již definován, automaticky spouštěn při instancionování objektu:
struct TridaA { TridaA () {std::cout << "volani konstruktoru\n";} }; int main() { TridaA a; }
A co destruktor? Destruktor je funkce, která je automaticky volána na konci platnosti objektu (proměnné). Jeho definice vypadá třeba následovně:
~TridaA () {std::cout << "volani destruktoru" << std::endl;}
Dobrou praxí je konstruktor využívat jen pro inicializaci atributů objektu. Díky možnosti přetížení je možné vytvářet varianty podle aktuální potřeby.
Pro alokaci objektu v dynamické paměti se v C++ používá operátor new. Argumentem operátoru je konstruktor, operátor v případě úspěšné alokace vrací ukazatel na datový typ, který popisuje příslušná třída.
new
TridaA *b = new TridaA;
Pro dealokaci se používá operátor delete.
delete
delete b;