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(string s);             
       Vozidlo(string s, int rv);                   
       bool NastavSpz(string s);        
       void NastavRokVyroby(int rv);       
       string DejSpz() const;       
       int DejRokVyroby() const;    
   };            
  
   

Konstruktory použijeme k inicializaci objektů. Můžeme je definovat například následovně.

    Vozidlo::Vozidlo()
    {
       this->Spz = "";        //je vhodne nastavit vychozi hodnoty pro vsechny atributy
       this->RokVyroby = 1950;  
       this->MaxRychlost = 0;           
    }

    Vozidlo::Vozidlo(string s)
    {
       this->Spz = s;
       this->RokVyroby = 1950;   
       this->MaxRychlost = 0;          
    }

    Vozidlo::Vozidlo(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);

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


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
  


Design downloaded from Free Templates - your source for free web templates