Poznaj C++ w$ godziny0179

Poznaj C++ w$ godziny0179



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.

Listing 12.1. Przekazywanie obiektów przez referencje

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

12:    };

13:

14:    ZwyklyKot::ZwyklyKot()15:    {

16:    cout « "Konstruktor    zwykłego kota...\n";

17:    }

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";

27:    )

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.

Listing 12.1. Przekazywanie obiektów przez referencje

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

12:    ) ;

13:

14:    ZwyklyKot::ZwyklyKot()15:    {

16:    cout « "Konstruktor zwykłego kota...\n";

17:    )

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";

27:    )

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";


Wyszukiwarka

Podobne podstrony:
Poznaj C++ w$ godziny0028 12 Godzina 1 Przepisz program dokładnie. Pamiętaj o wszystkich znakach. Np
Poznaj C++ w$ godziny0047 Zmienne i stałe 31Kiedy używać short a kiedy long Jednym z problemów progr
Poznaj C++ w$ godziny0097 Proste klasy 83Dostęp do zasobów klasy Jeśli masz zdefiniowany obiekt Kot
Poznaj C++ w$ godziny0174 Referencje 163 Linie 24-26 zamieniają wartości. Efekt zamiany wypisywany j
skanowanie0017 (64) Ponadto występuje tutaj jeszcze inna para pojęć, które stanowią elementy charakt
Poznaj C++ w$ godziny0243 Dziedziczenie 235 Ten program nie wypisuje nic na ekranie, gdyż jest jedyn
72982 ullman132 (2) Krotka (1,2) występuje tutaj tylko jeden raz i krotka (3, 4) także. Dzieje się l
Scan39 • i*.. , nika jeszcze jeden istotny wniosek, że każdy system jest sys- , i ....... 111 hi. g
PB170081 2 1 Skąd pomysł na jeszcże jeden pdręczntk radiologu? Część druga, kliniczna, jest zatytuło
Scan39 • i*.. , nika jeszcze jeden istotny wniosek, że każdy system jest sys- , i ....... 111 hi. g
C360 12 02 21 52 16 Wyznaczanie zależności dynamicznego współczynnika lepkości od temperatury za po
PB170081 2 1 Skąd pomysł na jeszcże jeden pdręczntk radiologu? Część druga, kliniczna, jest zatytuło

więcej podobnych podstron