headerphoto

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.