Poznaj C++ w$ godziny0181

Poznaj C++ w$ godziny0181



170 Godzina 12

wyrzucany z pamięci poprzez wywołanie destruktora. Widać to w linii 7 wydruku. Ponieważ funkcja FunkcjaPierwsza () się skończyła, dlatego lokalna kopia obiektu również ulega skasowaniu poprzez wywołanie destruktora. Dowodem tego jest 8 linia wydruku.

Program wraca do funkcji main () po czym następuje wywołanie funkcji Funkcja-Druga(). Tym razem parametr jest przekazywany przez referencje. Jak widać na wydruku, nie jest tworzona żadna kopia obiektu. Funkcja FunkcjaDruga () wypisuje komunikat (linia 10 wydruku) i zwraca referencje do obiektu klasy ZwyklyKot. Znowu nie jest wywoływany ani konstruktor ani destruktor klasy.

Następuje koniec programu. Obiekt Frisky jest wyrzucany z pamięci powodując ostatnie wywołanie destruktora, co widoczne jest w linii 11 wydruku.

Jak widać, wywołanie funkcji FunkcjaPierwsza (), ze względu na przekazywanie parametrów przez wartość, spowodowało dwukrotne wywołanie konstruktora i destruktora, w przeciwieństwie do funkcji Funkc jaD ruga (), której wywołanie odbywało się bez uczestnictwa konstruktora i destruktora klasy.

Przekazywanie stałych (const) wskaźników

Mimo że przekazywanie wskaźników jest bardzo efektywne, to jest ono jednocześnie bardzo niebezpieczne. Funkc jaDruga () (z ostatniego programu) nie ma prawa zmieniać przekazanego obiektu, który aktualnie jest przekazywany w formie adresu. Takie rozwiązanie niesie ze sobą niebezpieczeństwo nieświadomej (spowodowanej błędem programisty) zmiany oryginalnego obiektu, w przeciwieństwie do przekazywania przez wartość, gdzie obiekt oryginalny jest „bezpieczny”.

Przekazywanie przez wartość, to jakby dawanie do muzeum fotografii dzieła sztuki, a nie oryginalnego dzieła. Jeśli ktoś zniszczy kopie to oryginał i tak zostanie nienaruszony. Przekazywanie przez referencje można porównać do wysyłania do muzeum swojego, domowego adresu i zaproszenia do oglądania własnych zasobów. Rozwiązaniem tego problemu jest przekazywanie stałych (const) wskaźników. Takie posunięcie zabezpiecza przed użyciem metod, które nie są zadeklarowane jako const, przez co mogą zmieniać obiekt. Listing 12.2. ilustruje to rozwiązanie na przykładzie prostej klasy ZwyklyKot.

Listing 12.2. Przekazywanie stałych (const) wskaźników

0:    // Listing 12.2

1:    // Przekazywanie wskaźników do obiektów

2:

3:    #include <iostream.h>

4:

5:    class ZwyklyKot

