6569

Szczegóły
Tytuł 6569
Rozszerzenie: PDF
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 [email protected] a my odpowiemy na skargę i usuniemy zabroniony dokument w ciągu 24 godzin.

6569 PDF - Pobierz:

Pobierz PDF

 

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.

6569 - podejrzyj 20 pierwszych stron:

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 () // �