Třídy - doplnění
V této části se budeme nejdříve zabývat použitím soukromých metod a potom ukázkami dynamické alokace objektů.
Soukromé metody
V předchozích kapitolách jsme všechny metody, které jsme vytvořili, označily jako veřejné. Byly to tedy metody, které můžeme používat v souvislosti s objektem dané třídy kdekoliv v programu.
V objektu můžeme ale používat taky soukromé metody, ty jsou použitelné jenom v ostatních metodách třídy. Jako soukromé označujeme nejčastěji různé ověřovací metody. Jedná se o metody, které kontrolují použití správných hodnot u datových položek třídy.
Doplníme si do třídy Vozidlo metodu pro ověření roku výroby. Povolíme jenom hodnoty 1950 až 2050. Metoda v případě špatné hodnoty nastaví nejbližší hodnotu.
// příklad definice třídy class Vozidlo { private: string Spz; int RokVyroby; int MaxRychlost; int SpravnyRok(int r) ; //overovaci soukroma metoda public: Vozidlo(); //musime uvest, kdyz pouzivame i parametricke konstruktory Vozidlo(string s); Vozidlo(string s, int rv); bool NastavSpz(string s); void NastavRokVyroby(int rv); string DejSpz() const; int DejRokVyroby() const; };
Metodu si musíme nově definovat. Potom tuto metodu použijeme ve všech metodách, kde nastavujeme rok.
int Vozidlo::SpravnyRok(int r) { if (r < 1950) r = 1950; if (r > 2050) r = 2050; return r; } Vozidlo::Vozidlo(string s, int rv) { this->Spz = s; this->RokVyroby = SpravnyRok(rv); this->MaxRychlost = 0; } void Vozidlo::NastavRokVyroby(int rv) { this->RokVyroby = SpravnyRok(rv); }
Dynamická alokace paměti
Jazyk C++ nabízí nové operátory new pro alokaci a delete pro uvolnění paměti. Operátor new zná třídu objektu, automaticky volá její konstruktor a také vrací příslušný typ ukazatele. Není třeba přetypovávat, během přiřazení probíhá typová kontrola. Uvolnění paměti, která byla alokována operátorem new, se musí provést pomocí operátoru delete. Tento operátor automaticky volá destruktor třídy.
Za klíčové slovo new píšeme označení typu proměnné, kterou chceme alokovat. Operátor vybere z volné paměti potřebné místo a vrátí ukazatel na ně. Pokud se operace nepodaří, vrátí se hodnota 0, což nepředstavuje platnou adresu.
double *prom; prom = new double; if (!prom) Chyba( ); //jestliže se alokace nezdařila, voláme funkci Chyba() double *prom1; prom1 = new double(5.23); //vytvoření s inicializací if (!prom1) Chyba( ); Vozidlo *x, *y; x = new Vozidlo(); //použití new pro třídu Vozidlo y = new Vozidlo("1T1 7777", 2000); //můžeme použít kterýkoliv konstruktor int *pole; pole = new int[100]; //u pole nemůžeme použít inicializaci delete prom; //uvolnění paměti