174 Godzina 12
52: // FunkcjaDruga pobiera referencje do stałego obiektu
53: const ZwyklyKot & FunkcjaDruga (const ZwyklyKot & kot)
54: <
55: cout « "FunkcjaDruga. Powrot...\n";
56: cout « "Frisky ma teraz " « kot.PobierzWiek();
57: cout « " lat \n";
58: // kot.UstawWiek(8); const!
59: return kot;
60: )
Tworzenie kota...
Konstruktor zwykłego kota...
Frisky ma 5 lat Friksy ma 10 lat Wywołanie FunkcjaDruga...
FunkcjaDruga. Powrot...
Frisky ma teraz 10 lat Frisky ma 10 lat
Wywołanie destruktora zwykłego kota...
ANALIZA.
Efekt działania jest taki sam jak w poprzednim przypadku. Istotna zmiana w programie polega na tym, że FunkcjaDruga () pobiera i zwraca referencje do stałego obiektu (a nie, jak poprzednio, wskaźniki). Ponownie okazuje się, że praca z referencjami jest łatwiejsza niż ze wskaźnikami przy jednoczesnym zachowaniu oszczędności czasu, pamięci i gwarancji niezmienności przekazywanego obiektu.
Programiści C++ preferują referencje. Są łatwiejsze, bardziej eleganckie i pozwalają na lepsze ukrycie szczegółów implementacyjnych.
Jednak raz stworzona referencja nie może być przypisana do innego obiektu. Jeśli chcesz mieć wskazanie najpierw na jeden obiekt, a następnie na drugi, musisz wykorzystać wskaźniki. Referencje nie mogą być puste (nuli) i jeśli jest możliwość, że obiekt będzie pusty to wykorzystanie referencji w takim przypadku jest błędem, trzeba użyć wskaźnika.
Inny problem pojawia się przy wykorzystaniu operatora new. Jeśli new nie jest w stanie zarezerwować pamięci na stercie to zwraca pusty (nuli) wskaźnik. Referencja nie może być pusta dlatego nie wolno inicjalizować referencji do zarezerwowanej pamięci zanim nie upewnimy się, że wskaźnik nie jest pusty. Oto przykładowa sekwencja instrukcji, która prawidłowo obsługuje tworzenie referencji do pamięci na stercie:
int *plnt = new int; if (plnt != NULL) int Srlnt = *plnt;
52: // FunkcjaDruga pobiera referencje do stałego obiektu
53: const ZwyklyKot & FunkcjaDruga (const ZwyklyKot & kot)
54: (
55: cout « "FunkcjaDruga. Powrot...\n";
56: cout « "Frisky ma teraz " « kot.PobierzWiek();
57: cout « " lat \n";
58: // kot.UstawWiek(8); const!
59: return kot;
60: )
Tworzenie kota...
Konstruktor zwykłego kota...
Frisky ma 5 lat Friksy ma 10 lat Wywołanie FunkcjaDruga...
FunkcjaDruga. Powrot...
Frisky ma teraz 10 lat Frisky ma 10 lat
Wywołanie destruktora zwykłego kota...
ANALIZA:
Efekt działania jest taki sam jak w poprzednim przypadku. Istotna zmiana w programie polega na tym, że FunkcjaDruga!) pobiera i zwraca referencje do stałego obiektu (a nie. jak poprzednio, wskaźniki). Ponownie okazuje się, że praca z referencjami jest łatwiejsza niż ze wskaźnikami przy jednoczesnym zachowaniu oszczędności czasu, pamięci i gwarancji niezmienności przekazywanego obiektu.
Programiści C++ preferują referencje. Są łatwiejsze, bardziej eleganckie i pozwalają na lepsze ukrycie szczegółów implementacyjnych.
Jednak raz stworzona referencja nie może być przypisana do innego obiektu. Jeśli chcesz mieć wskazanie najpierw na jeden obiekt, a następnie na drugi, musisz wykorzystać wskaźniki. Referencje nie mogą być puste (nuli) i jeśli jest możliwość, że obiekt będzie pusty to wykorzystanie referencji w takim przypadku jest błędem, trzeba użyć wskaźnika.
Inny problem pojawia się przy wykorzystaniu operatora new. Jeśli new nie jest w stanie zarezerwować pamięci na stercie to zwraca pusty (nuli) wskaźnik. Referencja nie może być pusta dlatego nie wolno inicjalizować referencji do zarezerwowanej pamięci zanim nie upewnimy się, że wskaźnik nie jest pusty. Oto przykładowa sekwencja instrukcji, która prawidłowo obsługuje tworzenie referencji do pamięci na stercie:
int *plnt = new int; if (plnt != NULL) int srlnt = *plnt;