192 Godzina 13
192 Godzina 13
57
58
59
60: }
cout « "wiek Frisky: " « frisky.PobierzWiek() « endl;
cout « "wiek Boot: " « boot.PobierzWiek() « endl; return 0;
wiek Frisky: 5
Niech Frisky ma 6 lat...
Tworzenie Boot na podstawie Frisky
wiek Frisky: 6
wiek Boot: 6
Niech Frisky ma 7 lat...
wiek Frisky: 7
wiek Boot: 6
W liniach 6-19 deklarowana jest klasa KOT. W linii 9 deklarowany jest konstruktor domyślny, w linii 10 kopiujący.
W liniach 17 i 18 deklarowane są dwie zmienne wewnętrzne, każda jako wskaźnik do wartości typu int. Normalnie przechowywanie w klasie zmiennych typu int pod wskaźnikami jest niestosowane. Tutaj wykorzystaliśmy to tylko do zademonstrowania zarządzania danymi na stercie.
W liniach 21-27, domyślny konstruktor, rezerwuje dla dwóch zmiennych typu int pamięć na stercie i przypisuje im odpowiednie wartości.
W linii 29 rozpoczyna się konstruktor kopiujący. Zwróć uwagę na parametr rhs. Jest to często spotykana nazwa parametru konstruktora kopiującego (z ang. right-hand side — znajdujący się po prawej stronie). Jeśli spojrzysz na przypisania w liniach 33 i 34 zobaczysz, że obiekt przekazywany jako parametr znajduje się po prawej stronie operatora przypisania. Oto zasada działania konstruktora kopiującego:
□ W liniach 31 i 32 rezerwowana jest pamięć na stercie. W liniach 33 i 34 przepisywane tam są wartości z istniejącego obiektu klasy KOT.
□ Parametr rhs to obiekt klasy KOT przekazany do konstruktora kopiującego jako stała (const) referencja . Wykorzystujemy wewnętrzne funkcje rhs. PobierzWiek () i rhs . PobierzWage () do odczytania wartości zmiennych wewnętrznych jegoWiek i jegoWaga i przepisania ich do tworzonego obiektu.
□ Kiedy jest wywoływany konstruktor kopiujący, to istniejący obiekt klasy KOT jest przekazywany do niego jako parametr. Do zmiennych tworzonego obiektu można się odwoływać bezpośrednio, ale do odczytania zmiennych obiektu rhs trzeba wykorzystać funkcje dostępu.
Rysunek 13.3. ilustruje działanie konstruktora kopiującego z ostatniego przykładu. Wartości z istniejącego obiektu są kopiowane do pamięci zarezerwowanej dla nowego obiektu.
W linii 47 tworzony jest obiekt o nazwie Frisky. Wypisywany jest jego wiek. W linii 50 wiek Frisky jest zmieniany na 6. W linii 52 tworzony jest nowy obiekt, Boot, z wykorzystaniem konstruktora kopiującego i obiektu Frisky. Gdyby Frisky był przekazany przez wartość do funkcji, to również zostałby wywołany konstruktor kopiujący.
57: cout « "wiek Frisky: " « frisky.PobierzWiek() « endl;
58: cout « "wiek Boot: " « boot.PobierzWiek() « endl;
59: return 0;
60: }
EFEKT DZIAŁANIA:
wiek Frisky: 5
Niech Frisky ma 6 lat...
Tworzenie Boot na podstawie Frisky
wiek Frisky: 6
wiek Boot: 6
Niech Frisky ma 7 lat...
wiek Frisky: 7
wiek Boot: 6
ANALIZA:
W liniach 6-19 deklarowana jest klasa KOT. W linii 9 deklarowany jest konstruktor domyślny, w linii 10 kopiujący.
W liniach 17 i 18 deklarowane są dwie zmienne wewnętrzne, każda jako wskaźnik do wartości typu int. Normalnie przechowywanie w klasie zmiennych typu int pod wskaźnikami jest niestosowane. Tutaj wykorzystaliśmy to tylko do zademonstrowania zarządzania danymi na stercie.
W liniach 21-27. domyślny konstruktor, rezerwuje dla dwóch zmiennych typu int pamięć na stercie i przypisuje im odpowiednie wartości.
W linii 29 rozpoczyna się konstruktor kopiujący. Zwróć uwagę na parametr rhs. Jest to często spotykana nazwa parametru konstruktora kopiującego (z ang. righl-hand side - znajdujący się po prawej stronie). Jeśli spojrzysz na przypisania w liniach 33 i 34 zobaczysz, że obiekt przekazywany jako parametr znajduje się po prawej stronie operatora przypisania. Oto zasada działania konstruktora kopiującego:
□ W liniach 31 i 32 rezerwowana jest pamięć na stercie. W liniach 33 i 34 przepisywane tam są wartości z istniejącego obiektu klasy KOT.
□ Parametr rhs to obiekt klasy KOT przekazany do konstruktora kopiującego jako stała (const) referencja . Wykorzystujemy wewnętrzne funkcje rhs.PobierzWiek () i rhs . PobierzWage () do odczytania wartości zmiennych wewnętrznych jegoWiek i jegoWaga i przepisania ich do tworzonego obiektu.
□ Kiedy jest wywoływany konstruktor kopiujący, to istniejący obiekt klasy KOT jest przekazywany do niego jako parametr. Do zmiennych tworzonego obiektu można się odwoływać bezpośrednio, ale do odczytania zmiennych obiektu rhs trzeba wykorzystać funkcje dostępu.
Rysunek 13.3. ilustruje działanie konstruktora kopiującego z ostatniego przykładu. Wartości z istniejącego obiektu są kopiowane do pamięci zarezerwowanej dla nowego obiektu.
W linii 47 tworzony jest obiekt o nazwie Frisky. Wypisywany jest jego wiek. W linii 50 wiek Frisky jest zmieniany na 6. W linii 52 tworzony jest nowy obiekt, Boot, z wykorzystaniem konstruktora kopiującego i obiektu Frisky. Gdyby Frisky był przekazany przez wartość do funkcji, to również zostałby wywołany konstruktor kopiujący.