3.1. Konstruktory a destruktory

Časová náročnost
Časová náročnost: 25 minut

Určitě víte, že v programech je zcela běžné, že některé jeho části vyžadují inicializaci. Potřeba inicializace je mnohem častější v případě, když pracujeme s objekty. Ve skutečnosti vyžadují určitý typ inicializace všechny objekty, kterém vytváříme. K ošetření této situace má C++ funkci konstruktor, která může být vložena do deklarace třídy. Konstruktor třídy je volán vždy, když je vytvářen objekt dané třídy. Všechny inicializace, které je nutno na objektu provést, může vykonat právě konstruktor.

upozornění Konstruktorstejné jméno jako třída, jejíž je součástí a nemá návratový typ. Následující příklad ukazuje krátkou třídu, která obsahuje konstruktor.

src/3_1.cpp
Příklad 3.1.
#include <iostream.h>

class myclass {
  int a;
public:
  myclass(); // konstruktor
  void show();
};

myclass::myclass()
{
  cout << "V konstruktoru\n";
  a = 10;
}

void myclass::show()
{
  cout << a;
}

int main()
{
  myclass ob;

  ob.show();

  return 0;
}

V tomto příkladu je hodnota a inicializována konstruktorem myclass(). Konstruktor je volán při vytváření objektu ob. Objekt je tedy vytvářen tehdy, když se provádí jeho deklarace. V C++ je deklarační příkaz proměnné vlastně příkazem činnosti.

Všimněte si, že myclass() nemá definovaný návratový typ. Vzhledem k formálním syntaktickým pravidlům není v C++ povoleno, aby měl konstruktor návratový typ.

upozornění Pro globální objekty je konstruktor objektu volán jen jednou, když se program začíná poprvé spouštět. Pro lokální objekty je konstruktor volán pokaždé, když je prováděn deklarační příkaz. Doplňkem konstruktoru je destruktor. Tato funkce je volána, když je objekt rušen. Když pracujete s objekty, je běžné, že se musí provést v souvislosti s rušením objektu nějaké akce. A právě o provádění těchto akcí se stará destruktor.

upozornění Jméno destruktoru je stejné jako jméno jeho třídy, ale je uvozeno znakem ~.

Přidáme do předcházejícího příkladu destruktor.

src/3_2.cpp
Příklad 3.2.
#include <iostream.h>

class myclass {
  int a;
public:
  myclass(); // konstruktor
  ~myclass(); //destruktor
  void show();
};

myclass::myclass()
{
  cout << "V konstruktoru\n";
  a = 10;
}

myclass::~myclass()
{
 cout << "V destruktoru\n";
} 

void myclass::show()
{
  cout << a;
}

int main()
{
  myclass ob;

  ob.show();

  return 0;
}


Destruktor třídy je volán, když je objekt rušen. Lokální objekty jsou rušeny, když odcházejí mimo oblast. Globální objekty jsou rušeny, když program končí. Není možné získat adresu konstruktoru a destruktoru.

Následující program využívá objekt třídy timer ke zjištění délky intervalu mezi vytvořením zrušením objektu a zobrazuje uplynulý čas.

src/3_3.cpp
Příklad 3.3.
#include <iostream.h>
#include <time.h>

class timer {
  clock_t start;
public:
  timer(); // konstruktor
  ~timer(); // destruktor
};

timer::timer()
{
  start = clock();
}

timer::~timer()
{
  clock_t end;

  end = clock();
  cout << "Interval: " << (end-start) / CLOCKS_PER_SEC << "\n";
}

int main()
{
  timer ob;
  char c;

  // zpozdeni ...
  cout << "Stiskni klavesu a pote ENTER: ";
  cin >> c;

  return 0;
}


Funkci konstruktoru není možné předávat argumenty. Aby to bylo možné, je třeba přidat do deklarace a definice funkce konstruktoru vhodné argumenty. Pak, když deklarujeme objekt, specifikujeme argumenty.

src/3_4.cpp
Příklad 3.4.
#include <iostream.h>

class myclass {
  int a;
public:
  myclass(int x); // konstruktor
  void show();
};

myclass::myclass(int x)
{
  cout << "V konstruktoru\n";
  a = x;
}
void myclass::show()
{
  cout << a << "\n";
}

int main()
{
  myclass ob(4);

  ob.show();

  return 0;
}

Konstruktor zde přebírá jeden argument. Hodnota předávaná do myclass() je využita k inicializace a. Hodnota 4 ve funkci main() specifikována v závorkách za ob je argumentem, který se předává do x, což je argument myclass() použitý v deklaraci a.

upozornění Na rozdíl od konstruktoru nemůže mít destruktor žádné argumenty. Příčina je snadno pochopitelná - neexistuje totiž mechanismus, který by umožnil předávat argument rušenému objektu.

flash\kondes.swf
Flashová animace
Kliknutím na ikonu spustíte animaci.