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.
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.
0: // Listing 12.2
1: // Przekazywanie wskaźników do obiektów
2:
3: #include <iostream.h>
5: class ZwyklyKot
6: {
7: public:
8: ZwyklyKot ();
9: ZwyklyKot(ZwyklyKotS);
10: -ZwyklyKot();
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.
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.
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: