3.1. Konstruktory a destruktory
| Č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.
|
Konstruktor má stejné 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.
|
| 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.
|
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.
|
|
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.
|
| 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.
| 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.
| 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.
|
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.
|
| Flashová animace |
|
Kliknutím na ikonu spustíte animaci.
|