145
W liniach 6-13 deklarujemy klasę ZwyklyKot. Linia 9 deklaruje konstruktor. Linie 15-19 zawierają definicję. Linia 10 deklaruje destruktor klasy ZwyklyKot, którego definicja znajduje się w liniach 21-24.
W linii 29 na stosie tworzony jest obiekt Frisky co powoduje wywołanie konstruktora klasy. W linii 31, na stosie tworzony jest obiekt klasy ZwyklyKot, wskazywany przez pRags. Ponownie wywoływany jest konstruktor. W linii 33 obiekt wskazywany przez pRags jest kasowany co powoduje wywołanie destruktora klasy. Kiedy program się kończy, to automatycznie kasowany jest obiekt Frisky i również jest wywoływany destruktor klasy.
Dotychczas, dostęp do wewnętrznych danych i funkcji obiektów klasy zadeklarowanych lokalnie realizowany był poprzez użycie operatora kropka ( . ). Żeby dostać się do elementów obiektu stworzonego na stercie musisz pośrednio odwołać się do tego obiektu za pomocą wskaźnika. Żeby wywołać funkcję wewnętrzną PobierzWiek () powinieneś napisać:
{*pRags).PobierzWiek()
Nawiasy gwarantują, że odwołanie do obiektu nastąpi przed próbą dostępu do funkcji PobierzWiek ().
Ponieważ takie stosowanie wskaźników jest raczej nieporęczne, C++ oferuje specjalny operator dla pośredniego dostępu do obiektów wskazywanych przez wskaźniki. Operator „wskazujący na” ( -> ) składający się z myślnika ( - ) i znaku większości ( > ). C++ traktuje to jako pojedynczy symbol. Listing 10.2. demonstruje dostęp do zmiennych i funkcji wewnętrznych obiektu stworzonego na stercie.
Listing 10.2. Dostęp do danych i funkcji wewnętrznych obiektu na stercie.
1: // Listing 10.2
2: // Dostęp do danych i funkcji obiektu na stercie
3:
4:
6:
8:
9:
10
11
12
13
14
15
16 17
19
20 21 22
#include <iostream.h>5: class ZwyklyKot7: {
public:
ZwyklyKot() {jegoWiek =5; 1 -ZwyklyKot() {}
int PobierzWiek() const { return jegoWiek; } void UstawWiek(int wiek) { jegoWiek = wiek; )
private:
int jegoWiek;
} ;
int main()18: {
ZwyklyKot * Frisky = new ZwyklyKot;
cout « "Frisky ma " « Frisky->PobierzWiek() « " lat\n"; Frisky->UstawWiek(10);
cout « "Frisky ma " « Frisky->PobierzWiek() « "
lat\n";
ANALIZA:
145
W liniach 6-13 deklarujemy klasę ZwyklyKot. Linia 9 deklaruje konstruktor. Linie 15-19 zawierają definicję. Linia 10 deklaruje destruktor klasy ZwyklyKot, którego definicja znajduje się w liniach 21-24.
W linii 29 na stosie tworzony jest obiekt Frisky co powoduje wywołanie konstruktora klasy. W linii 31, na stosie tworzony jest obiekt klasy ZwyklyKot, wskazywany przez pRags. Ponownie wywoływany jest konstruktor. W linii 33 obiekt wskazywany przez pRags jest kasowany co powoduje wywołanie destruktora klasy. Kiedy program się kończy, to automatycznie kasowany jest obiekt Frisky i również jest wywoływany destruktor klasy.
Dotychczas, dostęp do wewnętrznych danych i funkcji obiektów klasy zadeklarowanych lokalnie realizowany byl poprzez użycie operatora kropka ( . ). Żeby dostać się do elementów obiektu stworzonego na stercie musisz pośrednio odwołać się do tego obiektu za pomocą wskaźnika. Żeby wywołać funkcję wewnętrzną PobierzWiek () powinieneś napisać:
(*pRags) . PobierzWiek ()
Nawiasy gwarantują, że odwołanie do obiektu nastąpi przed próbą dostępu do funkcji PobierzWiek().
Ponieważ takie stosowanie wskaźników jest raczej nieporęczne, C++ oferuje specjalny operator dla pośredniego dostępu do obiektów wskazywanych przez wskaźniki. Operator „wskazujący na” ( -> ) składający się z myślnika ( - ) i znaku większości ( > ). C++ traktuje to jako pojedynczy symbol. Listing 10.2. demonstruje dostęp do zmiennych i funkcji wewnętrznych obiektu stworzonego na stercie.
Listing 10.2. Dostęp do danych i funkcji wewnętrznych obiektu na stercie.
1: // Listing 10.2
2: // Dostęp do danych i funkcji obiektu na stercie
3:
4: #include <iostream.h>5:
6: class ZwyklyKot7: {
8: public:
9: ZwyklyKot() (jegoWiek = 5; }
10: -ZwyklyKot () {)
11: int PobierzWiek() const { return jegoWiek; }
12: void OstawWiek(int wiek) { jegoWiek = wiek; )
13: private:
14: int jegoWiek;
15: ) ;
16:
17: int main()18: {
19: ZwyklyKot * Frisky = new ZwyklyKot;
20: cout « "Frisky ma " « Frisky->PobierzWiek() « " lat\n";
21: Frisky->0stawWiek(lO);
22: cout « "Frisky ma " « Frisky->PobierzWiek() « " lat\n";