6:    {

7:    public:

8:    ZwyklyKot ();

9:    ZwyklyKot(ZwyklyKotS);

10:    -ZwyklyKot();

11: wyrzucany z pamięci poprzez wywołanie destruktora. Widać to w linii 7 wydruku. Ponieważ funkcja FunkcjaPierwsza() się skończyła, dlatego lokalna kopia obiektu również ulega skasowaniu poprzez wywołanie destruktora. Dowodem tego jest 8 linia wydruku.

Program wraca do funkcji main() po czym następuje wywołanie funkcji Funkcja-Druga(). Tym razem parametr jest przekazywany przez referencje. Jak widać na wydruku, nie jest tworzona żadna kopia obiektu. Funkcja FunkcjaDruga () wypisuje komunikat (linia 10 wydruku) i zwraca referencje do obiektu klasy ZwyklyKot. Znowu nie jest wywoływany ani konstruktor ani destruktor klasy.

Następuje koniec programu. Obiekt Frisky jest wyrzucany z pamięci powodując ostatnie wywołanie destruktora, co widoczne jest w linii 11 wydruku.

Jak widać, wywołanie funkcji FunkcjaPierwsza (), ze względu na przekazywanie parametrów przez wartość, spowodowało dwukrotne wywołanie konstruktora i destruktora, w przeciwieństwie do funkcji Funkc jaDruga (), której wywołanie odbywało się bez uczestnictwa konstruktora i destruktora klasy.

Przekazywanie stałych (const) wskaźników

Mimo że przekazywanie wskaźników jest bardzo efektywne, to jest ono jednocześnie bardzo niebezpieczne. FunkcjaDruga () (z ostatniego programu) nie ma prawa zmieniać przekazanego obiektu, który aktualnie jest przekazywany w formie adresu. Takie rozwiązanie niesie ze sobą niebezpieczeństwo nieświadomej (spowodowanej błędem programisty) zmiany oryginalnego obiektu, w przeciwieństwie do przekazywania przez wartość, gdzie obiekt oryginalny jest „bezpieczny”.

Przekazywanie przez wartość, to jakby dawanie do muzeum fotografii dzieła sztuki, a nie oryginalnego dzieła. Jeśli ktoś zniszczy kopie to oryginał i tak zostanie nienaruszony. Przekazywanie przez referencje można porównać do wysyłania do muzeum swojego, domowego adresu i zaproszenia do oglądania własnych zasobów. Rozwiązaniem tego problemu jest przekazywanie stałych (const) wskaźników. Takie posunięcie zabezpiecza przed użyciem metod, które nie są zadeklarowane jako const, przez co mogą zmieniać obiekt. Listing 12.2. ilustruje to rozwiązanie na przykładzie prostej klasy ZwyklyKot.

Listing 12.2. Przekazywanie stałych (const) wskaźników

0:    // Listing 12.2

1:    // Przekazywanie wskaźników do obiektów

2:

3:    ffinclude <iostream.h>

4:

5:    class ZwyklyKot

6:    I

7:    public:

8:    ZwyklyKot ();

9:    ZwyklyKot(ZwyklyKotS);

10:    -ZwyklyKotO;

11:


Wyszukiwarka

Podobne podstrony:
Poznaj C++ w$ godziny0028 12 Godzina 1 Przepisz program dokładnie. Pamiętaj o wszystkich znakach. Np
Poznaj C++ w$ godziny0037 Program w C++ 21 16:    cout « "Wywołanie funkcji Add(
Poznaj C++ w$ godziny0213 204 Godzina 14 przez wskaźniki zawarte w obiekcie oryginalnym. Widać to by
Poznaj C++ w$ godziny0040 24 Godzina 3 Rysunek 3.1 Schemat pamięci MojaZmienna Nazwa Zmiennej RAM&nb
Poznaj C++ w$ godziny0041 Zmienne i stałe 25 Program 3.1. pomoże Ci w zobaczeniu ile dokładnie pamię
Poznaj C++ w$ godziny0043 Zmienne i stałe 27Definiowanie zmiennych Zmienne tworzy się i definiuje si
Poznaj C++ w$ godziny0063 48 Godzina 4 12:    cout « "


Poznaj C++ w$ godziny0066 Instrukcje i wyrażenia 51 11:    if (x > 10) 12:  &
Poznaj C++ w$ godziny0084 70 Godzina 5 70 Godzina 5 8: 9: 10 11 12 13 14 15 16 17 18 19 20
Poznaj C++ w$ godziny0094 80 Godzina 6 Typ zawiera informacje o: • □    Rozmiarze w p
Poznaj C++ w$ godziny0100 86 Godzina 6 86 Godzina 6 11 12 13 14 15 16 17 18 19 20
Poznaj C++ w$ godziny0101 Proste klasy 87 Linia 12 rozpoczyna sekcję prywatną, która w tym wypadku s
Poznaj C++ w$ godziny0121 Zaawansowane sterowanie programem 109 W liniach 12-15 wprowadzamy wartości
Poznaj C++ w$ godziny0130 118 Godzina 8 11:    { 12:    lieznik++; 13:
Poznaj C++ w$ godziny0137 IIIZarządzanie pamięcią Godzina 9 Wskaźniki 10    Zaawansow
Poznaj C++ w$ godziny0150 Wskaźniki 139 Jeśli new nie może zarezerwować miejsca na stercie (bądź co
Poznaj C++ w$ godziny0167 156 Godzina 11 156 Godzina 11 ANALIZA: Podobnie jak w poprzednim przykładz
Poznaj C++ w$ godziny0179 168 Godzina 12 Występuje tutaj jeszcze jeden, dodatkowy koszt. Każda kopia
Poznaj C++ w$ godziny0183 172 Godzina 12 172 Godzina 12 EFEKT DZIAŁANIA: Tworzenie kota... Konstrukt

więcej podobnych podstron