Jesteś autorem/wydawcą tego dokumentu/książki i zauważyłeś że ktoś wgrał ją bez Twojej zgody? Nie życzysz sobie, aby podgląd był dostępny w naszym serwisie? Napisz na adres
a my odpowiemy na skargę i usuniemy zabroniony dokument w ciągu 24 godzin.
Zobacz podgląd pliku o nazwie 6569 PDF poniżej lub pobierz go na swoje urządzenie za darmo bez rejestracji. Możesz również pozostać na naszej stronie i czytać dokument online bez limitów.
Jerzy Gr�bosz
Programowanie w j�zyku C++
orientowane obiektowo
Oficyna Kal�imach
Krak�w 1999
Ali of the products and software mentioned in this book
ar� reg/sfered trademarks of their owners
Opracowanie graficzne: Jerzy Gr�bosz
Copyright: Jerzy Gr�bosz
Wszelkie prawa zastrze�one
ISBN 83-901689-1 -X
Wydanie czwarte uzupe�nione
Po informacje na temat t�umacze� ksi��ki
lub w sprawie zakupu hurtowego, zni�ek dla student�w, zni�ek promocyjnych
prosimy kontaktowa� si� z Oficyn� Kallimach.
Oficyna Kallimach realizuje sprzeda� wysy�kow� bez naliczania koszt�w przesy�ki.
Zam�wienia telefoniczne i pisemne.
Wydawnictwo: Oficyna Kallimach
Adres do korespondencji:
Elektor Ltd.
30-054 Krak�w, Czarnowiejska 72
fax:(0- 12)6371881
email:
[email protected]
Druk i oprawa: ZG "Colonel" S.c. 30-532 Krak�w, ul. D�browskiego 16
Spis tre�ci
(Wszystkich trzech tom�w)
Tom I
0 Prosz� nie czyta� tego ! 1
1 Startujemy!........................ ..............6
1.1 Pierwszy program 6
1.2 Drugi program 10
2 Instrukcje steruj�ce ..15
2.! Prawda-Fa�sz 15
2.2 Instrukcja warunkowa if 16
2.3 Instrukcja while 18
2.4 P�tla do. . .while 19
2.5 P�tla for 20
2.6 Instrukcja switch 22
2.7 Instrukcja break 24
2.8 Instrukq'a goto 25
2.9 Instrukcja continue 27
2.10 Klamry w instrukcjach steruj�cych 28
3.1 Deklaracje typ�w 30
3.2 Systematyka typ�w z j�zyka C++ 32
3.3 Typy fundamentalne 32
3.3.1 Definiowanie obiekt�w �w biegu" 34
3.4 Sta�e dos�owne 35
3.4.1 Sta�e b�d�ce liczbami ca�kowitymi 35
3.4.2 Sta�e reprezentuj�ce liczby zmiennoprzecinkowe 36
3.4.3 Sta�e znakowe 37
3.4.4 Sta�e tekstowe, albo po prostu stringi 39
3.5 Typy pochodne 40
3.5.1 Typ void 42
IV Spis tre�ci
3.6 Zakres wa�no�ci nazwy obiektu, a czas �ycia obiektu 42
36.1 Zakres: lokalny 42
3.6.2 Zakres: blok funkcji 43
3.6.3 Zakres: obszar pliku 43
3.6.4 Zakres: obszar klasy 44
3.7 Zas�anianie nazw 44
3.8 Modyfikator const 45
3.8.1 Pojedynek: const contra #def ine 47
3.9 Obiekty register 48
3.10 Modyfikator volatile 49
3.11 Instrukcja typedef 50
3.12 Typy wyliczeniowe enum 52
4 Operatory 54
4.1 Operatory arytmetyczne 54
4.1.1 Operator % czyli modulo 55
4.1.2 Jednoargumentowe operatory + i - 57
4.1.3 Operatory inkrementacji i dekrementacji 57
4.1.4 Operator przypisania = 59
4.2 Operatory logiczne 60
4.2.1 Operatory relacji 60
4.2.2 Operatory sumy logicznej | | i iloczynu logicznego && 61
4.2.3 Operator negacji:! 63
4.3 Operatory bitowe 63
4.3.1 Przesuni�cie w lewo << 64
4.3.2 Przesuni�cie w prawo >> 65
4.3.3 Bitowe operatory sumy, iloczynu, negacji, r�nicy symetrycznej 66
4.4 R�nica mi�dzy operatorami logicznymi, a operatorami bitowymi 66
4.5 Pozosta�e operatory przypisania 67
4.6 Wyra�enie warunkowe 68
4.7 Operator sizeof 69
4.8 Operator rzutowania 70
4.9 Operator: przecinek 71
4.10 Priorytety operator�w 71
4.11 ��czno�� operator�w 74
5 Funkcje ...75
-; i Zwracanie rezultatu przez funkcje 78
5.2 Stos 80
5.3 Przesy�anie argument�w do funkcji przez warto�� 81
5.4 Przesy�anie argument�w przez referencj� 83
5.5 Kiedy deklaracja funkcji nie jest konieczna 86
5.6 Argumenty domniemane 87
Nienazwany argument 90
5.8 Funkcje inline (w linii) 91
5.9 Przypomnienie o zakresie wa�no�ci nazw deklarowanych wewn�trz
funkcji 95
5.10 Wyb�r zakresu wa�no�ci nazwy i czasu �ycia obiektu 96
5.10.1 Obiekty globalne 96
Spis tre�ci
5.10.2 Obiekty automatyczne 97
5.10.3 Obiekty lokalne statyczne 98
5.11 Funkcje w programie sk�adaj�cym si� z kilku plik�w 102
5.11.1 Nazwy statyczne globalne 106
5.12 Funkcje biblioteczne 107
6 Preprocesor. ..110
6.1 Na pomoc rodakom 110
6.2 Dyrektywa #def ine 112
6.3 Dyrektywa #undef 115
6.4 Makrodefinicje 115
6.5 Dyrektywy kompilacji warunkowej 118
6.6 Dyrektywa #error 121
6.7 Dyrektywa #line 122
6.8 Wstawianie tre�ci innych plik�w w tekst kompilowanego w�a�nie pliku 123
6.9 Sklejacz czyli operator ## 124
6.10 Dyrektywa pusta 125
6.11 Dyrektywy zale�ne od implementacji 125
6.12 Nazwy predefiniowane 125
7 Tablice ...128
7.1 Klc-i -i'iilv tabliry . I2l>
7.2 Inicjalizacja tablic 131
7.3 Przekazywanie tablicy do funkcji 132
7.4 Tablice znakowe 136
7.5 Tablice wielowymiarowe 144
7.5.1 Przesy�anie tablic wielowymiarowych do funkcji 147
8 Wska�niki 149
8.1 Wska�niki mog� bardzo u�atwi� �ycie 149
8.2 Definiowanie wska�nik�w 151
8.3 Praca ze wska�nikiem 152
8.4 L-warto�� 155
8.5 Wska�niki typu void 156
8.6 Cztery domeny zastosowania wska�nik�w 159
8.7 Zastosowanie wska�nik�w wobec tablic 159
8.7.1 �wiczenia z mechaniki ruchu wska�nika 159
8.7.2 U�ycie wska�nika w pracy z tablic� 163
8.7.3 Arytmetyka wska�nik�w 167
8.7.4 Por�wnywanie wska�nik�w 169
8.8 Zastosowanie wska�nik�w w argumentach funkcji 172
8.8.1 Jeszcze raz o przesy�aniu tablic do funkcji 175
8.8.2 Odbieranie tablicy jako wska�nika 176
8.8.3 Argument formalny b�d�cy wska�nikiem do obiektu const 178
8.9 Zastosowanie wska�nik�w przy dost�pie do konkretnych kom�rek pami�ci.... 181
8.10 Rezerwacja obszar�w pami�ci 181
8.10.1 Operatory new i delete albo Oratorium Stworzenie �wiata 182
8.10.2 Dynamiczna alokacja tablicy 186
8.10.3 Zapas pami�ci to nie jest studnia bez dna 189
8.10.4 Por�wnanie starych i nowych sposob�w 191
8.10.1
VI Spis tre�ci
8.11 Sta�e wska�niki 192
8.12 Sta�e wska�niki, a wska�niki do sta�ych 193
8.13 Strza� na o�lep - Wska�nik zawsze pokazuje na co� 194
8.14 Sposoby ustawiania wska�nik�w 196
8.15 Tablice wska�nik�w 197
8.16 Wariacje na temat string�w 199
8.17 Wska�niki do funkcji 206
8.17.1 �wiczenia z definiowania wska�nik�w do funkcji 209
8.17.2 Wska�nik do funkcji jako argument innej funkcji 216
8.17.3 Tablica wska�nik�w do funkcji 220
8.18 Argumenty z linii wywo�ania programu 223
9 Prze�adowanie nazw funkcji 227
u i Co to /nac/y: prze�adowanie 227
9.2 Bli�sze szczeg�y prze�adowania 231
9.3 Czy prze�adowanie nazw funkcji jest technik� obiektowo orientowan�? 233
9.4 Linkowanie z modu�ami z innych j�zyk�w 235
9.5 Prze�adowanie a zakres wa�no�ci deklaracji funkcji 236
9.6 Rozwa�ania o identyczno�ci lub odmienno�ci typ�w argument�w 238
9.6.1 Prze�adowanie a typedef i enum 238
9.6.2 Tablica a wska�nik 239
9.6.3 Pewne szczeg�y o tablicach wielowymiarowych 240
9.6.4 Prze�adowanie a referenq'a 242
9.6.5 Identyczno�� typ�w: T, const T, volatile T 243
9.6.6 Prze�adowanie a typy: T*, volatile T*, const T* 244
9.6.7 Prze�adowanie a typy: T&, yolatile T&, const T& 245
9.7 Adres funkcji prze�adowanej 246
9.7.1 Zwrot rezultatu b�d�cego adresem funkcji prze�adowanej 248
9.8 Kulisy dopasowywania argument�w do funkcji prze�adowanych 250
9.9 Etapy dopasowania 251
9.9.1 Etap 1. Dopasowanie dos�ownie 252
9.9.2 Etap 2. Dopasowanie dos�owne, ale z tzw. trywialn� konwersj� 252
9.9.3 Etap 3. Dopasowanie z awansem 253
9.9.4 Etap 4. Pr�ba dopasowania za pomoc� konwersji standardowych 254
9.9.5 Etap 5. Pr�ba dopasowania z u�yciem konwersji zdefiniowanych przez
u�ytkownika 256
9.9.6 Etap 6. Pr�ba dopasowania do funkcji z wielokropkiem 256
9.10 Dopasowywanie wywo�a� z kilkoma argumentami 256
Tom II
10.1 Typy definiowane przez u�ytkownika 259
10.2 Sk�adniki klasy 261
10.3 Sk�adnik b�d�cy obiektem 263
10.4 Enkapsulacja 263
10.5 Ukrywanie informacji 264
10.6 Klasa a obiekt.. ...267
10.1
Spis tre�ci VII
10.7 Funkcje sk�adowe 270
10.7.1 Pos�ugiwanie si� funkcjami sk�adowymi 270
10.7.2 Definiowanie funkcji sk�adowych 271
10.8 Jak to w�a�ciwie jest ? (this) 276
10.9 Odwo�anie si� do publicznych danych sk�adowych 277
10.10 Zas�anianie nazw 278
10.11 Prze�adowanie i zas�oni�cie r�wnocze�nie 281
10.12 Przesy�anie do funkcji argument�w b�d�cymi obiektami 282
10.12.1 Przesy�anie obiektu przez warto�� 282
10.12.2 Przesy�anie przez referencj� 285
10.13 Konstruktor - pierwsza wzmianka 286
10.14 Destruktor - pierwsza wzmianka 291
10.15 Sk�adnik statyczny 295
10.16 Statyczna funkcja sk�adowa 299
10.17 Do czego mo�e nam si� przyda� sk�adnik statyczny w klasie? 302
10.18 Funkcje sk�adowe typu const oraz volatile 303
10.18.1 Prze�adowanie a funkcje sk�adowe const i volatile 306
11 Funkcje zaprzyja�nione , 307
12 Struktury, Unie, Pola bitowe 318
12.1 Struktura irr"."""..'...." ......I^.........I!I.Iir..I......^..;ir..I^1.....318"
12.2 Unia 319
12.2.1 Inicjalizacja unii 321
12.2.2 Unia anonimowa 321
12.3 Pola bitowe 323
13 Zagnie�d�ona definicja klasy 328
[3. l Lokalna definicja klasy 331
13.2 Lokalne nazwy typ�w 334
14 Konstruktory i Destruktory 336
14.1 Konstruktor 336
14.1.1 Przyk�ad programu zawieraj�cego klas� z konstruktorami 337
14.2 Kiedy i jak wywo�ywany jest konstruktor 343
14.2.1 Konstruowanie obiekt�w lokalnych 343
14.2.2 Konstruowanie obiekt�w globalnych 343
14.2.3 Konstrukcja obiekt�w tworzonych operatorem new 344
14.2.4 Jawne wywo�anie konstruktora 345
14.2.5 Dalsze sytuacje, gdy pracuje konstruktor 346
14.3 Destruktor 347
14.4 Konstruktor domniemany 349
14.5 Lista inicjalizacyjna konstruktora 350
14.6 Konstrukcja obiektu, kt�rego sk�adnikiem jest obiekt innej klasy 353
14.7 Konstruktory nie-publiczne ? 359
14.8 Konstruktor kopiuj�cy (albo inicjalizator kopiuj�cy) 361
14.8.1 Przyk�ad klasy z konstruktorem kopiuj�cym 363
14.8.2 Konstruktor kopiuj�cy gwarantuj�cy nietykalno�� 370
14.8.3 Wsp�odpowiedzialno�� 371
14.8.4 Konstruktor kopiuj�cy generowany automatycznie 372
14.8.1
VIII Spis tre�ci
14.8.5 Kiedy konstruktor kopiuj�cy jest niezb�dny? 372
15 Tablice obiekt�w 377
15.1 Tablica obiekt�w definiowana operatorem new 379
15.2 Inicjalizacja tablic obiekt�w 380
15.2.1 Inicjalizacja tablic obiekt�w b�d�cych agregatami 380
15.2.2 Inicjalizacja tablic nie b�d�cych agregatami 383
15.2.3 Inicjalizacja tablic tworzonych w zapasie pami�ci 386
16 Wska�nik do sk�adnik�w klasy ........... ....388
l h. l Wska�niki zwyk�e - repetytorium 388
16.2 Wska�nik do pokazywania na sk�adnik-dan� 390
16.3 Wska�nik do funkcji sk�adowej 394
16.4 Tablica wska�nik�w do danych sk�adowych klasy 396
16.5 Tablica wska�nik�w do funkcji sk�adowych klasy 397
16.6 Wska�niki do sk�adnik�w statycznych 398
17 Konwersje ........M............ 399
17.1 sformu�owanie problemu VM
17.2 Konstruktor jako konwerter 401
17.3 Funkcja konwertuj�ca - operator konwersji 404
17.4 Kt�ry wariant konwersji wybra� ? 410
17.5 Sytuacje, w kt�rych zachodzi konwersja 412
17.6 Zapis jawnego wywo�ania konwersji typ�w 413
17.6.1 Advocatus zapisu przypominaj�cego: �wywo�anie funkcji" 414
17.6.2 Advocatus zapisu: �rzutowanie" 414
17.7 Nieca�kiem dobrane ma��e�stwa, czyli konwersje przy dopasowaniu 415
17.8 Kilka rad dotycz�cych konwersji 420
18 Prze�adowanie operator�w.. ..422
18.1 Prze�adowanie operator�w - definicja i troch� teorii 424
18.2 Moje zabawki 428
18.3 Funkcja operatorowa jako funkcja sk�adowa 430
18.4 Funkcja operatorowa nie musi by� przyjacielem klasy 433
18.5 Operatory predefiniowane 434
18.6 Argumentowo�� operator�w 434
18.7 Operatory jednoargumentowe 435
18.8 Operatory dwuargumentowe 438
18.8.1 Przyk�ad na prze�adowanie operatora dwuargumentowego 438
18.8.2 Przemienno�� 440
18.9 Przyk�ad zupe�nie niematematyczny 441
18.10 Cztery operatory, kt�re musz� by� niestatycznymi funkcjami sk�adowymi 450
18.11 Operator przypisania = 451
18.11.1 Przyk�ad na prze�adowanie operatora przypisania 455
18.11.2 Jak to opowiedzie� potocznie? 461
18.11.3 Kiedy operator przypisania nie jest generowany automatycznie 463
18.12 Operator [] 464
18.13 Operator () 468
18.14 Operator-> 470
18.15 Operator new 477
18.12
Spis tre�ci IX
18.16 Operator de le t e 479
18.17 Operatory postinkrementacji i postdekrementacji, czyli koniec
z niesprawiedliwo�ci� 480
18.18 Rady praktyczne dotycz�ce prze�adowania 482
18.19 Pojedynek: Operator jako funkcja sk�adowa, czy globalna 484
18.20 Zas�ona spada, czyli tajemnica operatora � 486
18.21 Rzut oka wstecz 492
Tom III
19 Dziedziczenie .....495
19.l Istot i dziedziczenia -l4.^
19.2 Dost�p do sk�adnik�w 498
19.2.1 Prywatne sk�adniki klasy podstawowej 498
19.2.2 Nieprywatne sk�adniki klasy podstawowej 500
19.2.3 Klasa pochodna te� decyduje 501
19.2.4 Po znajomo�ci, czyli udost�pnianie wybi�rcze 503
19.3 Czego si� nie dziedziczy 504
19.3.1 Niedziedziczenie konstruktor�w 504
19.3.2 Niedziedziczenie operatora przypisania 505
19.3.3 Niedziedziczenie destruktora 505
19.4 Dziedziczenie kilkupokoleniowe 506
19.5 Dziedziczenie- doskona�e narz�dzie programowania 507
19.6 Kolejno�� wywo�ywania konstruktor�w 509
19.7 Przypisanie i inicjalizacja obiekt�w w warunkach dziedziczenia 515
19.7.1 Klasa pochodna nie definiuje swojego operatora przypisania 515
19.7.2 Klasa pochodna nie definiuje swojego konstruktora kopiuj�cego 516
19.7.3 Inicjalizacja i przypisywanie wed�ug obiektu wzorcowego b�d�cego
const 517
19.7.4 Definiowanie konstruktora kopiuj�cego i operatora przypisania dla
klasy pochodnej 517
19.8 Dziedziczenie wielokrotne 522
19.8.1 Konstruktor klasy pochodnej przy wielokrotnym dziedziczeniu 524
19.8.2 Ryzyko wieloznaczno�ci przy dziedziczeniu 526
19.8.3 Bli�sze pokrewie�stwo usuwa wieloznaczno�� 528
19.8.4 Poszlaki 528
19.9 Pojedynek: Dziedziczenie klasy contra zwieranie obiekt�w sk�adowych 529
19.10 Konwersje standardowe przy dziedziczeniu 531
19.10.1 Panorama korzy�ci 535
19.10.2 Czego robi� nie mo�na 537
19.10.3 Konwersje standardowe wska�nik�w do pokazywania we wn�trzu
klasy 540
19.11 Wirtualne klasy podstawowe 542
19.11.1 Publiczne i prywatne dziedziczenie tej samej klasy wirtualnej 545
19.11.2 Uwagi o konstrukcji i inicjalizacji w wypadku klas wirtualnych 546
19.11.3 Dominacja klas wirtualnych 549
20 Funkcje wirtualne 552
20.1 Polimerfizm .. ...559
X Spis tre�ci
20.2 Dalsze szczeg�y 562
20.3 Wczesne i p�ne wi�zanie 565
20.4 Kiedy dla wywo�a� funkcji wirtualnych mimo wszystko zachodzi wczesne
wi�zanie 566
20.5 Kulisy bia�ej magii, czyli: Jak to jest zrobione ? 568
20.6 Funkcja wirtualna, a mimo to inline 570
20.7 Pojedynek - funkcje prze�adowane contra funkcje wirtualne 570
20.8 Klasy abstrakcyjne 571
20.9 Destruktor? to najlepiej wirtualny! 578
20.10 Co prawda konstruktor nie mo�e by� wirtualny, ale 583
20.11 Finis coronat opus 588
21 Operacje Wej�cia / Wyj�cia.... 590
21.1 Biblioteka iostream 591
21.2 Strumie� 592
21.3 Strumienie predefiniowane 593
21.4 Operatory � i � 594
21.5 Domniemania w pracy strumieni predefiniowanych 595
21.6 Uwaga na priorytet 598
21.7 Operatory � oraz � definiowane przez u�ytkownika 600
21.7.1 Operator�w wstawiania i wyjmowania ze strumienia - nie dziedziczy
si� 604
21.7.2 Operatory wstawiania i wyjmowania nie mog� by� wirtualne. Nieste-
ty 606
21.8 Sterowanie formatem 607
21.9 Flagi stanu formatowania 608
21.9.1 Znaczenie poszczeg�lnych flag sterowania formatem 609
21.10 Sposoby zmiany trybu (regu�) formatowania 612
21.10.1 Zmiana sposobu formatowania funkcjami setf, unsetf 614
21.10.2 Wygodniejsze funkcje do zmiany stanu formatowania 616
21.11 Manipulatory 621
21.11.1 Manipulatory bezargumentowe 622
21.11.2 Manipulatory parametryzowane 624
21.11.3 Definiowanie swoich manipulator�w 628
21.12 Nieformatowane operacje wej�cia/wyj�cia 631
21.13 Om�wienie funkcji wyjmuj�cych ze strumienia 633
21.13.1 Funkcje do pracy ze znakami i stringami 633
21.13.2 Wczytywanie binarne - funkcja read 638
21.13.3 Funkcja ignore 639
21.13.4 Po�yteczne funkcje pomocnicze 640
21.13.5 Funkcje wstawiaj�ce do strumienia 643
21.14 Operacje we/wy na plikach 644
21.14.1 Otwieranie i zamykanie strumienia 646
21.15 B��dy w trakcie pracy strumienia 650
21.15.1 Flagi stanu b��du strumienia 650
21.15.2 Funkcje do pracy na flagach b��du 651
21.15.3 Kilka udogodnie� 652
21.15.4 Bardziej wyszukane operacje na flagach b��du strumienia 654
21.15.5 Trzy plagi - czyli �gotowiec" jak radzi� sobie z b��dami 657
21.15.1
Spis tre�ci XI
21.16 Przyk�ad programu pracuj�cego na plikach 660
21.17 Wyb�r miejsca czytania lub pisania w pliku 662
21.17.1 Funkcje sk�adowe informuj�ce o pozycji wska�nik�w 663
21.17.2 Wybrane funkcje sk�adowe do pozycjonowania wska�nik�w 664
21.18 Przyk�ad wi�kszego programu 665
21.19 Tie - harmonijna praca dw�ch strumieni 672
21.20 Attach - zmiana koryta strumienia 674
21.21 Dlaczego tak nie lubimy biblioteki stdio? 675
21.22 Niekt�re aspekty wsp�ycia biblioteki stdio z bibliotek� iostream 677
21.23 Formatowanie wewn�trzne - Operacje wyj�cia 679
21.23.1 Mechanizm automatycznej rezerwacji miejsca 682
21.23.2 Anonimowy strumie� wyj�ciowy 685
21.24 Formatowanie wewn�trzne- operacje wej�cia 685
21.24.1 Przyk�adowe zastosowanie oraz anonimowy strumie� wej�ciowy 688
21.25 O�enek: klasy wej�ciowo - wyj�ciowe dla formatowania wewn�trznego 690
21.26 Jeszcze o strumieniach anonimowych 691
22 Projektowanie program�w obiektowo orientowanych ....693
22.1 Przegl�d kilku technik programowania 694
22.1.1 Programowanie liniowe 694
22.1.2 Programowanie proceduralne 694
22.1.3 Programowanie z ukrywaniem danych 695
22.1.4 Programowanie obiektowe - programowanie �bazuj�ce" na obiektach 695
22.1.5 Programowanie Obiektowo Orientowane (OO) 696
22.2 O wy�szo�ci programowania obiektowo orientowanego nad �wi�tami
Wielkiej Nocy 696
22.3 Obiektowo Orientowane: Projektowanie 699
22.4 Praktyczne wskaz�wki dotycz�ce projektowania programu technik� OO 701
22.4.1 Rekonesans - czyli rozpoznanie zagadnienia 701
22.4.2 Faza projektowania 702
22.4.3 Etap 1: Identyfikacja zachowa� systemu 703
22.4.4 Etap 2: Identyfikacja obiekt�w (klas obiekt�w) 704
22.4.5 Etap 3: Usystematyzowanie klas obiekt�w 705
22.4.6 Etap 4: Okre�lenie wzajemnych zale�no�ci klas 707
22.4.7 Etap 5: Sk�adanie modelu. Okre�lanie sekwencji dzia�a� obiekt�w i
cykli �yciowych 709
22.5 Faza implementacji 710
22.6 Przyk�ad projektowania 710
22.7 Faza: Rozpoznanie naszego zagadnienia 711
22.8 Faza: Projektowanie 715
22.8.1 Etap l - Identyfikacja zachowa� naszego systemu 715
22.8.2 Etap 2 - Identyfikacja klas obiekt�w, z kt�rymi mamy do czynienia 716
22.8.3 Etap 3 - Usystematyzowanie klas obiekt�w z wyst�puj�cych w naszym
systemie 719
22.8.4 Etap 4 - Okre�lenie wzajemnych zale�no�ci klas 721
22.8.5 Etap 5 - Sk�adamy model naszego systemu 723
22.9 Implementacja modelu naszego systemu 727
22.10 Symfonia C++, Coda 734
22.11 Pos�owie... ...734
22.9
10
Klasy
''Tak naprawd�, to wszystko co pisa�em do tej pory - pisa�em z nadziej�, �e
wreszcie dotr� do tego rozdzia�u. Tu bowiem zaczniemy m�wi� o chyba
najwspanialszej rzeczy w C++ - czyli o definiowaniu w�asnych typ�w danych.
10.1 Typy definiowane przez u�ytkownika
Czy nigdy nie irytowa�o Ci�, �e gdy masz napisa� program, to musisz sw�j
problem, kt�ry dotyczy jakich� realnych obiekt�w (silnik�w krokowych, pokoi
hotelowych itd.) zamieni� na lu�ne liczby i lu�ne podprogramy (funkcje) ?
Rozwi�zywanie Twojego problemu polega wtedy na �onglowaniu liczbami,
kt�re w programie wcale nie s� powi�zane ze sob�, ani te� nie s� powi�zane
z funkcjami. To tylko my wiemy, �e dotycz� one tego samego silnika kroko-
wego, tej samej pralki automatycznej, czy tego samego rachunku bankowego.
Liczba typu f loat reprezentuj�ca temperatur� powierzchni promu kosmiczne-
go mo�e by� przez roztargnienie programisty wys�ana do funkcji oczekuj�cej
liczby typu f loat reprezentuj�cej wydajno�� w kwintalach na hektar. Kom-
pilator nie zauwa�y takiego b��du: mia�a by� liczba f loat i jest f loat-a wi�c
o co chodzi? Tyle, �e na skutek tego wynik b�dzie bzdurny.
W C++ dane mog� zosta� powi�zane z funkcjami - znaczy to, �e kompilator nie
dopu�ci do tego, by do funkcji oczekuj�cej argumentu typu �temperatura"
wys�a� argument typu �stan_oszcz�dno�ci". �eby tak by�o musimy najpierw
zdefiniowa� sobie taki typ.
C++ pozwala nam na zdefiniowanie w�asnego typu danej. S�owem
opr�cz typ�w f loat, int, char itd., mamy jeszcze nasz w�asny
typ - wymy�lony na u�ytek danego programu. Ten typ, to nie tylko
jedna lub kilka zebranych razem liczb - to tak�e spos�b ich zacho-
wania jako ca�o�ci.
260 Rozdz. 10 Klasy
Typy definiowane przez u�ytkownika
Jaka z tego korzy�� ?
Tak zdefiniowany typ mo�e by� �modelem" jakiego� rzeczywistego obiektu.
Rzeczywisty obiekt - np. pralk� automatyczn� - mo�na w komputerze opisa�
zespo�em liczb i zachowa�.
Dla pralki automatycznej te liczby to na przyk�ad jej cena, rok produkcji, wymia-
ry, kolor, czy wydajno�� wyra�ona w kilogramach bielizny, kt�r� pralka mo�e
pra� za jednym razem. To tak�e liczby reprezentuj�ce jej stan wewn�trzny
opisany przez program prania, na kt�ry j� w�a�nie nastawili�my, czy te� liczba
opisuj�ca bie��cy etap prania. S�owem sk�adnikiem takiego obiektu jest zbi�r
r�nych liczb.
Z kolei zachowania pralki automatycznej to zbi�r funkcji, kt�re mo�e dla nas
wykona�. Mo�e to by� pranie, p�ukanie, wirowanie itd. Te funkcje s� tak�e
sk�adnikiem obiektu typu pralka automatyczna.
Lu�ne liczby i lu�ne funkcje - o kt�rych wiemy, �e opisuj� w programie pralk�
automatyczn� - zbieramy razem i budujemy z nich pewn� ca�o��. Powstaje
w komputerze nowy typ danej: pralka automatyczna.
M�wimy typ dlatego, �e kreujemy nie jeden konkretny obiekt, ale raczej klas�
obiekt�w. Czyli na razie raczej wymy�lili�my pralk� automatyczn� - jeszcze
�aden konkretny egzemplarz takiej pralki (obiekt) nie istnieje.
l Klasa to inaczej m�wi�c typ.
Tak jak typem jest int, f loat, ...
Przyjrzyjmy si� teraz jak si� klas� definiuje
Nie jest to trudne. Definicja klasy sk�ada si� ze s�owa kluczowego c las s, po
kt�rym stawiamy wybran� przez nas nazw�.
class nasz_typ {
// ............... cia�o klasy
Potem nast�puje klamra, a w niej cia�o klasy - czyli okre�lenie z czego si� sk�ada.
Zauwa�, �e po klamrze stawia si� �rednik. Pocz�tkowo b�dziesz o nim cz�sto
zapomnia�.
Je�li w przysz�o�ci zechcemy stworzy� egzemplarz obiektu takiej klasy, to wys-
tarczy w�wczas poda� nazw� typu i nazw� tego konkretnego nowego obiektu.
Identycznie jak w wypadku typu wbudowanego int . Aby mie� egzemplarz
obiektu typu int o nazwie suma piszemy:
int suma ;
Przy typie definiowanym przez u�ytkownika - sprawa wygl�da analogicznie.
Oto utworzenie obiektu abc, kt�ry jest klasy nasz_typ:
nasz_typ abc ;
Dzi�ki temu zapisowi w pami�ci maszyny utworzony zostaje jeden obiekt klasy
nasz_typ i temu egzemplarzowi nadana jest nazwa abc. Zapis
nasz__typ m ;
Rozdz. 10 Klasy
Sk�adniki klasy
261
spowoduje utworzenie w pami�ci drugiego egzemplarza obiektu klasy
nas z_typ. Ma on nazw� m. To tak, jakby�my na podstawie tych samych plan�w
konstrukcyjnych zbudowali drug� pralk� automatyczn�. Te plany konstrukcyj-
ne to oczywi�cie definicja klasy.
Skoro mamy typ, to mo�na utworzy� od niego typ pochodny - czyli na przyk�ad
wska�nik do obiekt�w tego typu:
nasz_typ * wsk ;
czy te� na przyk�ad referencj� (przezwisko) obiektu takiego typu
nasz_typ obiekcik ;
nasz_typ & przezw = obiekcik ;
10.2 Sk�adniki klasy
W definicji naszej klasy widzimy na razie puste miejsce zwane cia�em klasy.
W tym w�a�nie miejscu deklaruje si� sk�adniki klasy.
Sk�adnikami mog� by� r�nego typu dane (np. int, f loat, stringi itd). Nazy-
wamy je danymi sk�adowymi tej klasy. B�d� te� na nie czasem m�wi�: sk�ad-
niki-dane. Oto definicja klasy, w kt�rej jest kilka danych sk�adowych:
class pralka
public:
int
f loat
char
(.
nr_programu ;
temperatura_prania
nazw�[80] ;
(Bardzo prosz� nie pytaj mnie jeszcze co znaczy to s�owo public. Powiemy
o tym dopiero za chwil�).
Aby odnie�� si� do sk�adnik�w obiektu mo�emy si� pos�ugiwa� jedn� z poni�-
szych notacji:
� obiekt.sk�adnik
� wska�nik -> sk�adnik
� referencja.sk�adnik
Jak wida� wyst�puje tu operator '.' (kropka) - operator odniesienia si� do
sk�adnika obiektu znanego z nazwy lub referencji. Je�li mamy obiekt pokazy-
wany wska�nikiem, to do odniesienia si� do sk�adnika takiego obiektu s�u�y
nam operator ->
Je�li mamy obiekt
pralka czerwona ;
pralka * wska� ;
pralka & ruda = czerwona;
// definicja egzemplarza obiektu
II definicja wska�nika
II definicja referencji
to do sk�adnika temperatura_prania w obiekcie czerwona mo�emy od-
nie�� si� tak:
czerwona.temperatura_prania = 60
// nazw� obiektu
262
Rozdz.10 Klasy
Sk�adniki klasy
wska� = & czerwona ;
wska� -> temperatura_prania = 60 ; //wska�nikiem
ruda . temperatura_prania = 60 ; j j referencj�
Sk�adnikami klasy mog� by� te� � uwaga-uwaga! � funkcje. Funkcje te nazy-
wa� b�dziemy funkcjami sk�adowymi. Za ich pomoc� pracujemy zwykle na
danych sk�adowych. Oto klasa pralka wyposa�ona w funkcje:
class pralka {
public :
|| - -funkcje skladowe -
void pierz(int program);
void wiruj(int minuty);
|| - - dane skladowe -
int nr_programu ;
float temperatura_prania ;
char nazwa[80] ;
// - - znowu jakas funkcja skladowa
int krochmalenie(void) ;
} ;
W definicji tej widzisz deklaracje funkcji pomieszane z deklaracjami danych.
Niezale�nie od miejsca zdefiniowania sk�adnika wewn�trz klasy - sk�adnik
znany jest w ca�ej definicji klasy.
M�wimy, �e nazwy deklarowane w klasie maj� zakres wa�no�ci - r�wny
obszarowi ca�ej klasy.
Inaczej ni� to by�o w zwyk�ych funkcjach. Przywykli�my, �e je�li w po�owie
funkcji zdefiniowali�my dan�, to by�a ona znana od miejsca definicji a� do ko�ca
funkcji. W linijkach powy�ej znana nie by�a. Przyk�ad:
void funkcja()
l
int a,b,c ;
c = 15 ;
a = 4 + c ;
int nnn ;
nnn = a + 6 ;
/ / tu jeszcze nazwa nnn nie jest znana-
/ / < moment definicji obiektu nnn
/ / tu ju� nnn jest znane �
Dana sk�adowa mo�e by� zdefiniowana nawet w ostatniej linijce cia�a klasy,
a i tak jest znana w ca�o�ci klasy. Po prostu klasa w przeciwie�stwie do funkcji
nie ma pocz�tku i ko�ca. To jakby pud�o na sk�adniki.
Potem zobaczymy, �e sk�adnikami klasy mo�e by� jeszcze wiele innych cieka-
wych rzeczy.
Rozdz.10 Klasy 263
Sk�adnik b�d�cy obiektem
10.3 Sk�adnik b�d�cy obiektem
Sk�adnikiem klasy mo�e by� dana typu wbudowanego np. obiekt typu int,
char [ 20 ], f loat*, a mo�e by� te� obiekt typu zdefiniowanego przez u�ytko-
wnika. Innymi s�owy obiekt jakiej� innej klasy.
Pocz�tkowo mo�e si� to wyda� zawi�e wi�c pos�u�my si� analogi�: obiekt klasy
lampa, kt�ry stoi przede mn� na biurku ma sk�adniki - liczby - takie jak
wysoko��, ci�ar, ale te� jego sk�adnikiem jest inny obiekt: �ar�wka, czy te�
obiekt klasy aba�ur. Ka�dy z nich sam jest obiektem jakiej� klasy. Oczywi�cie
m�g�bym uda�, �e o tym nie wiem i wpisywa� wszystkie sk�adniki obiektu
klasy �ar�wka (moc, wielko�� ba�ki) w obr�bie definicji klasy lampa. Tylko co
bym przez to zyska�? Nic. A co bym straci�? Straci�bym klas� �ar�wka, kt�ra
mo�e mi si� przyda� w jeszcze innych miejscach programu. W�a�ciwie na tym
polega jedna z tajemnic programowania obiektowego: aby umiej�tnie u�ywa�
klas ju� kiedy� zdefiniowanych.
Wniosek jest taki:
I
op�aca si� po prostu budowa� klasy sk�adaj�ce si� z innych obiek-
t�w.
Buduj�c dom op�aca si� skorzysta� z gotowego obiektu ceg�a, a nie budowa�
dom wypalaj�c jednocze�nie nieopodal ceg��.
10.4 Enkapsulacja
Jak widzisz w ciele klasy s� dane i funkcje. Jest to bardzo wa�ny fakt, bowiem
w tej definicji, jak w kapsule, zamkn�li�my dane oraz funkcje do pos�ugiwania
si� nimi. Po angielsku takie zamkni�cie w kapsu�� nazywa si�: encapsulation.
Je�li chodzi o zgrabne i poprawne przet�umaczenie tego terminu na polski -
poddaj� si� i wybieram wariant najprostszy: enkapsulacja.
Dlaczego enkapsulacja jest tak� wa�n� cech� j�zyka C++? Dlatego, �e odzwier-
ciedla nasze codzienne my�lenie o obiektach.
Na przyk�ad obiekt zegarek to nie tylko trybiki, k�ka i wskaz�wki. To tak�e
spos�b post�powania z nim i zachowania, kt�re tym sk�adnikom towarzysz�.
Ten spos�b post�powania jest charakterystyczny dla zegarka. Powiedzenie
�nastaw!" w stosunku do zegarka to jest przecie� jaka� akcja - charakterysty-
czna dla zegarka! Powiedzenie �nastaw!" w stosunku do obiektu klasy czajnik
spowoduje, �e uruchomimy akcj�, kt�ra w naszym m�zgu jest sk�adnikiem
klasy czajnik. Zauwa�: zupe�nie innej akcji.
Zaraz, zaraz � to chyba ju� znamy! Czy�by prze�adowanie nazwy funkcji?
Nie. Nie ma tu mowy o �adnym prze�adowaniu nazw funkcji. Je�li m�wimy:
wykonaj na obiekcie klasy zegarek funkcj� nastaw, to kompilator nie pr�buje
niczego dopasowywa�. Si�ga na �lepo do klasy zegarek, a tam jest w�a�ciwa
funkcja nastaw.
To by�o zdroworozs�dkowe t�umaczenie. Mo�na to jednak bardzo kr�tko wy-
t�umaczy� na podstawie definicji prze�adowania: Prze�adowanie nast�puje wte-
dy, gdy funkcje o tej samej nazwie maj� identyczny zakres wa�no�ci. Je�eli za�
264
Rozdz. 10 Klasy
Ukrywanie informacji
maj� inny zakres wa�no�ci, to nie nast�puje prze�adowanie tylko zas�oni�cie.
Funkcje sk�adowe klasy maj� zakres klasy - przecie� ich deklaracje tkwi�
wewn�trz nawiasu klamrowego, kt�ry wyznacza lokalny zakres wa�no�ci.
M�wimy: zakres wa�no�ci klasy.
Zakresem wa�no�ci jednej funkcji nastaw jest klasa czajnik. Zakresem innej
funkcji nastaw jest klasa zegarek. Te funkcje mog� si� co najwy�ej nawzajem
zas�ania�. Czasem wida� jedn�, czasem drug�.
Wr��my jednak do istoty rzeczy. Definicja klasy sprawi�a, �e dane i funkcje,
kt�re dawniej mieliby�my lu�nie rozrzucone w programie - teraz zamkni�te s�
w kapsule. Dzi�ki temu, w momencie definicji pojedynczego egzemplarza obie-
ktu takiej klasy � dostajemy realizacj� takiej kapsu�y.
pralka bia�a
// definicja egzemplarza
II obiektu klasy pralka
To tak, jak kupujemy pralk� w obudowie, a nie lu�ne cz�ci. Je�li chcemy mie�
drugi obiekt takiej pralki to definiujemy
pralka czerwona
// inny obiekt klasy pralka
To ogromna wygoda. W tradycyjnym programowaniu je�li nawet zdefiniowa-
liby�my te wszystkie lu�ne sk�adniki klasy pralka, to przy drugim egzemplarzu
musieliby�my zrobi� to samo jeszcze raz.
Kapsu�� si� �atwiej pos�ugiwa� ni� rozsypanymi elementami. Je�li
Ci� to jeszcze nie przekonuje, to pomy�l dlaczego transport prze-
stawi� si� na przewo�enie obiekt�w klasy kontener.
10.5 Ukrywanie informacji
Skoro, jak powiedzieli�my, sk�adniki klasy zamkni�te s� w kapsule - to ta
kapsu�a mo�e by� prze�roczysta lub nie. Co� mo�e by� dost�pne spoza klasy
lub nie.
Oto przyk�ad klasy:
class nasz__typ {
// sk�adniki prywatne ***********************
private :
int liczba ; //<�prywatne dane sk�adowe
float temperatura ;
char komunikat[80] ;
int czy_gotowe() ; //<�prywatna funkcja sk�adowa
t) Natomiast nic nie przeszkadza, by w obr�bie danej klasy dana funkcja by�a prze-
�adowana. Zakres tych wersji funkcji jest wtedy ten sam. Mo�e by� przecie� 15
sposob�w nastawiania zegarka.
11) Przesadzam. W klasycznym C mo�na si� pos�u�y� tzw. strukturami. Za to w
j�zykach FORTRAN, BASIC nie ma ju� takich narz�dzi. Tu by�aby m�ka.
Rozdz. 10 Klasy
Ukrywanie informacji
265
// sk�adniki publiczne
public :
// < � publiczna dana sk�adoiua
// < � publiczna funkcja sk�adowa
float pr�dko�� ;
int zrob_pomiar ( ) ;
W ciele tej klasy widzimy wyra�nie dwie grupy - wyst�puj�ce po etykietach
private i public.
Etykieta private
oznacza, �e deklarowane za ni� sk�adniki (funkcje i dane) s� dost�pne tylko z
wn�trza klasy. W wypadku danych sk�adowych oznacza to, �e tylko funkcje
b�d�ce sk�adnikami klasy mog� te prywatne dane odczytywa� lub do nich
zapisywa�.
W wypadku funkcji oznacza to, �e mog� one zosta� wywo�ane tylko przez inne
funkcje sk�adowe tej klasy .
Etykieta public
Dalej w definicji klasy nasz_typ widzimy grup� sk�adnik�w pod wsp�ln�
etykiet� publ i c. Publiczne sk�adniki-dane mog� by� u�ywane z wn�trza klasy,
a tak�e spoza zakresu klasy. Analogicznie publiczne funkcje sk�adowe mog�
by� wywo�ywane dodatkowo tak�e spoza klasy.
Publiczn� funkcj� sk�adow� obiekt�w klasy pralka jest na przyk�ad funkcja
pranie_koszul, to dlatego, �e ja, nie b�d�c sk�adnikiem klasy pralka, mog�
t� funkcj� wywo�a�. Prywatn� funkcj� jest na przyk�ad jaka� funkcja
obroc_beben_pralki_w_lewo. Tego nie mog� bezpo�rednio wywo�a�.
Pomy�lisz pewnie tak: skoro sk�adniki prywatne s� upo�ledzone,
bo nie ma do nich dost�pu z zewn�trz, to dlaczego nie opatrzy�
wszystkiego etykiet� public. A mo�e nie mo�na?
Mo�na! W C++ mo�na prawie wszystko. Tylko zobacz jakie b�d� tego konsek-
wencje. Wyobra� sobie, �e wytwarzasz klas� obiekt�w pod tytu�em �telewizor".
Chodz� one �wietnie. Maj� w sobie ok. 50 element�w, kt�re mo�na �rubokr�tem
stroi�. Dajesz teraz obiekt takiej klasy u�ytkownikowi. Co dostaje? Telewizor
bez obudowy. Wszystkie 50 miejsc zagro�one jest jego ochocz� akcj� �rubokr�-
tem. Nawet je�li dostarczane przez Ciebie telewizory s� �wietne, to gdy kto�
we�mie do r�ki �rubokr�t i zacznie kr�ci� - rozstroi to tak, �e telewizor b�dzie
dzia�a� �le. To zepsuje Ci opini�.
Z kolei inny u�ytkownik, gdy b�dzie chcia� zwi�kszy� w telewizorze jasno��,
a zobaczy 50 pokr�te�, to po prostu powie: to za trudne, lepiej ju� p�jd� do kina!
Jaka jest sytuacja optymalna? Zaopatrzy� obiekt w obudow� broni�c� dost�pu
do tych 50 miejsc, a na zewn�trz obudowy wystawi� do publicznego u�ytku
tylko pokr�t�a spe�niaj�ce funkcje: zwi�ksz jasno��, prze��cz kana�.
�'
Nie wspominam tu na razie o tzw. funkcjach zaprzyja�nionych
266 Rozdz. 10 Klasy
Ukrywanie informacji
Tak nale�y nauczy� si� rozumowa� w wypadku wymy�lania klasy. My wymy-
�lamy klas�, a kto� inny b�dzie musia� za pomoc� obiekt�w tej klasy progra-
mowa�. Taka jest sytuacja przy programowaniu w zespo�ach. Je�li nawet jeste�
samodzielnym programist� amatorem i to Ty sam b�dziesz klas� definiowa�,
oraz tylko Ty sam b�dziesz z niej korzysta�, to wszystko to, co powiedzia�em,
nadal pozostaje wa�ne. Kto�, kto amatorsko zbudowa� sobie na stole zasilacz,
wk�ada na ko�cu te wszystkie druty i tranzystory do pude�ka po butach. To po
to, by - gdy za chwil� tego zasilacza b�dzie u�ywa� przy zasilaniu kolejki
elektrycznej - nie zrobi� przypadkowego zwarcia mi�dzy n�kami tranzysto-
r�w. Ani, by nie przestawi� omy�kowo napi�cia zamiast zwrotnicy.
A zatem dowiedzieli�my si�, �e:
Istniej� etykiety za pomoc�, kt�rych mo�na okre�la� dost�p do sk�adnik�w
klasy.
Poznali�my ju� dwie, ale jest ich trzy
private:
protected:
public:
Okre�laj� one dost�p do poszczeg�lnych sk�adnik�w klasy.
S� trzy rodzaje dost�pu do sk�adnika klasy
Sk�adnik private
*�* jest dost�pny tylko dla funkcji sk�adowych danej klasy. (Tak�e dla
funkcji zaprzyja�nionych z t� klas� - por. str 307). Je�eli zale�y nam na
ukryciu informacji, to w�wczas sk�adnik powinien by� deklarowany
w�a�nie jako prywatny.
Sk�adnik protected
*** jest dost�pny tak, jak sk�adnik private, ale dodatkowo jest jeszcze
dost�pny dla klas wywodz�cych si� od tej klasy.
(O tym, �e klasa mo�e mie� potomk�w b�dziemy m�wi� w rozdziale o
dziedziczeniu. Tu tylko zapami�tajmy, �e sk�adniki protected s� to
sk�adniki zastrze�one dla siebie i rodzinki).
Sk�adnik public
*** jest dost�pny bez ogranicze�. Zwykle sk�adnikami takimi s� jakie� wy-
brane funkcje sk�adowe. To za ich pomoc� dokonuje si� z zewn�trz
operacji na danych prywatnych.
Etykiety te mo�na umieszcza� w dowolnej kolejno�ci, mog� te� si� powtarza�.
Zawsze oznaczaj�, �e te sk�adniki klasy, kt�re nast�puj� bezpo�rednio po ety-
kiecie - maj� tak okre�lony dost�p.
Domniemanie
Zak�ada si�, �e - dop�ki w definicji klasy nie wyst�pi �adna z tych etykiet -
sk�adniki przez domniemanie maj� dost�p private.
class dzika {
int a ;
Rozdz.10 Klasy
Klasa a obiekt
267
f loat
void
protected
char
void
public :
int
void
private:
int
public :
void
b ;
funl(int) ;
m ;
fun2(void) ;
x ;
fun3(char*);
d ;
fun4(void) ;
W powy�szym przyk�adzie nast�puj�ce sk�adniki klasy s� prywatne (zastrze-
�one dla siebie)
a, b, funl, d
protected - (czyli zastrze�one dla siebie i potomk�w)
m, fun.2
publiczne (dost�pne dla wszystkich)
x, fun3, fun4
Na pocz�tku klasy nie ma �adnej etykiety, wi�c zak�ada si�, �e sk�adniki a, b,
f unl maj� by� prywatne. Potem wyst�puj� ju� etykiety, kt�rymi regulujemy
dost�p do wybranych sk�adnik�w.
Pokazany spos�b okre�lania dost�pu jest co prawda poprawny, jednak nie
poleca�bym go. Lepiej wszystkie sk�adniki o danym dost�pie zgrupowa� razem.
W�wczas wystarcza jeden rzut oka na definicj� klasy i ju� wiemy co jest dost�-
pne z zewn�trz.
Podkre�li� nale�y wyra�nie, �e sterowanie dost�pem jest pewnego rodzaju
dobrodziejstwem, kt�re chroni nas by�my sobie czego� w danym obiekcie
przez nieuwag� nie zepsuli.
Sterowanie dost�pem nie zabezpiecza jednak przed �wiadomym dzia�aniem
nastawionym na zepsucie. W C++ prawie wszystko jest mo�liwe, wi�c je�li
zechcesz to i tak mo�esz si� do takich prywatnych danych dosta�. No, ale to ju�
b�dzie �wiadomym oszustwem.
10.6 Klasa a obiekt
Wiemy ju� co to jest klasa. Definicja klasy to jakby projekt techniczny nowego
typu zmiennej. Maj�c ju� zdefiniowan� klas� mo�emy stworzy� kilka egzem-
plarzy obiekt�w danej klasy. Tak jak w wypadku typu (klasy) int mo�emy
stworzy� kilka obiekt�w typu int:
int a, m, licznik, cena, kolor ;
268
Rozdz. 10 Klasy
Klasa a obiekt
Ta definicja powoduje utworzenie pi�ciu r�nych obiekt�w typu (klasy) int.
Podobnie w wypadku typu zdefiniowanego przez nas samych po definicji klasy
mo�emy przyst�pi� do definiowania konkretnych egzemplarzy obiekt�w danej
klasy.
Wymy�lmy sobie tak� prost� klas�:
class osoba {
char nazwisko[80] ;
int wiek ;
public:
void zapami�taj(char *, int );
void wypisz();
} ;
W klasie tej widzimy dwa prywatne sk�adniki - s� to dane zawieraj�ce infor-
macje o nazwisku i wieku. Publicznymi sk�adnikami s� dwie funkcje
� zapami�taj - wpisuj�ca informacje o nazwisku i wieku do
odpowiednich sk�adnik�w
� wypi s z - do wypisania na ekranie informacji zapisanej wcze-
�niej w obiekcie.
Definicja czterech egzemplarzy obiekt�w tej klasy to po prostu instrukcja
osoba studentl, student2, profesor, pilot ;
Dygresja: _
Zamiast m�wi�:
egzemplarz obiektu danej klasy
m�wi� te� b�dziemy po prostu:
obiekt danej klasy.
Poniewa� jednak to pierwsze, d�u�sze sformu�owanie wyra�niej
podkre�la r�nic� mi�dzy klas� a obiektem, dlatego przez pewien
czas cz�ciej b�d� u�ywa� pierwszej formy.
Zobaczyli�my wi�c jak powstaj� cztery egzemplarze obiekt�w naszej klasy
osoba. Jak wida� ka�dy z nich ma swoj� nazw�.
Nale�y sobie wyra�nie u�wiadomi�, �e sama definicja klasy nie definiuje:
�adnych obiekt�w.
Konkretniej - w naszym wypadku po definicji klasy nie ma jeszcze w pami�ci
�adnej tablicy nazwisko, ani �adnej zmiennej wiek. To dopiero definicja
czterech egzemplarzy obiekt�w tej klasy sprawi�a, �e w pami�ci powsta�y
cztery zespo�y danych - cztery tablice do przechowywania nazwiska i cztery
zmienne typu int do przechowywania informacji o wieku osoby. Ka�dy z tych
zespo��w danych mo�e przechowa� dane o jednej osobie.
Sama definicja klasy to jakby tylko piecz�tka. Dop�ki jej nie odbi-
jemy czterokrotnie na papierze (pami�� komputera) dot�d na tym
papierze nic nie ma. Piecz�tka le�y sobie na boku.
Rozdz.10 Klasy 269
Klasa a obiekt
�atwo sobie to uzmys�owi� patrz�c na typ wbudowany jakim jest typ int.
Tw�rcy je�yka zdefiniowali ten typ int, aby s�u�y� programistom do przecho-
wywania liczb ca�kowitych. Ta definicja typu (klasy) int ju� gdzie� w j�zyku
C++ tkwi. Dop�ki jednak nie napiszemy definicji egzemplarza obiektu tego
typu, dot�d w pami�ci nie jest zarezerwowana �adna kom�rka na ten cel. To
dopiero definicja
int x ;
sprawia, �e w pami�ci jest jeden obiekt tego typu.
Zapami�taj:
| Klasa to typ obiektu, a nie sam obiekt.
W definicji klasy sk�adniki dane nie mog� mie� inicjalizatora. Definicja klasy jest
przecie� tylko jakby formularzem do wype�nienia. Dokument klasy paszport,
kt�rej matryca (definicja) jest w drukarni pa�stwowej, nie zawiera wydrukowa-
nego nazwiska ani daty urodzenia. Jest tam tylko miejsce na nazwisko. Te dane
(inicjalizuj�ce go) wpisuje si� dopiero si� do konkretnego egzemplarza obiektu
klasy paszport.
class paszport J
char nazwisko [40] ;
char imi� [40] ;
int numer ;
int wzrost = 176 ; //b��d!!!
} ;
Gdyby tak wygl�da�a definicja klasy paszport, to wszystkie paszporty mia�y by
na zawsze wydrukowany wzrost w�a�ciciela r�wny 176 cm. Na taki bezsens
kompilator C++ nie pozwoli.
Dane do obiektu danej klasy wpisuje si� dopiero, gdy konkretny obiekt definiu-
jemy (wyrabiamy sobie paszport, kupujemy pralk�) albo p�niej, gdy jakich�
zmian potrzebujemy (za�atwiamy do paszportu jak�� wiz�, lub wsypujemy do
pralki proszek). O tym jeszcze porozmawiamy w osobnym rozdziale.
Warto uzmys�owi� sobie jeszcze jedn� rzecz: Ot� je�li w naszym wypadku
zdefiniowali�my cztery obiekty klasy osoba, to w pami�ci utworzone zosta�y
cztery r�ne komplety sk�adnik�w danych tej klasy. To w ko�cu zrozumia�e, bo
musz� by� np. cztery tablice do przechowywania czterech r�nych nazwisk. Co
jednak ciekawe:
l funkcje sk�adowe s� w pami�ci tylko jednokrotnie.
Cztery oddzielne komplety sk�adnik�w danych s� zrozumia�e, bo przecie�
ka�dy ma przechowywa� inn� informacj�. Natomiast funkcje sk�adowe dla
ka�dego egzemplarza obiektu danej klasy dzia�aj� przecie� identycznie. S� wi�c
w pami�ci komputera jednokrotnie - po to, by oszcz�dza� pami��.
W zasadzie o tej sprawie nie musia�by� wcale wiedzie�. Powiedzia�em to jednak
po to, by� nie s�dzi�, �e poszczeg�lny obiekt w pami�ci jest bardzo du�y. Taka
obawa prowadzi�aby do niech�tnego definiowania nowych egzemplarzy obiek-
t�w.
270 Rozdz. 10 Klasy
Funkcje sk�adowe
Znowu analogia. Sk�adnikiem typu wbudowanego int jest na pewno
funkcja (sk�adorua) obs�uguj�ca mno�enie liczb typu int. Nie s�dzisz
chyba, �e za ka�dym razem, gdy w programie definiujesz zmienn� typu
int przydzielana jest mu w pami�ci nowa funkcja obs�uguj�ca to mno�e-
nie. Obiekt�w tego typu mo�e by� sto, a obs�uguje je ta sama funkcja.
O tym, jak wielki jest obiekt, mo�esz si� �atwo przekona� stosuj�c operator
sizeof.
10.7 Funkcje sk�adowe
Funkcje zdeklarowane wewn�trz definicji klasy s� sk�adnikami tej klasy. Nazy-
wamy je funkcjami sk�adowymi. Funkcje te maj� zakres klasy, w kt�rej je
zadeklarowali�my. (Zwyk�e funkcje - jak pami�tamy - maj� zakres pliku, w
kt�rym je zadeklarowano).
Funkcje sk�adowe maj� pe�ny dost�p do wszystkich sk�adnik�w swojej klasy �
to znaczy: i do danych (mog� z nich korzysta�) i do innych funkcji (mog� je
wywo�ywa�). Do sk�adnika swojej klasy odwo�uj� si� po prostu podaj�c jego
nazw�.
10.7.1 Pos�ugiwanie si� funkcjami sk�adowymi
Funkcja sk�adowa jest jakby narz�dziem, za pomoc� kt�rego dokonujemy ope-
racji na danych sk�adowych klasy. Szczeg�lnie na tych sk�adnikach, kt�re s�
pr ivat e i tym samym spoza klasy niedost�pne. Przyjrzyjmy si� jak - dla przed
chwil� zdefiniowanej klasy osoba - mo�emy wywo�a� funkcje sk�adowe.
Powiedzmy �ci�lej - funkcj� wywo�uje si� dla konkretnego obiektu danej klasy.
Musimy wi�c mie� definicje obiekt�w.
osoba studentl, student2, profesor, pilot ;
Oto wywo�anie funkcji sk�adowej dla obiektu profesor :
profesor.zapami�taj("Albert Einstein", 55);
Dla pozosta�ych obiekt�w podobnie
studentl.zapami�taj("Ruediger Schubart", 26);
student2.zapami�taj("Claudia Bach", 25);
pilot.zapami�taj("Neil Armstrong", 37);
Wywo�anie takie nale�y rozumie� tak: na rzecz obiektu profesor wykonaj
funkcj� zapami�taj z podanymi argumentami.
Sk�adnia jest wi�c taka: nazwa obiektu, potem kropka, a potem nazwa funkcji
sk�adowej z ewentualnymi argumentami
obiekt.funkcja(argumenty) ;
Zapytasz zapewne - Po co ten obiekt i ta kropka? Nie mo�na by wywo�a� tej
funkcji po prostu tak:
zapami�taj ("Albert Einstein", 55); //B��d!
Rozdz.10 Klasy 271
Funkcje sk�adowe
Nie, nie mo�na. Zapominasz, �e w pami�ci s� ju� cztery zestawy danych od-
powiadaj�ce czterem r�nym obiektom klasy osoba. Funkcja musi wiedzie� na
kt�rym konkretnym obiekcie ma pracowa�.
Je�li funkcja zapami�taj ma wpisa� nazwisko �Albert Einstein" do tego
konkretnego obiektu klasy osoba, kt�ry to obiekt nazwali�my profesor, to t�
nazw� profesor stawiamy przed wywo�aniem funkcji.
Mo�emy tak�e wywo�a� funkcj� sk�adow� dla tego samego obiektu pokazy-
wanego wska�nikiem:
osoba * wsk ; // definicja wska�nika
wsk = �profesor ; // ustawienie wska�nika na
j l obiekcie profesor
wsk -> zapami�taj("Albert Einstein", 55);
A oto jak wywo�a� funkcj� dla tego samego obiektu przezywanego referencj�:
osoba & belfer = profesor ; l l definicja referencji
belfer.zapami�taj("Albert Einstein", 55);
10.7.2 Definiowanie funkcji sk�adowych
Do tej pory du�o m�wili�my o funkcji zapami�taj, ale nigdzie nie pojawi�a
si� jeszcze jej definicja, czyli jej tre��, cia�o - instrukcje sk�adaj�ce si� na ni�.
Gdzie mo�e by� zdefiniowana funkcja sk�adowa?
Mo�e si� ona znale�� w dw�ch miejscach:
Pierwszy spos�b: -Mo�e si� znale�� wewn�trz samej definicji klasy.
Oto taka realizacja:
class osoba {
// sk�adniki prwate
char nazwisko[80] ;
int wiek ;
publ i c : // sk�adniki publiczne
II � � definicje funkcji sk�adowych
void zapami�taj(char * napis, int lata)
{
strcpy(nazwisko, napis) ;
wiek = lata ,-
void wypisz()
cout � nazwisko � " , lat : " � wiek � endl;
};
272 Rozdz. 10 Klasy
Funkcje sk�adowe
Jak wida� funkcja zapami�taj przys�ane do niej argumenty przepisuje do
sk�adnik�w nazwisko oraz wiek. Przy przepisywaniu nazwiska (jest to string)
pos�uguje si� funkcj� strcpy (string copy) z biblioteki standardowej.
Jest te� drugi spos�b definiowania funkcji sk�adowych:
W definicji klasy umieszcza si� tylko same deklaracje tych funkcji, natomiast
definicje s� napisane poza cia�em klasy:
class osoba {
// sk�adniki private
char nazwisko[80] ;
int wiek ;
public : j j sk�adniki publiczne
II � �deklaracje funkcji sk�adowych
void zapami�taj(char * napis, int lata) ;
void wypisz() ;
} ; // koniec definicji klasy
/******************************************************/
void osoba::zapami�taj(char * napis, int lata)
strcpy (nazwisko, napis) ;
wiek = lata ;
}
void osoba :: wypisz ()
{
cout � nazwisko � " , lat : " � wiek � endl ;
Poniewa� funkcje znajduj� si� teraz poza definicj� klasy dlatego ich nazwa
uzupe�niona zosta�a nazw� klasy, do kt�rej maj� nale�e�. S�u�y do tego wido-
czny operator zakresu :: .
Taki zapis informuje kompilator, �e jest to realizacja tej funkcji zapami�taj,
kt�r� zadeklarowali�my w definicji klasy osoba. Je�li by�my o umieszczeniu
tego przedrostka zapomnieli - kompilator uzna, �e jest to jaka� funkcja za-
pami�taj - jedna z wielu zwyk�ych w programie. Natomiast w trakcie link-
owania linker nie znajdzie poszukiwanej przez siebie funkcji osoba: : za-
pami�taj i otrzymamy komunikat, �e funkcja sk�adowa zapami�taj dla
klasy osoba nie jest nigdzie zdefiniowana.
Nazwa klasy i operator zakresu s� rzeczywi�cie jakby przedrostkiem nazwy
funkcji. M�wi� o tym dlatego, by ustrzec Ci� przed b��dem polegaj�cym na tym,
�e nazw� klasy i operator :: ustawisz na samym pocz�tku linijki, a dopiero po
tym typ zwracany przez funkcj�.
osoba: : void zapami�taj (...) //B��d !
{ l*cia�o*l }
B��du tego nie pope�nisz je�li zapami�tasz, �e nazwa klasy i operator :: uzupe�-
niaj� nazw� funkcji i jakby czyni� j� d�u�sz�.
Poprawnie wi�c ma by�
Rozdz. 10 Klasy 2/3
Funkcje sk�adowe
void osoba : : zapami�taj (...)
{ /*cia�o*/ }
Funkcja zdefiniowana poza klas� przy zastosowaniu tego przedrostka ma
dok�adnie taki sam zakres, jakby by�a zdefiniowana wewn�trz klasy. Oba
sposoby definiuj� funkcje o zakresie wa�no�ci klasy osoba.
W konsekwencji wi�c: niezale�nie czy funkcja sk�adowa zdefiniowana jest tym
pierwszym czy drugim sposobem - ma jednakowy dost�p do wszystkich sk�ad-
nik�w swojej klasy.
Jest jednak ogromna r�nica dla kompilatora.
Je�li bowiem funkcj� sk�adow� zdefiniujemy wewn�trz definicji
klasy (spos�b 1) to kompilator uznaje, �e chcemy, aby ta funkcja
by�a typu inline (patrz str. 91)
Definicja funkcji sk�adowej b�d�ca poza definicj� klasy (spos�b 2)
sprawia, �e funkcja nie jest automatycznie uznawana jako inline.
Kiedy kt�ry spos�b zatem wybra� ?
Um�wmy si� tak:
� Je�li cia�o funkcji sk�adowej ma nie wi�cej ni� dwie linijki, to
funkcj� t� definiujemy wewn�trz definicji klasy (spos�b 1). Jest
wtedy automatycznie inline.
� Je�li funkcja sk�adowa jest d�u�sza ni� te dwie linijki, to defini-
ujemy j� poza definic� klasy.
Zapytasz pewnie: - Wobec tego funkcja sk�adowa zdefiniowana poza definicj�
klasy nie mo�e by� nigdy typu inline?
Mo�e! Tylko trzeba to wtedy wyra�nie zaznaczy� pisz�c s��wko inline:
inline void osoba :: wypisz ()
{
/ / . . . cia�o funkcji
}
A oto jak wygl�da prosty program z u�yciem klasy osoba:
#include <iostream.h>
#include <string.h> // O
/////////////////////// definicja klasy /////////////////////
class osoba {
char nazwisko [80] ; // �
int wiek ;
public : // �
void zapami�taj (char * napis, int lata) ; // O
void wypisz () // �