headerphoto

Konstruktor, destruktor

Každá instance je vytvořena pomocí speciální metody - konstruktoru. Konstruktor vytváří a inicializuje objekty třídy. Konstruktor má několik vlastností:
- jmenuje se stejně jako třída, jejíž instance bude vytvářet
- nemá návratovou hodnotu (ani void)
- je součástí definice třídy, je veřejný
- často je přetěžovaný.
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ě

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 s vlastními konstruktory  
   class Vozidlo      
  {                     
    private:           
       string Spz;   
       int RokVyroby;  
       int MaxRychlost;       
    public:
       Vozidlo(); //kdyz pouzivame parametricke konstruktory
                //musime vzdy definovat taky vlastni bezparametricky konstruktor 
       Vozidlo(string s);             
       Vozidlo(string s, int rv, int rych);                   
       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()
    {
       Spz = "";        //je vhodne nastavit vychozi hodnoty pro vsechny atributy
       RokVyroby = 1950;  
       MaxRychlost = 0;           
    }

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

    Vozidlo::Vozidlo(string s, int rv, int rych)
    {
       Spz = s;
       RokVyroby = rv;
       MaxRychlost = rych;         
    }

   

Konstruktory potom používáme při vytváření instancí (objektů) v programu:

Vozidlo nove("5T8 1111"), dalsi ("5T8 2222", 2015, 160);

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.


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