Konstruktor, destruktor
Každá instance je vytvořena pomocí speciální metody - konstruktoru. Konstruktor se musí jmenovat stejně jako třída, jejíž instance bude vytvářet, nesmí mít návratovou hodnotu (ani void) a měl by být veřejný. Každá třída může mít k dispozici více konstruktorů s různými parametry. V případě, že třída nemá žádný konstruktor, vytvoří překladač tzv. implicitní konstruktor bez parametrů.
V konstruktoru by se měla provést inicializace dané instance. Obecně konstruktor vytváří a inicializuje objekty třídy.
V předchozí kapitole jsme definovali třídu Vozidlo. Neměla žádný konstruktor, instance (prvni, druhe) se vytvořili pomocí implicitního konstruktoru. Ukážeme si, jak by vypadala stejná třída s vlastními konstruktory. Můžeme vytvořit více různých konstruktorů (= přetížení konstruktoru), všechny mají ale název stejný jako je název třídy.
// příklad definice třídy
class Vozidlo
{
private:
string Spz;
int RokVyroby;
int MaxRychlost;
public:
Vozidlo(); //musime uvest, kdyz pouzivame i parametricke konstruktory
Vozidlo(const string s);
Vozidlo(const string s, int rv);
bool NastavSpz(const string s);
void NastavRokVyroby(int rv);
string DejSpz() const;
int DejRokVyroby() const;
void VypisVozidlo() const;
};
Konstruktory použijeme k inicializaci objektů. Můžeme je definovat například následovně.
Vozidlo::Vozidlo()
{
//je vhodne nastavit vychozi hodnoty pro vsechny atributy
this->Spz = "";
this->RokVyroby = 1950;
this->MaxRychlost = 0;
}
Vozidlo::Vozidlo(const string s)
{
//nastavime pozadovanou vlastnost na danou hodnotu
this->Spz = s;
//je vhodne nastavit vychozi hodnoty pro ostatni atributy
this->RokVyroby = 1950;
this->MaxRychlost = 0;
}
Vozidlo::Vozidlo(const string s, int rv)
{
this->Spz = s;
this->RokVyroby = rv;
this->MaxRychlost = 0;
}
Konstruktory potom používáme při vytváření instancí v programu:
Vozidlo nove("5T8 1111"), dalsi ("5T8 2222", 2015);
Konstruktor můžeme taky definovat přímo ve třídě tzv. inline. Jednotlivé konstruktory potom budou zapsány následovně :
//jiný zápis výše uvedených definicí:
Vozidlo(): Spz(""), RokVyroby(1950), MaxRychlost(0) {}
Vozidlo(const string s): Spz(s), RokVyroby(1950), MaxRychlost(0) {}
Vozidlo(const string s, int rv): Spz(s), RokVyroby(rv), MaxRychlost(0) {}
Destruktor je rovněž standardní metoda každé třídy, která provádí činnost související s rušením objektu. Není-li ve třídě destruktor explicitně definován programátorem, kompilátor vytvoří implicitní destruktor. Explicitní destruktor se jmenuje stejně jako třída a před její jméno se vloží ~, nesmí mít žádné parametry, nic nevrací, nesmí být přetížen, musí být deklarován jako public.
Ve většině programů nebudeme destruktor uvádět, spolehneme se na implicitní destruktor. Praktický význam má destruktor např. v souvislosti s uvolňováním paměti po objektech, které jsou dynamicky alokovány.