168 Godzina 12
Występuje tutaj jeszcze jeden, dodatkowy koszt. Każda kopia obiektu jest wykonywana za pomocą specjalnego konstruktora, a mianowicie konstruktora kopiującego. W trakcie godziny 20, „Specjalne klasy i funkcje”, nauczysz się, jak działają kon-struktory kopiujące i jak, we własnej klasie, stworzyć konstruktor kopiujący wywoływany przy tworzeniu chwilowej kopii obiektu na stosie.
Kiedy taki chwilowy obiekt jest kasowany (np. w momencie wyjścia z funkcji) to zostaje wywołany destruktor klasy, do której ten obiekt należy. Jeśli obiekt jest wartością zwracaną to również musi być najpierw stworzony, a następnie skasowany.
W przypadku dużych obiektów, zarówno konstruktor jak i destruktor, pochłaniają dużo czasu procesora i pamięci. Ilustruje to listing 12.1. W tym programie tworzymy klasę ZwyklyKot. Rzeczywisty obiekt byłby dużo większy, ale ten przykład dostatecznie dobrze pokazuje jak często są wywoływane konstruktory i destruktory w trakcie normalnej pracy programu.
Listing 12.1. tworzy klasę ZwyklyKot i wywołuje dwie funkcje. Pierwsza funkcja pobiera obiekt klasy ZwyklyKot przez wartość i zwraca go, również przez wartość. Druga funkcja pobiera wskaźnik do obiektu (a nie sam obiekt) i zwraca również wskaźnik.
1: // Listing 12.1
2: // Przekazywanie obiektów przez referencje
3:
4: #include <iostream.h>5:
6: class ZwyklyKot7: {
// konstruktor // konstruktor kopiujący // destruktor
8: public:
9: ZwyklyKot ();
10: ZwyklyKot(ZwyklyKotS);
11: -ZwyklyKot();
13:
14: ZwyklyKot::ZwyklyKot()15: {
16: cout « "Konstruktor zwykłego kota...\n";
18:
19: ZwyklyKot::ZwyklyKot(ZwyklyKotS)20: {
21: cout « "Konstruktor kopiujący zwykłego kota...\n";
22: }
23:
24: ZwyklyKot::-ZwyklyKot()25: {
26: cout « "Destruktor zwykłego kota...\n";
28:
29: ZwyklyKot FunkcjaPierwsza (ZwyklyKot Kot);
30: ZwyklyKot* FunkcjaDruga (ZwyklyKot *Kot);
31:
32: int main()33: {
34: cout « "Tworzenie kota...\n";
35: ZwyklyKot Frisky;
36: cout « "Wywołanie FunkcjaPierwsza...\n";
37: FunkcjaPierwsza(Frisky);
38: cout « "Wywołanie FunkcjaDruga...\n";
Występuje tutaj jeszcze jeden, dodatkowy koszt. Każda kopia obiektu jest wykonywana za pomocą specjalnego konstruktora, a mianowicie konstruktora kopiującego. W trakcie godziny 20, „Specjalne klasy i funkcje”, nauczysz się, jak działają kon-struktory kopiujące i jak, we własnej klasie, stworzyć konstruktor kopiujący wywoływany przy tworzeniu chwilowej kopii obiektu na stosie.
Kiedy taki chwilowy obiekt jest kasowany (np. w momencie wyjścia z funkcji) to zostaje wywołany destruktor klasy, do której ten obiekt należy. Jeśli obiekt jest wartością zwracaną, to również musi być najpierw stworzony, a następnie skasowany.
W przypadku dużych obiektów, zarówno konstruktor jak i destruktor, pochłaniają dużo czasu procesora i pamięci. Ilustruje to listing 12.1. W tym programie tworzymy klasę ZwyklyKot. Rzeczywisty obiekt byłby dużo większy, ale ten przykład dostatecznie dobrze pokazuje jak często są wywoływane konstruktor}' i destruktory w trakcie normalnej pracy programu.
Listing 12.1. tworzy klasę ZwyklyKot i wywołuje dwie funkcje. Pierwsza funkcja pobiera obiekt klasy ZwyklyKot przez wartość i zwraca go, również przez wartość. Druga funkcja pobiera wskaźnik do obiektu (a nie sam obiekt) i zwraca również wskaźnik.
1: // Listing 12.1
2: // Przekazywanie obiektów przez referencje
3:
4: Dinclude <iostream.h>5:
6: class ZwyklyKot7: {
8: public:
9: ZwyklyKot (); // konstruktor
10: ZwyklyKot(ZwyklyKotS); // konstruktor kopiujący
11: -ZwyklyKot(); II destruktor
13:
14: ZwyklyKot::ZwyklyKot()15: {
16: cout « "Konstruktor zwykłego kota...\n";
18:
19: ZwyklyKot::ZwyklyKot(ZwyklyKotS)20: {
21: cout « "Konstruktor kopiujący zwykłego kota...\n";
22: )
23:
24: ZwyklyKot::-ZwyklyKot{)25: {
26: cout « "Destruktor zwykłego kota...\n";
28:
29: ZwyklyKot FunkcjaPierwsza (ZwyklyKot Kot);
30: ZwyklyKot* FunkcjaDruga (ZwyklyKot *Kot);
31:
32: int main()33: {
34: cout « "Tworzenie kota...\n";
35: ZwyklyKot Frisfcy;
36: cout « "Wywołanie FunkcjaPierwsza..,\n";
37: FunkcjaPierwsza(Frisky):
38: cout « "Wywołanie FunkcjaDruga...\n";