C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści •...

59

Transcript of C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści •...

Page 1: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •
Page 2: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

Idź do

• Spis treści• Przykładowy rozdział

• Katalog online

• Dodaj do koszyka

• Zamów cennik

• Zamów informacjeo nowościach

• Fragmenty książekonline

Helion SAul. Kościuszki 1c44-100 Gliwicetel. 32 230 98 63e-mail: [email protected]© Helion 1991–2010

Katalog książek

Twój koszyk

Cennik i informacje

Czytelnia

Kontakt

• Zamów drukowanykatalog

C++ dla każdego.Wydanie II

Autorzy: Jesse Liberty, Siddhartha Rao, Bradley L. Jones

Tłumaczenie: Robert Górczyński

ISBN: 978-83-246-2782-0

Tytuł oryginału: Sams Teach Yourself C++

in One Hour a Day (6th Edition)

Format: B5, stron: 850

Poznaj język C++ w 21 dni!Pomimo swojego wieku, język C++ wciąż utrzymuje wysoką formę. Przez lata zdobył i ugruntował

sobie świetną pozycję na rynku języków programowania. Dzięki temu, nawet dziś w czasach gdzie

króluje język Java oraz platforma .NET, wciąż swoich zwolenników. Ba! Istnieją takie gałęzie

oprogramowania, w których jest on niezastąpiony. Dlatego jeżeli oczekujesz najwyższej

wydajności, operowania blisko sprzętu oraz pełnej kontroli nad sposobem wykonywania

programu powinieneś postawić właśnie na C++.

Dzięki książce, którą trzymasz w ręku będzie to stosunkowo proste zadanie. Poświęcając tylko

godzinę dziennie zdobędziesz wiedzę, która pozwoli Ci spokojnie rozpocząć przygodę z językiem

C++, poznać jego tajniki, zalety oraz wady. Z każdą kolejną godziną będziesz zdobywać coraz to

bardziej zaawansowaną i ciekawą wiedzę. Jaki więc zakres obejmuje niniejszy podręcznik?

Kompletny, którego opanowanie pozwoli Ci na pisanie programów o różnym stopniu złożoności

oraz swobodne poruszanie się w świecie języka C++. Zdobędziesz informacje na temat stałych,

zmiennych, tablic, instrukcji warunkowych oraz pętli. Ponadto dowiesz się, jak wykorzystać

wskaźniki oraz dyrektywy kompilatora. Natomiast lektura ostatnich rozdziałów książki pozwoli Ci

na swobodne poruszanie się w świecie programowania obiektowego, strumieni oraz klas STL.

Obiekty, klasy, dziedziczenie czy polimorfizm – te pojęcia nie skryją przed Tobą już żadnej

tajemnicy! Kolejne wydanie cenionej książki sprawdzi się w rękach każdego adepta języka C++.

Jeżeli chcesz poznać ten język, to nie ma na co czekać. Lepszej okazji nie będzie!

• Historia języka C++

• Konstrukcja programu w języku C++

• Komentowanie kodu

• Zmienne i stałe

• Zastosowanie tablic i ciągów tekstowych

• Formułowanie wyrażeń

• Instrukcje warunkowe i operatory

• Wykorzystanie i tworzenie funkcji

• Zakresy zmiennych

• Sterowanie przebiegiem programu

• Zasada działania wskaźników

• Programowanie obiektowe – klasy, obiekty, dziedziczenie, polimorfizm

• Rzutowanie

• Wykorzystanie strumieni

• Kompilowanie warunkowe, instrukcje kompilatora

Sprawdź czy język C++ spełni Twoje oczekiwania!

Page 3: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

Spis tre�ci

Wst�p 25

Cz��� I PodstawyLekcja 1. Zaczynamy 31

Krótka historia j�zyka C++ ............................................................................................31Interpretery i kompilatory ....................................................................................33Zmiana wymaga�, zmiana platform ..................................................................34Programowanie proceduralne, strukturalne i obiektowe .......................35Programowanie zorientowane obiektowo .....................................................36C++ i programowanie zorientowane obiektowo .............................................37

Jak ewoluowa�o C++ ........................................................................................................38Czy nale�y najpierw pozna C? ...................................................................................39Dodatek Microsoft Managed Extensions for C++ ................................................39Standard ANSI ....................................................................................................................39Przygotowanie do programowania ..........................................................................40Twoje �rodowisko programowania ..........................................................................41Tworzenie programu ......................................................................................................42

Tworzenie pliku obiektowego za pomoc� kompilatora ...........................42Tworzenie pliku wykonywalnego za pomoc� linkera ...............................43

Cykl tworzenia programu .............................................................................................43HELLO.cpp — Twój pierwszy program w C++ ....................................................45Zaczynamy prac� z kompilatorem ............................................................................47

Budowanie projektu Hello World .......................................................................48B��dy kompilacji ................................................................................................................49Podsumowanie ...................................................................................................................50Pytania i odpowiedzi .......................................................................................................50Warsztaty .............................................................................................................................51

Quiz ..................................................................................................................................52wiczenia .......................................................................................................................52

Page 4: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

4 C++ dla ka�dego

Lekcja 2. Anatomia programu C++ 53Prosty program ................................................................................................................. 53Rzut oka na obiekt cout ................................................................................................. 56U�ywanie przestrzeni nazw standardowych ....................................................... 58Komentarze ......................................................................................................................... 61

Rodzaje komentarzy ................................................................................................. 61U�ywanie komentarzy ............................................................................................. 62Jeszcze jedna uwaga na temat komentarzy ................................................... 63

Funkcje .................................................................................................................................. 63Korzystanie z funkcji ................................................................................................ 65Metody kontra funkcje ............................................................................................ 67

Podsumowanie .................................................................................................................. 67Pytania i odpowiedzi ....................................................................................................... 67Warsztaty ............................................................................................................................. 68

Quiz .................................................................................................................................. 68wiczenia ...................................................................................................................... 69

Lekcja 3. Zmienne i sta�e 71Czym jest zmienna? ......................................................................................................... 71

Dane s� przechowywane w pami�ci ................................................................. 71Przydzielanie pami�ci ............................................................................................. 72Rozmiar liczb ca�kowitych .................................................................................... 73Zapis ze znakiem i bez znaku ............................................................................... 74Podstawowe typy zmiennych .............................................................................. 74

Definiowanie zmiennej .................................................................................................. 75Uwzgl�dnianie wielko�ci liter .............................................................................. 77Konwencje nazywania zmiennych ..................................................................... 77S�owa kluczowe .......................................................................................................... 78

Okre�lenie ilo�ci pami�ci u�ywanej przez typ zmiennej ................................ 79Tworzenie kilku zmiennych jednocze�nie ............................................................ 81Przypisywanie zmiennym warto�ci ......................................................................... 81Tworzenie aliasów za pomoc� typedef ................................................................... 83Kiedy u�ywa typu short, a kiedy typu long? ....................................................... 84

Zawini�cie liczby ca�kowitej bez znaku ........................................................... 85Zawini�cie liczby ca�kowitej ze znakiem ........................................................ 86

Page 5: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

Spis tre�ci 5

Znaki .......................................................................................................................................87Znaki i liczby ................................................................................................................88Znaki specjalne ............................................................................................................89

Sta�e ........................................................................................................................................90Litera�y ...........................................................................................................................90Sta�e symboliczne ......................................................................................................91

Sta�e wyliczeniowe ...........................................................................................................92Podsumowanie ...................................................................................................................95Pytania i odpowiedzi .......................................................................................................96Warsztaty .............................................................................................................................97

Quiz ..................................................................................................................................97wiczenia .......................................................................................................................98

Lekcja 4. Tablice i ci�gi tekstowe 99Czym jest tablica? ..............................................................................................................99

Elementy tablicy ...................................................................................................... 100Zapisywanie za ko�cem tablicy ........................................................................ 102B��d s�upka w p�ocie ............................................................................................. 104Inicjalizowanie tablic ............................................................................................ 105Deklarowanie tablic ............................................................................................... 106

Tablice wielowymiarowe ........................................................................................... 107Deklarowanie tablic wielowymiarowych ..................................................... 108Inicjalizowanie tablic wielowymiarowych .................................................. 110

Tablice znaków i ci�gi tekstowe .............................................................................. 113Metody strcpy() oraz strncpy() ............................................................................... 115Klasy ci�gów tekstowych ........................................................................................... 117Podsumowanie ................................................................................................................ 120Pytania i odpowiedzi .................................................................................................... 120Warsztaty .......................................................................................................................... 121

Quiz ............................................................................................................................... 121wiczenia .................................................................................................................... 122

Lekcja 5. Wyra�enia, instrukcje i operatory 123Instrukcje ........................................................................................................................... 123

Bia�e znaki .................................................................................................................. 124Bloki i instrukcje z�o�one .................................................................................... 124

Wyra�enia ......................................................................................................................... 125

Page 6: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

6 C++ dla ka�dego

Operatory ...........................................................................................................................126Operator przypisania .............................................................................................127Operatory matematyczne ....................................................................................127

��czenie operatora przypisania z operatorem matematycznym .............130Inkrementacja i dekrementacja ...............................................................................130

Przedrostki i przyrostki ........................................................................................131Kolejno� dzia�a� ............................................................................................................133Zagnie�d�anie nawiasów ............................................................................................134Prawda i fa�sz ...................................................................................................................135

Operatory relacji ......................................................................................................136Instrukcja if .......................................................................................................................137

Styl wci� .....................................................................................................................141Instrukcja else ...........................................................................................................141Zaawansowane instrukcje if ...............................................................................143

U�ycie nawiasów klamrowych w zagnie�d�onych instrukcjach if ...........146Operatory logiczne .........................................................................................................149

Logiczne I ....................................................................................................................149Logiczne LUB .............................................................................................................150Logiczne NIE ..............................................................................................................150

Skrócone obliczanie wyra�e� logicznych ............................................................150Kolejno� operatorów logicznych ...........................................................................151Kilka s�ów na temat prawdy i fa�szu ......................................................................152Operator warunkowy (trójelementowy) .............................................................152Podsumowanie ................................................................................................................154Pytania i odpowiedzi .....................................................................................................154Warsztaty ...........................................................................................................................155

Quiz ................................................................................................................................155wiczenia ....................................................................................................................156

Lekcja 6. Funkcje 159Czym jest funkcja? ..........................................................................................................159Zwracane warto�ci, parametry i argumenty ......................................................160Deklarowanie i definiowanie funkcji .....................................................................161

Prototypy funkcji .....................................................................................................162Definiowanie funkcji ..............................................................................................164

Wykonywanie funkcji ...................................................................................................166

Page 7: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

Spis tre�ci 7

Zakres zmiennej ............................................................................................................. 166Zmienne lokalne ...................................................................................................... 166Zmienne lokalne zdefiniowane w blokach .................................................. 168

Parametry s� zmiennymi lokalnymi ...................................................................... 170Zmienne globalne .................................................................................................... 172Zmienne globalne: ostrze�enie ......................................................................... 173

Rozwa�ania na temat tworzenia instrukcji funkcji ........................................ 174Kilka s�ów na temat argumentów funkcji ........................................................... 174Kilka s�ów na temat zwracanych warto�ci ......................................................... 175Parametry domy�lne .................................................................................................... 178Przeci��anie funkcji ...................................................................................................... 181Zagadnienia zwi�zane z funkcjami ......................................................................... 185

Funkcje typu inline ................................................................................................. 185Rekurencja ................................................................................................................. 188

Jak dzia�aj� funkcje — rzut oka „pod mask�” .................................................... 193Poziomy abstrakcji ................................................................................................. 193

Podsumowanie ................................................................................................................ 198Pytania i odpowiedzi .................................................................................................... 199Warsztaty .......................................................................................................................... 200

Quiz ............................................................................................................................... 200wiczenia .................................................................................................................... 200

Lekcja 7. Sterowanie przebiegiem dzia�ania programu 203P�tle ..................................................................................................................................... 203

Pocz�tki p�tli: instrukcja goto ........................................................................... 203Dlaczego nie jest zalecane stosowanie instrukcji goto? ......................... 205

P�tle while ......................................................................................................................... 205Bardziej skomplikowane instrukcje while .................................................. 207Instrukcje continue oraz break ......................................................................... 209P�tla while (true) .................................................................................................... 212

Implementacja p�tli do...while ................................................................................. 213U�ywanie p�tli do...while ............................................................................................ 214P�tle for .............................................................................................................................. 216

Zaawansowane p�tle for ...................................................................................... 219Puste p�tle for .......................................................................................................... 222P�tle zagnie�d�one ................................................................................................. 223Zakres zmiennych w p�tlach for ...................................................................... 225

Page 8: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

8 C++ dla ka�dego

Podsumowanie p�tli ......................................................................................................226Sterowanie przebiegiem dzia�ania programu

za pomoc� instrukcji switch ...................................................................................229U�ycie instrukcji switch w menu ......................................................................232

Podsumowanie ................................................................................................................236Pytania i odpowiedzi .....................................................................................................236Warsztaty ...........................................................................................................................237

Quiz ................................................................................................................................238wiczenia ....................................................................................................................238

Lekcja 8. Wska�niki 241Czym jest wska�nik? .....................................................................................................241

Kilka s�ów na temat pami�ci ...............................................................................241U�ycie operatora adresu zmiennej w pami�ci (&) ...................................242Przechowywanie adresu zmiennej we wska�niku ...................................244Nazwy wska�ników ................................................................................................244Pobranie warto�ci ze zmiennej .........................................................................245Dereferencja za pomoc� operatora wy�uskania ........................................246Wska�niki, adresy i zmienne ..............................................................................247Operowanie danymi poprzez wska�niki .......................................................248Sprawdzanie adresu ...............................................................................................250Nazwy wska�ników i tablic .................................................................................252Wska�nik do tablicy kontra tablica wska�ników ......................................254

Do czego s�u�� wska�niki? .........................................................................................255Stos i sterta ........................................................................................................................255

Alokacja pami�ci za pomoc� s�owa kluczowego new .............................257Zwalnianie pami�ci: s�owo kluczowe delete ...............................................258

Inne spojrzenie na wycieki pami�ci .......................................................................260Tworzenie obiektów na stercie ................................................................................261Usuwanie obiektów ze sterty ....................................................................................261Utracone wska�niki .......................................................................................................263Wska�niki const ..............................................................................................................267Podsumowanie ................................................................................................................268Pytania i odpowiedzi .....................................................................................................268Warsztaty ...........................................................................................................................269

Quiz ................................................................................................................................269wiczenia ....................................................................................................................269

Page 9: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

Spis tre�ci 9

Lekcja 9. Referencje 271Czym jest referencja? ................................................................................................... 271U�ycie operatora adresu (&) z referencj� ........................................................... 273

Nie mo�na zmienia przypisania referencji ................................................ 275Zerowe wska�niki i zerowe referencje ................................................................. 276Przekazywanie argumentów funkcji przez referencj� .................................. 277

Tworzenie funkcji swap() otrzymuj�cej wska�niki ................................. 279Implementacja funkcji swap() za pomoc� referencji .............................. 281

Zwracanie kilku warto�ci ........................................................................................... 283Zwracanie warto�ci przez referencj� ............................................................. 285

Przekazywanie przez referencj� zwi�ksza efektywno�dzia�ania programu .................................................................................................... 286

Przekazywanie wska�nika const ...................................................................... 290Referencje jako metoda alternatywna ........................................................... 293

Kiedy u�ywa wska�ników, a kiedy referencji ................................................. 295��czenie referencji i wska�ników ........................................................................... 296Zwracanie referencji do obiektu, którego nie ma w zakresie .................... 298

Problem zwi�zany ze zwracaniem referencji do obiektu na stercie ........ 299Podsumowanie ................................................................................................................ 301Pytania i odpowiedzi .................................................................................................... 301Warsztaty .......................................................................................................................... 302

Quiz ............................................................................................................................... 302wiczenia .................................................................................................................... 302

Cz��� II Podstawy programowaniazorientowanego obiektowo i C++

Lekcja 10. Klasy i obiekty 307Czy C++ jest zorientowane obiektowo? ............................................................... 307Tworzenie nowych typów .......................................................................................... 309Wprowadzenie klas i elementów sk�adowych ................................................. 310

Deklarowanie klasy ................................................................................................ 311Kilka s�ów o konwencji nazw ............................................................................ 311Definiowanie obiektu ............................................................................................ 313Klasy a obiekty ......................................................................................................... 313

Dost�p do elementów sk�adowych klasy ............................................................ 313Przypisywa nale�y obiektom, nie klasom .................................................. 314Czego nie zadeklarujesz, tego klasa nie b�dzie mia�a ............................. 314

Page 10: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

10 C++ dla ka�dego

Dost�p prywatny i publiczny ....................................................................................315Oznaczanie danych sk�adowych jako prywatnych ...................................317

Implementowanie metod klasy ................................................................................321Konstruktory i destruktory ........................................................................................324

Domy�lne konstruktory i destruktory ...........................................................325U�ycie domy�lnego konstruktora ....................................................................326

Funkcje sk�adowe const ..............................................................................................329Gdzie umieszcza deklaracje klasy i definicje metod .....................................331Implementacja inline ....................................................................................................332Klasy, których danymi sk�adowymi s� inne klasy ...........................................335Struktury ............................................................................................................................340Podsumowanie ................................................................................................................340Pytania i odpowiedzi .....................................................................................................341Warsztaty ...........................................................................................................................343

Quiz ................................................................................................................................343wiczenia ....................................................................................................................343

Lekcja 11. Dziedziczenie 345Czym jest dziedziczenie? .............................................................................................345

Dziedziczenie i wyprowadzanie ........................................................................346Królestwo zwierz�t .................................................................................................347Sk�adnia wyprowadzania .....................................................................................348

Prywatne kontra chronione .......................................................................................350Dziedziczenie oraz konstruktory i destruktory ................................................353

Przekazywanie argumentów do konstruktorów bazowych .................355Przes�anianie funkcji klasy bazowej ......................................................................360

Ukrywanie metod klasy bazowej ......................................................................363Wywo�ywanie metod klasy bazowej ..............................................................365

Metody wirtualne ...........................................................................................................367Jak dzia�aj� funkcje wirtualne ............................................................................372Próba uzyskania dost�pu do metod klasy bazowej ..................................373Okrajanie .....................................................................................................................374Tworzenie destruktorów wirtualnych ...........................................................377Wirtualne konstruktory kopiuj�ce ..................................................................377Koszt metod wirtualnych .....................................................................................381

Dziedziczenie prywatne ..............................................................................................381U�ywanie dziedziczenia prywatnego .............................................................382Dziedziczenie prywatne kontra agregacja (z�o�enie) .............................384

Page 11: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

Spis tre�ci 11

Podsumowanie ................................................................................................................ 385Pytania i odpowiedzi .................................................................................................... 386Warsztaty .......................................................................................................................... 387

Quiz ............................................................................................................................... 387wiczenia .................................................................................................................... 388

Lekcja 12. Polimorfizm 389Problemy z pojedynczym dziedziczeniem .......................................................... 389

Przenoszenie w gór� .............................................................................................. 392Rzutowanie w dó� ................................................................................................... 393Po��czenie dwóch list ............................................................................................ 396

Dziedziczenie wielokrotne ......................................................................................... 397Cz��ci obiektu z dziedziczeniem wielokrotnym ....................................... 401Konstruktory w obiektach dziedziczonych wielokrotnie ..................... 402Eliminowanie niejednoznaczno�ci .................................................................. 405Dziedziczenie ze wspólnej klasy bazowej .................................................... 406Dziedziczenie wirtualne ....................................................................................... 410Problemy z dziedziczeniem wielokrotnym ................................................. 415Mixiny i klasy metod .............................................................................................. 415

Abstrakcyjne typy danych .......................................................................................... 416Czyste funkcje wirtualne ..................................................................................... 420Implementowanie czystych funkcji wirtualnych ...................................... 422Z�o�one hierarchie abstrakcji ............................................................................ 426Które typy s� abstrakcyjne? ............................................................................... 430

Podsumowanie ................................................................................................................ 430Pytania i odpowiedzi .................................................................................................... 431Warsztaty .......................................................................................................................... 432

Quiz ............................................................................................................................... 432wiczenia .................................................................................................................... 433

Lekcja 13. Typy operatorów i przeci��anie operatorów 435Czym s� operatory w C++? ......................................................................................... 435Operatory jednoargumentowe ................................................................................ 436

Typy operatorów jednoargumentowych ..................................................... 437Programowanie jednoargumentowego operatora inkrementacji

i dekrementacji ...................................................................................................... 437

Page 12: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

12 C++ dla ka�dego

Programowanie operatora dereferencji *i operatora wyboru elementu sk�adowego -> ...............................................441

Programowanie operatorów konwersji ........................................................444Operatory dwuargumentowe ...................................................................................446

Typy operatorów dwuargumentowych .........................................................446Programowanie operatorów dodawania (a+b) i odejmowania (a-b) .......447Programowanie operatorów dodawania/przypisania

i odejmowania/przypisania .............................................................................450Przeci��anie operatorów porównywania ....................................................452Przeci��anie operatorów <, >, <= i >= ............................................................456Operatory indeksowania ......................................................................................459

Funkcja operator() .........................................................................................................462Operatory, których nie mo�na ponownie zdefiniowa ..................................463Podsumowanie ................................................................................................................464Pytania i odpowiedzi .....................................................................................................464Warsztaty ...........................................................................................................................465

Quiz ................................................................................................................................465wiczenia ....................................................................................................................465

Lekcja 14. Operatory rzutowania 467Co to jest rzutowanie? ..................................................................................................467Kiedy zachodzi potrzeba rzutowania? ..................................................................467Dlaczego rzutowanie w stylu C nie jest popularne

w�ród niektórych programistów C++? ..............................................................468Operatory rzutowania C++ .........................................................................................469

U�ycie static_cast .....................................................................................................470U�ycie dynamic_cast i identyfikacja typu w czasie dzia�ania ...............471U�ycie reinterpret_cast .........................................................................................474U�ycie const_cast .....................................................................................................475

Problemy z operatorami rzutowania C++ ..............................................................476Podsumowanie ................................................................................................................477Pytania i odpowiedzi .....................................................................................................477Warsztaty ...........................................................................................................................478

Quiz ................................................................................................................................478

Lekcja 15. Wprowadzenie do makr i wzorców 481Preprocesor i kompilator ............................................................................................481Dyrektywa #define preprocesora ...........................................................................482

Page 13: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

Spis tre�ci 13

Funkcje makro ................................................................................................................. 482Po co te wszystkie nawiasy? .............................................................................. 484W jaki sposób makra i s�abe bezpiecze�stwo typów

id� r�ka w r�k�? .................................................................................................... 485Makra a funkcje i wzorce ..................................................................................... 486Funkcje inline ........................................................................................................... 486

Wprowadzenie do wzorców ..................................................................................... 488Sk�adnia deklaracji wzorca ................................................................................. 489Ró�ne rodzaje deklaracji wzorca ..................................................................... 490Klasy wzorca ............................................................................................................. 490Ustanawianie i specjalizacja wzorca .............................................................. 491Wzorce i bezpiecze�stwo typów ...................................................................... 492Deklarowanie wzorców z wieloma parametrami .................................... 492Deklarowanie wzorców z parametrami domy�lnymi ............................ 493Przyk�ad wzorca ...................................................................................................... 493U�ycie wzorców w praktycznym programowaniu C++ ......................... 495

Podsumowanie ................................................................................................................ 496Pytania i odpowiedzi .................................................................................................... 496Warsztaty .......................................................................................................................... 498

Quiz ............................................................................................................................... 498wiczenia .................................................................................................................... 498

Cz��� III Poznajemy standardow� bibliotek�wzorców (STL)

Lekcja 16. Wprowadzenie do standardowej biblioteki wzorców 501Kontenery STL ................................................................................................................. 501

Kontenery sekwencyjne ....................................................................................... 501Kontenery asocjacyjne .......................................................................................... 502Wybór odpowiedniego kontenera ................................................................... 503

Iteratory STL .................................................................................................................... 503Algorytmy STL ................................................................................................................. 506Oddzia�ywania mi�dzy kontenerami i algorytmami

za pomoc� iteratorów ............................................................................................... 507Podsumowanie ................................................................................................................ 509Pytania i odpowiedzi .................................................................................................... 510Warsztaty .......................................................................................................................... 510

Quiz ............................................................................................................................... 511

Page 14: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

14 C++ dla ka�dego

Lekcja 17. Klasa string w STL 513Potrzeba powstania klasy s�u��cej do manipulowania ci�gami

tekstowymi .....................................................................................................................513Praca z klas� STL string ...............................................................................................515

Ustanawianie obiektu STL string i tworzenie kopii .................................515Uzyskanie dost�pu do obiektu string i jego zawarto�ci .........................518��czenie ci�gów tekstowych ..............................................................................520Wyszukiwanie znaku b�d� podci�gu tekstowego w obiekcie string .....521Skracanie obiektu STL string ..............................................................................523Odwracanie zawarto�ci ci�gu tekstowego ...................................................525Konwersja wielko�ci znaków obiektu string .................................................526

Bazuj�ca na wzorcach implementacja klasy STL string ................................528Podsumowanie ................................................................................................................528Pytania i odpowiedzi .....................................................................................................529Warsztaty ...........................................................................................................................529

Quiz ................................................................................................................................529wiczenia ....................................................................................................................530

Lekcja 18. Dynamiczne klasy tablic w STL 531Charakterystyka klasy std::vector ..........................................................................531Typowe operacje klasy vector ..................................................................................532

Ustanawianie klasy vector ...................................................................................532Wstawianie elementów do obiektu vector ..................................................533Uzyskanie dost�pu do elementów obiektu vector ....................................538Usuwanie elementów z obiektu vector ..........................................................541

Zrozumienie funkcji size() i capacity() .................................................................542Klasa STL deque ..............................................................................................................545Podsumowanie ................................................................................................................547Pytania i odpowiedzi .....................................................................................................547Warsztaty ...........................................................................................................................548

Quiz ................................................................................................................................549wiczenia ....................................................................................................................549

Lekcja 19. Klasa STL list 551Charakterystyka klasy std::list .................................................................................551Podstawowe operacje klasy list ...............................................................................552

Ustanawianie obiektu std::list ...........................................................................552Wstawianie elementów na pocz�tku obiektu list .....................................552

Page 15: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

Spis tre�ci 15

Wstawianie elementów na ko�cu obiektu list ........................................... 554Wstawianie elementów w �rodku obiektu list .......................................... 555Usuwanie elementów w obiekcie list ............................................................. 558

Odwrócenie i sortowanie elementów w obiekcie list .................................... 560Odwracanie elementów ....................................................................................... 561Sortowanie elementów ........................................................................................ 562

Podsumowanie ................................................................................................................ 573Pytania i odpowiedzi .................................................................................................... 573Warsztaty .......................................................................................................................... 574

Quiz ............................................................................................................................... 574wiczenia .................................................................................................................... 574

Lekcja 20. Klasy STL set i multiset 575Wprowadzenie ................................................................................................................ 575Podstawowe operacje klas STL set i multiset ................................................... 576

Ustanawianie obiektu std::set ........................................................................... 576Wstawianie elementów do obiektu set lub multiset ............................... 577Wyszukiwanie elementów w obiekcie STL set lub multiset ................ 579Usuwanie elementów z obiektu STL set lub multiset ............................. 581

Wady i zalety u�ywania obiektów STL set i multiset ..................................... 592Podsumowanie ................................................................................................................ 592Pytania i odpowiedzi .................................................................................................... 592Warsztaty .......................................................................................................................... 593

Quiz ............................................................................................................................... 593wiczenia .................................................................................................................... 594

Lekcja 21. Klasy STL map i multimap 595Krótkie wprowadzenie ................................................................................................ 595Podstawowe operacje klas STL map i multimap ............................................. 596

Ustanawianie obiektu std::map ........................................................................ 596Wstawianie elementów do obiektu STL map lub multimap ................ 597Wyszukiwanie elementów w obiekcie STL map lub multimap .......... 600Usuwanie elementów z obiektu STL map lub multimap ....................... 602

Dostarczanie w�asnego predykatu sortowania ................................................ 606Podsumowanie ................................................................................................................ 610Pytania i odpowiedzi .................................................................................................... 610Warsztaty .......................................................................................................................... 611

Quiz ............................................................................................................................... 612wiczenia .................................................................................................................... 612

Page 16: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

16 C++ dla ka�dego

Cz��� IV Jeszcze wi�cej STLLekcja 22. Zrozumienie obiektów funkcji 615

Koncepcja obiektów funkcji i predykatów .............................................................615Typowe aplikacje obiektów funkcji ........................................................................616

Funkcje jednoargumentowe ...............................................................................616Predykat jednoargumentowy ............................................................................621Funkcje dwuargumentowe .................................................................................623Predykat dwuargumentowy ...............................................................................626

Podsumowanie ................................................................................................................629Pytania i odpowiedzi .....................................................................................................629Warsztaty ...........................................................................................................................630

Quiz ................................................................................................................................630wiczenia ....................................................................................................................630

Lekcja 23. Algorytmy STL 631Co to s� algorytmy STL? ...............................................................................................631Klasyfikacja algorytmów STL ....................................................................................631

Algorytmy niezmienne ..........................................................................................632Algorytmy zmienne ................................................................................................633

U�ywanie algorytmów STL ........................................................................................636Zliczanie i znajdowanie elementów ................................................................636Wyszukiwanie elementu lub zakresu w kolekcji .......................................639Inicjalizacja elementów w kontenerze wraz

z okre�lonymi warto�ciami ..............................................................................642Przetwarzanie elementów w zakresie za pomoc� for_each .................645Przeprowadzanie transformacji zakresu

za pomoc� std::transform .................................................................................647Operacje kopiowania i usuwania ......................................................................650Zast�powanie warto�ci oraz zast�powanie elementu

na podstawie danego warunku ......................................................................654Sortowanie i przeszukiwanie posortowanej kolekcji oraz

usuwanie duplikatów ..........................................................................................656Partycjonowanie zakresu .....................................................................................659Wstawianie elementów do posortowanej kolekcji ...................................661

Podsumowanie ................................................................................................................664Pytania i odpowiedzi .....................................................................................................664

Page 17: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

Spis tre�ci 17

Warsztaty .......................................................................................................................... 665Quiz ............................................................................................................................... 665wiczenia .................................................................................................................... 666

Lekcja 24. Kontenery adaptacyjne: stack i queue 667Cechy charakterystyczne zachowania stosów i kolejek ............................... 667

Stosy .............................................................................................................................. 667Kolejki .......................................................................................................................... 668

U�ywanie klasy STL stack .......................................................................................... 668Ustanawianie obiektu stack ............................................................................... 669Funkcje sk�adowe klasy stack ........................................................................... 670

U�ywanie klasy STL queue ........................................................................................ 672Ustanawianie obiektu queue ............................................................................. 673Funkcje sk�adowe klasy queue ......................................................................... 674

U�ywanie klasy STL priority_queue ...................................................................... 676Ustanawianie obiektu priority_queue ........................................................... 677Funkcje sk�adowe klasy priority_queue ....................................................... 678

Podsumowanie ................................................................................................................ 682Pytania i odpowiedzi .................................................................................................... 682Warsztaty .......................................................................................................................... 682

Quiz ............................................................................................................................... 682wiczenia .................................................................................................................... 683

Lekcja 25. Praca z opcjami bitowymi za pomoc� STL 685Klasa bitset ........................................................................................................................ 685

Ustanowienie klasy std::bitset .......................................................................... 685U�ywanie klasy std::bitset i jej elementów sk�adowych .............................. 687

Operatory std::bitset ............................................................................................. 687Metody sk�adowe klasy std::bitset .................................................................. 687

Klasa vector<bool> ........................................................................................................ 691Ustanowienie klasy vector<bool> ................................................................... 691U�ywanie klasy vector<bool> ........................................................................... 692

Podsumowanie ................................................................................................................ 693Pytania i odpowiedzi .................................................................................................... 694Warsztaty .......................................................................................................................... 694

Quiz ............................................................................................................................... 695wiczenia .................................................................................................................... 695

Page 18: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

18 C++ dla ka�dego

Cz��� V Zaawansowane koncepcje C++Lekcja 26. Sprytne wska�niki 699

Czym s� sprytne wska�niki? ......................................................................................699Na czym polega problem zwi�zany z u�ywaniem

wska�ników konwencjonalnych? ..................................................................700W jaki sposób sprytne wska�niki mog� pomóc? .......................................701

W jaki sposób s� implementowane sprytne wska�niki? ..............................701Typy sprytnych wska�ników ....................................................................................703

Kopiowanie g��bokie .............................................................................................704Mechanizm kopiowania przy zapisie (COW) ..............................................706Sprytne wska�niki zliczania odniesie� ..........................................................706Sprytne wska�niki powi�zane z licznikiem odniesie� ............................707Kopiowanie destrukcyjne ....................................................................................708

U�ywanie klasy std::auto_ptr ....................................................................................710Popularne biblioteki sprytnych wska�ników ....................................................712Podsumowanie ................................................................................................................713Pytania i odpowiedzi .....................................................................................................713Warsztaty ...........................................................................................................................714

Quiz ................................................................................................................................714wiczenia ....................................................................................................................715

Lekcja 27. Strumienie 717Przegl�d strumieni .........................................................................................................717

Hermetyzacja przep�ywu danych .....................................................................718Buforowanie ..............................................................................................................719

Strumienie i bufory ........................................................................................................721Standardowe obiekty wej�cia-wyj�cia ..................................................................722Przekierowywanie standardowych strumieni ..................................................722Wej�cie z u�yciem cin ...................................................................................................723

Wej�ciowe ci�gi tekstowe ....................................................................................725Problemy z ci�gami tekstowymi .......................................................................725Warto� zwracana przez cin ...............................................................................728

Inne funkcje sk�adowe w dyspozycji cin ..............................................................729Wprowadzanie pojedynczych znaków ..........................................................729Odczytywanie ci�gów tekstowych z wej�cia standardowego .............732U�ycie cin.ignore() ..................................................................................................735Funkcje peek() oraz putback() ..........................................................................737

Page 19: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

Spis tre�ci 19

Wyj�cie poprzez cout ................................................................................................... 738Zrzucanie zawarto�ci bufora ............................................................................. 739Funkcje obs�uguj�ce wyj�cie .............................................................................. 739Manipulatory, znaczniki oraz instrukcje formatowania ........................ 741

Strumienie kontra funkcja printf() ........................................................................ 747Wej�cie i wyj�cie z u�yciem plików ....................................................................... 751

ofstream ...................................................................................................................... 751Stany strumieni ........................................................................................................ 751Otwieranie plików dla wej�cia i wyj�cia ....................................................... 751Zmiana domy�lnego zachowania obiektu ofstream

w trakcie otwierania pliku ............................................................................... 753Pliki binarne a pliki tekstowe ................................................................................... 756Przetwarzanie linii polecenia ................................................................................... 759Podsumowanie ................................................................................................................ 763Pytania i odpowiedzi .................................................................................................... 763Warsztaty .......................................................................................................................... 764

Quiz ............................................................................................................................... 765wiczenia .................................................................................................................... 765

Lekcja 28. Obs�uga wyj�tków 767Pluskwy, b��dy, pomy�ki i „psuj�cy si�” kod ...................................................... 767

Sytuacje wyj�tkowe ............................................................................................... 768Wyj�tki ................................................................................................................................ 770

Jak u�ywane s� wyj�tki ........................................................................................ 771Zg�aszanie w�asnych wyj�tków ........................................................................ 775Tworzenie klasy wyj�tku ..................................................................................... 777

Umiejscowienie bloków try oraz bloków catch ................................................ 781Sposób dzia�ania przechwytywania wyj�tków ................................................ 781

Wychwytywanie wi�cej ni� jednego rodzaju wyj�tków ........................ 782Hierarchie wyj�tków ............................................................................................. 785

Dane w wyj�tkach oraz nazwane obiekty wyj�tków ..................................... 789Wyj�tki i wzorce ............................................................................................................. 796Wyj�tki bez b��dów ...................................................................................................... 799B��dy i usuwanie b��dów ........................................................................................... 800

Punkty wstrzymania .............................................................................................. 801�ledzenie warto�ci zmiennych .......................................................................... 801Sprawdzanie pami�ci ............................................................................................ 802Asembler ..................................................................................................................... 802

Page 20: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

20 C++ dla ka�dego

Podsumowanie ................................................................................................................802Pytania i odpowiedzi .....................................................................................................803Warsztaty ...........................................................................................................................804

Quiz ................................................................................................................................804wiczenia ....................................................................................................................805

Lekcja 29. Wi�cej informacji na temat preprocesora 807Preprocesor i kompilator ............................................................................................807U�ycie dyrektywy #define ..........................................................................................808

U�ycie #define dla sta�ych ...................................................................................808U�ycie #define do testowania ............................................................................809Dyrektywa #else preprocesora .........................................................................810

Do��czanie i wartowniki do��czania ......................................................................811Manipulacje ci�gami tekstowymi ............................................................................813

Zamiana na ci�g tekstowy ....................................................................................813Konkatenacja .............................................................................................................813

Makra predefiniowane .................................................................................................814Makro assert() .................................................................................................................814

Debuggowanie za pomoc� makra assert() ...................................................816Makro assert() a wyj�tki ......................................................................................817Efekty uboczne .........................................................................................................817Niezmienniki klas ....................................................................................................818Wy�wietlanie warto�ci tymczasowych ..........................................................824

Operacje na bitach ..........................................................................................................825Operator AND ............................................................................................................826Operator OR ...............................................................................................................826Operator wy��czaj�cy OR .....................................................................................827Operator negacji .......................................................................................................827Ustawianie bitów .....................................................................................................827Zerowanie bitów ......................................................................................................828Zmiana stanu bitów na przeciwny ...................................................................828Pola bitowe .................................................................................................................829

Styl programowania ......................................................................................................832Wci�cia .........................................................................................................................833Nawiasy klamrowe .................................................................................................833D�ugo� linii oraz d�ugo� funkcji ....................................................................833Instrukcje switch .....................................................................................................834

Page 21: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

Spis tre�ci 21

Tekst programu ....................................................................................................... 834Nazwy identyfikatorów ........................................................................................ 835Pisownia nazw i zastosowanie w nich wielkich liter .............................. 836Komentarze ............................................................................................................... 836Konfiguracja dost�pu ............................................................................................ 837Definicje klas ............................................................................................................. 838Do��czanie plików .................................................................................................. 838U�ywanie makra assert() .................................................................................... 838U�ywanie modyfikatora const .......................................................................... 838

Nast�pne kroki w programowaniu C++ ............................................................... 839Gdzie uzyska pomoc i porad� .......................................................................... 839Tematy powi�zane z C++: rozszerzenie Managed C++, C#

oraz platforma .NET firmy Microsoft .......................................................... 840Podsumowanie ................................................................................................................ 841Pytania i odpowiedzi .................................................................................................... 841Warsztaty .......................................................................................................................... 843

Quiz ............................................................................................................................... 843wiczenia .................................................................................................................... 843

DodatkiDodatek A Praca z liczbami: dwójkowo i szesnastkowo 847

Inne podstawy ................................................................................................................. 848Konwersja na inn� podstaw� ................................................................................... 849

Dwójkowo .................................................................................................................. 851Dlaczego podstawa 2? ........................................................................................... 852Bity, bajty, nible ....................................................................................................... 852Co to jest KB? ............................................................................................................ 853Liczby dwójkowe ..................................................................................................... 853

Szesnastkowo .................................................................................................................. 853

Dodatek B S�owa kluczowe C++ 859

Dodatek C Kolejno�� operatorów 861

Dodatek D Odpowiedzi 863

Skorowidz 919

Page 22: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

Czy C++ jest zorientowane obiektowo? 307

Lekcja 10Klasy i obiekty

Klasy rozszerzaj� wbudowane w C++ mo�liwo�ci, u�atwiaj�ce rozwi�zywaniez�o�onych, „rzeczywistych” problemów.

Z tej lekcji dowiesz si�:

� czym s� klasy i obiekty,

� jak definiowa� now� klas� oraz tworzy� obiekty tej klasy,

� czym s� funkcje i dane sk�adowe,

� czym s� konstruktory i jak z nich korzysta�.

Czy C++ jest zorientowane obiektowo?W pewnym momencie j�zyk C, czyli poprzednik C++, by� najpopularniejszymj�zykiem programowania na �wiecie u�ywanym do tworzenia oprogramowaniakomercyjnego. By� wykorzystywany do tworzenia systemów operacyjnych(na przyk�ad systemu Unix), do tworzenia oprogramowania dzia�aj�cego w czasierzeczywistym (kontrola maszyn, urz�dze� i elektroniki). Dopiero pó�niej zacz��by stosowany jako j�zyk programowania s�u��cy do budowy innych j�zykówkonwencjonalnych. Opracowanie j�zyka C pozwoli�o na znalezienie �atwiejszegoi bezpieczniejszego sposobu zbli�enia oprogramowania i osprz�tu.

J�zyk C jest etapem po�rednim pomi�dzy wysokopoziomowymi j�zykami aplikacji„firmowych”, takimi jak COBOL, a niskopoziomowym, wysokowydajnym, lecztrudnym do u�ycia asemblerem. C wymusza programowanie „strukturalne”,w którym poszczególne zagadnienia s� dzielone na mniejsze jednostki powtarzalnychdzia�a�, zwanych funkcjami, natomiast dane s� umieszczane w pakietachnazywanych strukturami.

Page 23: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

308 Lekcja 10. Klasy i obiekty

Jednak j�zyki takie jak Smalltalk i CLU zacz��y torowa drog� w nowym kierunku— programowania zorientowanego obiektowo. Ten rodzaj programowaniapozwala na umieszczanie w pojedynczej jednostce — obiekcie — podzespo�ówdanych takich jak struktura oraz funkcja.

�wiat jest wype�niony przedmiotami: samochodami, psami, drzewami, chmurami,kwiatami. Rzeczy. Ka�da rzecz ma charakterystyk� (szybki, przyjazny, br�zowy,puszysty, �adny). Wi�kszo� rzeczy cechuje jakie� zachowanie (ruch, szczekanie,wzrost, deszcz, uwi�d). Nie my�limy o danych samochodu i o tym, jak mogliby�mynimi manipulowa — my�limy o samochodzie jako o rzeczy: do czego jest podobnyi co robi. Z tym samym mo�emy si� zetkn� po przeniesieniu do �wiata komputerówdowolnego „rzeczywistego” obiektu.

Programy, które piszemy na pocz�tku dwudziestego pierwszego wieku, s� du�obardziej z�o�one ni� te, które by�y pisane pod koniec wieku dwudziestego. Programystworzone w j�zykach proceduralnych s� trudne w zarz�dzaniu i konserwacji,a ich rozbudowa jest niemo�liwa. Graficzne interfejsy u�ytkownika, Internet,telefonia cyfrowa i bezprzewodowa oraz wiele innych technologii, znaczniezwi�kszy�y poziom skomplikowania nowych projektów, a wymaganiakonsumentów dotycz�ce jako�ci interfejsu u�ytkownika wzros�y.

Programowanie zorientowane obiektowo oferuje narz�dzie pomagaj�cew sprostaniu wyzwaniom stoj�cym przed twórcami oprogramowania. Chocia�nie istnieje z�oty �rodek dla tworzenia skomplikowanego oprogramowania,j�zyki zorientowane obiektowo stworzy�y silne wi�zy pomi�dzy strukturamidanych a metodami manipulowania tymi danymi. Ponadto jeszcze bardziej zbli�aj�si� do sposobu my�lenia ludzi (programistów i klientów), usprawniaj�c tymsamym komunikacj� oraz poprawiaj�c jako� tworzonego oprogramowania.A co najwa�niejsze, w programowaniu zorientowanym obiektowo nie musiszju� my�le o strukturach danych i manipuluj�cych nimi funkcjach; my�liszo obiektach w taki sposób, jakby by�y odpowiednikami obiektów w rzeczywisto�ci:czyli jak one wygl�daj� i jak dzia�aj�.

J�zyk C++ stanowi pomost pomi�dzy programowaniem zorientowanym obiektowoa j�zykiem C. Celem jego autorów by�o stworzenie obiektowo zorientowanegoj�zyka dla tej szybkiej i efektywnej platformy s�u��cej do tworzenia oprogramowaniakomercyjnego, ze szczególnym naciskiem na wysok� wydajno�. W dalszej cz��cilekcji przekonasz si�, jak C++ osi�ga cele postawione przed j�zykiem.

Page 24: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

Tworzenie nowych typów 309

Tworzenie nowych typówProgramy s� zwykle pisane w celu rozwi�zania jakiego� realnego problemu,takiego jak prowadzenie rejestru pracowników czy symulacja dzia�ania systemugrzewczego. Cho istnieje mo�liwo� rozwi�zywania tych problemów za pomoc�programów napisanych wy��cznie przy u�yciu liczb ca�kowitych i znaków, jednakw przypadku wi�kszych, bardziej rozbudowanych problemów, du�o �atwiej jeststworzy reprezentacje obiektów, o których si� mówi. Innymi s�owy, symulowaniedzia�ania systemu grzewczego b�dzie �atwiejsze, gdy stworzymy zmiennereprezentuj�ce pomieszczenia, czujniki ciep�a, termostaty i bojlery. Im bardziejte zmienne odpowiadaj� rzeczywisto�ci, tym �atwiejsze jest napisanie programu.

Pozna�e� ju� kilka typów zmiennych, m.in. liczby ca�kowite i znaki. Typ zmiennejdostarcza nam kilka informacji o niej. Na przyk�ad, je�li zadeklarujesz zmienneHeight (wysoko�) i Width (szeroko�) jako liczby ca�kowite typu unsignedshort int, wiesz, �e w ka�dej z nich mo�esz przechowa warto� z przedzia�u od0 do 65 535 (przy za�o�eniu �e typ unsigned short int zajmuje dwa bajty pami�ci).S� to liczby ca�kowite bez znaku; próba przechowania w nich czegokolwiekinnego powoduje b��d. W zmiennej typu unsigned short nie mo�esz umie�ciswojego imienia, nie powiniene� nawet próbowa.

Deklaruj�c te zmienne jako unsigned short int, wiesz, �e mo�esz doda dosiebie wysoko� i szeroko� oraz przypisa t� warto� innej zmiennej.

Typ zmiennych informuje:

� o ich rozmiarze w pami�ci,

� jaki rodzaj informacji mog� zawiera,

� jakie dzia�ania mo�na na nich wykonywa.

W tradycyjnych j�zykach, takich jak C, typy by�y wbudowane w j�zyk. W C++programista mo�e rozszerzy j�zyk, tworz�c potrzebne mu typy, za� ka�dy z tychnowych typów mo�e by w pe�ni funkcjonalny i dysponowa t� sam� si��, co typywbudowane.

Wady tworzenia typów za pomoc� s�owa kluczowego struct

Pewne mo�liwo�ci rozszerzenia j�zyka C nowymi typami wi��� si� z ��czeniemw struktury (struct) powi�zanych ze sob� zmiennych, które mog� by� dost�pnew postaci nowego typu danych za pomoc� instrukcji typedef. Jednak istniej�pewne wady takiego podej�cia:

Page 25: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

310 Lekcja 10. Klasy i obiekty

� Struktury i operuj�ce na nich funkcje nie s� spójnymi ca�o�ciami. Funkcjemo�na znale�� jedynie poprzez odczyt plików nag�ówkowych z dost�pnychbibliotek i wyszukanie tych z nowym typem jako parametrem.

� Koordynacja aktywno�ci grupy powi�zanych funkcji w strukturze jest trudniejszymzadaniem, poniewa� dowolny fragment logiki programu mo�e w dowolnejchwili zmieni� cokolwiek w strukturze. Z tego powodu nie ma mo�liwo�ciochrony struktury przed ingerencj�.

� Wbudowane operatory nie dzia�aj� ze strukturami — nie dzia�a nawetdodanie dwóch struktur za pomoc� znaku plus (+), cho� taka operacjamog�aby si� wydawa� najbardziej naturalnym sposobem przedstawieniarozwi�zania problemu (na przyk�ad, kiedy ka�da struktura przedstawiaskomplikowane fragmenty tekstu, które maj� by� ze sob� po��czone).

Wprowadzenie klasi elementów sk�adowychNowy typ zmiennych tworzy si�, deklaruj�c klas�. Klasa jest w�a�ciwie grup�zmiennych — cz�sto o ró�nych typach — skojarzonych z zestawem odnosz�cychsi� do nich funkcji.

Jedn� z mo�liwo�ci my�lenia o samochodzie jest potraktowanie go jako zbiorukó�, drzwi, foteli, okien itd. Inna mo�liwo� to wyobra�enie sobie, co samochódmo�e zrobi: je�dzi, przyspiesza, zwalnia, zatrzymywa si�, parkowa itd.Klasa umo�liwia hermetyzacj�, czyli upakowanie, tych ró�nych cz��ci orazró�nych dzia�a� w jeden zbiór, który jest nazywany obiektem.

Upakowanie wszystkiego, co wiesz o samochodzie, w jedn� klas� przynosiprogrami�cie liczne korzy�ci. Wszystko jest na miejscu, u�atwia to odwo�ywanie si�,kopiowanie i manipulowanie danymi. Klienci Twojej klasy — tj. te cz��ci programu,które z niej korzystaj� — mog� u�ywa Twojego obiektu bez zastanawiania si�,co znajduje si� w �rodku i jak on dzia�a.

Klasa mo�e sk�ada si� z dowolnej kombinacji zmiennych prostych oraz zmiennychinnych klas. Zmienna wewn�trz klasy jest nazywana zmienn��sk�adow� lubdan��sk�adow�. Klasa Car (samochód) mo�e posiada sk�adowe reprezentuj�cesiedzenia, typ radia, opony itd. Zmienne sk�adowe s� zmiennymi w danej klasie.Stanowi� one cz�� klasy, tak jak ko�a i silnik stanowi� cz�� samochodu.

Page 26: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

Wprowadzenie klas i elementów sk�adowych 311

Klasa mo�e zawiera równie� funkcje, które s� wówczas nazywane funkcjamisk�adowymi lub metodami. Podobnie jak zmienne sk�adowe, stanowi� cz��klasy i okre�laj�, co dana klasa mo�e zrobi.

Funkcje w danej klasie zwykle manipuluj� zmiennymi sk�adowymi. Przyk�adowo,metodami klasy Car mog� by Start() (uruchom) oraz Brake() (hamuj). Klasa Cat(kot) mo�e posiada zmienne sk�adowe, reprezentuj�ce wiek i wag�; jej metodamimog� by Sleep() (�pij), Meow() (miaucz) czy ChaseMice() (�ap myszy).

Deklarowanie klasyDeklaracja klasy informuje kompilator o jej istnieniu. Aby zadeklarowa klas�,u�yj s�owa kluczowego class, po którym nast�puje otwieraj�cy nawias klamrowy,a nast�pnie lista danych sk�adowych i metod tej klasy. Deklaracja ko�czy si�zamykaj�cym nawiasem klamrowym i �rednikiem. Oto deklaracja klasy o nazwieCat (kot):

class Cat{ unsigned int itsAge; unsigned int itsWeight; void Meow();};

Zadeklarowanie takiej klasy nie powoduje zaalokowania pami�ci dla obiektu Cat.Informuje jedynie kompilator, czym jest typ Cat, jakie dane zawiera (itsAge— jego wiek oraz itsWeight — jego waga) oraz co mo�e robi (Meow() — miaucz).Informuje tak�e kompilator, jak du�a jest zmienna typu Cat — to jest, jak du�omiejsca w pami�ci ma przygotowa w przypadku tworzenia zmiennej typu Cat.W tym przyk�adzie, o ile typ int ma cztery bajty, zmienna typu Cat zajmuje osiembajtów: cztery bajty dla zmiennej itsAge i cztery dla zmiennej itsWeight.Funkcja Meow() nie zajmuje miejsca, gdy� dla funkcji sk�adowych (metod)miejsce nie jest rezerwowane. Jest to wska�nik do funkcji, który na platformie32-bitowej mo�e zaj� cztery bajty.

Kilka s�ów o konwencji nazwJako programista, musisz nazwa wszystkie swoje zmienne sk�adowe, funkcjesk�adowe oraz klasy. Jak przeczyta�e� w lekcji 3., „Sta�e i zmienne”, nazwy tepowinny by zrozumia�e i znacz�ce. Dobrymi nazwami klas mog� by wspomniana

Page 27: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

312 Lekcja 10. Klasy i obiekty

Cat, Rectangle (prostok�t) czy Employee (pracownik). Meow(), ChaseMice()czy StopEngine() (zatrzymaj silnik) równie� s� dobrymi nazwami funkcji, gdy�informuj�, co robi� te funkcje. Wielu programistów nadaje nazwom zmiennychsk�adowych przedrostek „its” (jego), tak jak w zmiennych itsAge, itsWeightczy itsSpeed (jego szybko�). Pomaga to w odró�nieniu zmiennych sk�adowychod innych zmiennych.

Niektórzy programi�ci wol� przedrostek „my” (mój), tak jak w nazwach myAge,myWeight czy mySpeed. Jeszcze inni u�ywaj� po prostu litery m (od s�owa member— sk�adowa), czasem wraz ze znakiem podkre�lenia (_): mAge i m_age, mWeighti m_weight czy mSpeed i m_speed.

Niektórzy programi�ci lubi� poprzedzi ka�d� nazw� klasy okre�lon� liter�— na przyk�ad cCat czy cPerson — podczas, gdy inni u�ywaj� wy��cznie du�ychlub ma�ych liter. Ja sam korzystam z konwencji, w której wszystkie nazwy klasrozpoczynaj� si� od du�ej litery, tak jak Cat czy Person (osoba).

Wielu programistów rozpoczyna wszystkie nazwy funkcji od du�ej litery, za�wszystkie nazwy zmiennych — od ma�ej. S�owa zwykle rozdzielane s� znakiempodkre�lenia — tak jak w Chase_Mice — lub poprzez zastosowanie du�ej literydla ka�dego s�owa — na przyk�ad ChaseMice czy DrawCircle (rysuj okr�g).

Wa�ne jest, by wybra okre�lony styl i trzyma si� go w ka�dym programie.Z czasem rozwiniesz swój styl nie tylko na konwencje nazw, ale tak�e na wci�cia,wyrównanie nawiasów klamrowych oraz styl komentarzy.

W firmach programistycznych powszechne jest okre�lenie standardu wieluelementów stylu zapisu kodu �ród�owego. Sprawia on, �e wszyscy programi�cimog� �atwo odczytywa� wzajemnie swój kod. Niestety, przenosi si� to równie� dofirm opracowuj�cych systemy operacyjne i biblioteki klas przeznaczonych doponownego u�ytku. Zazwyczaj oznacza to, �e w programach C++ jest jednocze�niestosowanych wiele ró�nych konwencji nazw.

Jak ju� wcze�niej wspomniano, j�zyk C++ uwzgl�dnia wielko�� liter, dlategowszystkie nazwy klas powinny przestrzega� tej samej konwencji. Dzi�ki temu nigdynie b�dziesz musia� sprawdza� pisowni nazwy klasy (czy to by�o Rectangle,rectangle czy RECTANGLE?).

Page 28: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

Dost�p do elementów sk�adowych klasy 313

Definiowanie obiektuPo zadeklarowaniu klasy mo�na jej nast�pnie u�ywa jako nowego typu dladefiniowanych zmiennych tego typu. Definiowanie obiektu nowego typuprzypomina definiowanie zmiennej ca�kowitej:

unsigned int GrossWeight; // definicja zmiennej typu unsigned intCat Frisky; // definicja zmiennej typu Cat

Ten kod definiuje zmienn� o nazwie GrossWeight (��czna waga), której typemjest unsigned int. Oprócz tego definiuje zmienn� o nazwie Frisky, która jestobiektem klasy (typu) Cat.

Klasy a obiektyNigdy nie karmi si� definicji kota, lecz konkretnego kota. Nale�y dokonarozró�nienia pomi�dzy ide� kota a konkretnym kotem, który w�a�nie ociera si�o Twoje nogi. C++ równie� dokonuje rozró�nienia pomi�dzy klas� Cat, b�d�c�ide� kota, a poszczególnymi obiektami typu Cat. Tak wi�c Frisky jest obiektemtypu Cat, tak jak GrossWeight jest zmienn� typu unsigned int. Obiekt jestindywidualnym egzemplarzem klasy.

Dost�p do elementów sk�adowych klasyGdy zdefiniujesz ju� faktyczny obiekt Cat — na przyk�ad:

Cat Frisky;

w celu uzyskania dost�pu do jego sk�adowych mo�esz u�y operatora kropki (.).Aby zmiennej sk�adowej itsWeight obiektu Frisky przypisa warto� 50,powiniene� napisa:

Frisky.itsWeight = 50;

Aby wywo�a funkcj� Meow(), mo�esz napisa:

Frisky.Meow();

Gdy u�ywasz metody klasy, oznacza to, �e wywo�ujesz t� metod�. W tymprzyk�adzie wywo�a�e� metod� Meow() obiektu Frisky.

Page 29: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

314 Lekcja 10. Klasy i obiekty

Przypisywa nale�y obiektom, nie klasomW C++ nie przypisuje si� warto�ci typom; przypisuje si� je zmiennym. Na przyk�ad,nie mo�na napisa:

int = 5; // �le

Kompilator uzna to za b��d, gdy� nie mo�na przypisa warto�ci pi� typowica�kowitemu. Zamiast tego musisz zdefiniowa zmienn� typu ca�kowitegoi przypisa jej warto� 5. Na przyk�ad:

int x ; // definicja zmiennej typu intx = 5; // ustawienie warto�ci zmiennej x na 5

Jest to skrócony zapis stwierdzenia: „Przypisz warto� 5 zmiennej x, która jestzmienn� typu int”. Nie mo�na równie� napisa:

Cat.itsAge = 5; // �le

Kompilator uzna to za b��d, gdy� nie mo�esz przypisa warto�ci 5 do elementuitsAge klasy Cat. Zamiast tego musisz zdefiniowa egzemplarz obiektu klasyCat i dopiero wtedy przypisa warto� jego sk�adowej. Na przyk�ad:

Cat Frisky; // podobnie jak int x;Frisky.itsAge = 5; // podobnie jak x = 5;

Czego nie zadeklarujesz,tego klasa nie b�dzie mia�aPrzeprowad� taki eksperyment: podejd� do trzylatka i poka� mu kota. Nast�pniepowiedz: To jest Frisky. Frisky zna sztuczk�. Frisky, zaszczekaj! Dziecko roze�miejesi� i powie: „Nie, g�uptasie, koty nie szczekaj�!”.

Je�li napisa�e�:

Cat Frisky; // tworzy obiekt Cat o nazwie FriskyFrisky.Bark(); // nakazuje Friskiemu szczeka�

Kompilator wy�wietli komunikat: „Nie, g�uptasie, koty (cats) nie szczekaj�!”.(By mo�e w Twoim kompilatorze ten komunikat b�dzie brzmia� nieco inaczej).Kompilator wie, �e Frisky nie mo�e szczeka, gdy� klasa Cat nie posiada metodyBark() (szczekaj). Kompilator nie pozwoli Friskiemu nawet zamiaucze, je�li niezdefiniujesz dla niego funkcji Meow() (miaucz).

Page 30: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

Dost�p prywatny i publiczny 315

Tak Nie

Do deklarowania klasy u�ywaj s�owakluczowego class.

W celu uzyskania dost�pu do zmiennychi funkcji sk�adowych klasy u�ywajoperatora kropki (.).

Nie myl deklaracji z definicj�. Deklaracjamówi czym jest klasa, a definicjaprzygotowuje pami�� dla obiektu.

Nie myl klasy z obiektem.

Nie przypisuj klasie warto�ci. Warto�ciprzypisuj danym sk�adowym obiektu.

Dost�p prywatny i publicznyW deklaracji klasy u�ywanych jest tak�e kilka innych s�ów kluczowych. Dwanajwa�niejsze z nich to: public (publiczny) i private (prywatny).

S�owa kluczowe private i public s� u�ywane wraz z egzemplarzami klasy— zarówno ze zmiennymi sk�adowymi, jak i metodami klasy. Prywatne sk�adowemog� by u�ywane tylko przez metody nale��ce do danej klasy. Sk�adowepubliczne s� dost�pne dla innych funkcji i klas. To rozró�nienie jest wa�ne, chona pocz�tku mo�e sprawia k�opot. Wszystkie sk�adowe klasy — dane i metody— s� domy�lnie prywatne. Aby to lepiej wyja�ni, spójrzmy na poprzedni przyk�ad:

class Cat{ unsigned int itsAge; unsigned int itsWeight; void Meow();};

W tej deklaracji, sk�adowe itsAge, itsWeight oraz Meow() s� prywatne, gdy�wszystkie sk�adowe klasy s� prywatne domy�lnie. Oznacza to, �e dopóki niepostanowisz inaczej, pozostan� one prywatne. Je�li jednak w funkcji main()napiszesz na przyk�ad:

Cat Bobas;Bobas.itsAge = 5; // b��d! nie mo�na u�ywa� prywatnych danych!

kompilator uzna to za b��d. We wcze�niejszej deklaracji powiedzia�e� kompilatorowi,�e sk�adowych itsAge, itsWeight oraz Meow() b�dziesz u�ywa� tylko w funkcjachsk�adowych klasy Cat. W powy�szym fragmencie kodu próbujesz odwo�a si�do zmiennej sk�adowej obiektu Bobas spoza metody klasy Cat. To, �e Bobas jestobiektem klasy Cat, nie oznacza, �e mo�esz korzysta z tych elementów obiektuBobas, które s� prywatne.

Page 31: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

316 Lekcja 10. Klasy i obiekty

W�a�nie to jest �ród�em nieko�cz�cych si� k�opotów pocz�tkuj�cych programistówC++. Ju� s�ysz�, jak narzekasz: „Hej! W�a�nie napisa�em, �e Bobas jest kotem, tj.obiektem klasy Cat. Dlaczego Bobas nie ma dost�pu do swojego w�asnego wieku?”.Odpowied� brzmi: Bobas ma dost�p, ale Ty nie masz. Bobas, w swoich w�asnychmetodach, ma dost�p do wszystkich swoich sk�adowych, zarówno publicznych,jak i prywatnych. Nawet je�li to Ty tworzysz obiekt klasy Cat, nie mo�eszprzegl�da ani zmienia tych jego sk�adowych, które s� prywatne.

Aby mie dost�p do sk�adowych obiektu Cat, pewne elementy sk�adowe powinnyby publiczne:

class Cat{ public: unsigned int itsAge; unsigned int itsWeight; void Meow();};

Teraz sk�adowe itsAge, itsWeight oraz Meow() s� publiczne. Bobas.itsAge = 5;kompiluje si� bez problemów.

S�owo kluczowe public ma zastosowanie wzgl�dem wszystkich elementówsk�adowych w danej deklaracji a� do napotkania s�owa kluczowego private i naodwrót. W ten sposób sekcje klasy mo�na bardzo �atwo zadeklarowa� jakopubliczne b�d� prywatne.

Listing 10.1 przedstawia deklaracj� klasy Cat z publicznymi zmiennymi sk�adowymi.

Listing 10.1. Dost�p do publicznych sk�adowych w prostej klasie

1: // Demonstruje deklaracj� klasy oraz 2: // definicje obiektu tej klasy. 3: 4: #include <iostream> 5: 6: class Cat // deklaruj� klas� Cat (kot) 7: { 8: public: // nast�puj�ce po tym sk�adowe s� publiczne 9: int itsAge; // zmienna sk�adowa10: int itsWeight; // zmienna sk�adowa11: }; // zwró� uwag� na �rednik12:13: int main()14: {15: Cat Frisky;

Page 32: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

Dost�p prywatny i publiczny 317

16: Frisky.itsAge = 5; // przypisanie do zmiennej sk�adowej17: std::cout << "Frisky jest kotem i ma " ;18: std::cout << Frisky.itsAge << " lat.\n";19: return 0;20: }

Wynik �

Frisky jest kotem i ma 5 lat.

Analiza �

Linia 6. zawiera s�owo kluczowe class. Informuje ono kompilator, �e nast�pujepo nim deklaracja klasy. Nazwa nowej klasy nast�puje bezpo�rednio po s�owiekluczowym class. W tym przypadku nazw� klasy jest Cat (kot).

Cia�o deklaracji rozpoczyna si� w linii 7. od otwieraj�cego nawiasu klamrowegoi ko�czy si� zamykaj�cym nawiasem klamrowym i �rednikiem w linii 11. Linia 8.zawiera s�owo kluczowe public, które wskazuje, �e wszystko, co po nim nast�pi,b�dzie publiczne, a� do natrafienia na s�owo kluczowe private lub koniec deklaracjiklasy. Linie 9. i 10. zawieraj� deklaracje sk�adowych klasy, itsAge (jego wiek)oraz itsWeight (jego waga).

W linii 13. rozpoczyna si� funkcja main(). W linii 15. Frisky jest definiowanyjako egzemplarz klasy Cat — tj. jako obiekt klasy Cat. W linii 16. wiek Friskajest ustawiany na 5. W liniach 17. i 18. zmienna sk�adowa itsAge zostaje u�ytado wy�wietlenia informacji o kocie Frisky. Powiniene� zauwa�y, jak w liniach16. i 18. nast�puje uzyskanie dost�pu do obiektu Frisky. Zmienna itsAge jestdost�pna poprzez nazw� obiektu (w tym przyk�adzie Frisky), nast�pnie kropk�i nazw� zmiennej sk�adowej (w tym przypadku itsAge).

Spróbuj wykomentowa� lini� 8., po czym skompiluj program ponownie. W linii 16.wyst�pi b��d, gdy� zmienna sk�adowa itsAge nie b�dzie ju� sk�adow� publiczn�.Domy�lnie, wszystkie sk�adowe klasy s� prywatne.

Oznaczanie danych sk�adowychjako prywatnychPowiniene� przyj� jako ogóln� regu��, �e dane sk�adowe klasy nale�y utrzymywajako prywatne. Oczywi�cie, mo�esz si� zastanawia, w jaki sposób uzyskainformacje dotycz�ce klasy, je�li wszystkie elementy sk�adowe b�d� prywatne.

Page 33: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

318 Lekcja 10. Klasy i obiekty

Przyk�adowo, je�li zmienna itsAge b�dzie prywatna, jak mo�na odczyta b�d�ustawi wiek obiektu Cat?

W celu uzyskania dost�pu do danych prywatnych w klasie musisz stworzypubliczne funkcje sk�adowe, zwane akcesorami. Funkcje te umo�liwi� odczytzmiennych sk�adowych i przypisywanie im warto�ci. Te funkcje dost�powe(akcesory) s� funkcjami sk�adowymi, u�ywanymi przez inne cz��ci programuw celu odczytywania i ustawiania prywatnych zmiennych sk�adowych. Publicznyakcesor jest funkcj� sk�adow� klasy, u�ywan� albo do odczytu warto�ci prywatnejzmiennej sk�adowej klasy, albo do ustawiania warto�ci tej zmiennej.

Dlaczego mia�by� utrudnia sobie �ycie dodatkowym poziomem po�redniegodost�pu? Po co dodawa kolejne funkcje, skoro pro�ciej i �atwiej jest bezpo�redniopos�ugiwa si� danymi? Jaki cel ma stosowanie akcesorów?

Odpowied� na te pytania jest ca�kiem prosta: akcesory umo�liwiaj� oddzielenieszczegó�ów przechowywania danych klasy od szczegó�ów jej u�ywania. Dzi�kitemu mo�esz zmienia sposób przechowywania danych klasy bez konieczno�ciprzepisywania funkcji, które z tych danych korzystaj�.

Je�li funkcja, która chce pozna wiek kota, odwo�a si� bezpo�rednio do zmiennejitsAge klasy Cat, b�dzie musia�a zosta przepisana, je�eli Ty, jako autor klasyCat, zdecydujesz si� na zmian� sposobu przechowywania tej zmiennej. Jednakposiadaj�c funkcj� sk�adow� GetAge() (pobierz wiek), klasa Cat mo�e �atwozwróci w�a�ciw� warto� bez wzgl�du na to, w jaki sposób przechowywanyb�dzie wiek. Funkcja wywo�uj�ca nie musi wiedzie, czy jest on przechowywanyjako zmienna typu unsigned int czy long lub czy wiek jest obliczany w miar�potrzeb.

Ta technika u�atwia zapanowanie nad programem. Przed�u�a istnienie kodu,gdy� zmiany projektowe nie powoduj�, �e program staje si� przestarza�y.

Oprócz tego funkcje akcesorów mog� zawiera dodatkow� logik� — na przyk�adma�o prawdopodobne jest, aby wiek kota (obiektu Cat) przekroczy� warto� 100,a jego waga przekroczy�a warto� 1000. Wymienione warto�ci powinny byniedozwolone. Funkcja akcesora mo�e wymusi stosowanie tego rodzajuogranicze�, jak równie� wykonywa wiele innych zada�.

Listing 10.2 przedstawia klas� Cat zmodyfikowan� tak, by zawiera�a prywatnedane sk�adowe i publiczne akcesory. Zwró uwag�, �e ten listing przedstawiawy��cznie deklaracj� klasy, nie ma w nim kodu wykonywalnego.

Page 34: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

Dost�p prywatny i publiczny 319

Listing 10.2. Klasa z akcesorami

1: // Deklaracja klasy Cat 2: // Dane sk�adowe s� prywatne, publiczne akcesory po�rednicz� 3: // w ustawianiu i odczytywaniu warto�ci sk�adowych prywatnych 4: class Cat 5: { 6: public: 7: // publiczne akcesory 8: unsigned int GetAge(); 9: void SetAge(unsigned int Age);10:11: unsigned int GetWeight();12: void SetWeight(unsigned int Weight);13:14: // publiczna funkcja sk�adowa15: void Meow();16:17: // prywatne dane sk�adowe18: private:19: unsigned int itsAge;20: unsigned int itsWeight;21: };

Analiza �

Ta klasa posiada pi� metod publicznych. Linie 8. i 9. zawieraj� akcesory dlask�adowej itsAge. Mo�esz zobaczy, �e w linii 8. znajduje si� metoda pobieraj�cawiek kota, natomiast w linii 9. metoda ustawiaj�ca wiek kota. Linie 11. i 12.zawieraj� podobne akcesory dla sk�adowej itsWeight. Te akcesory ustawiaj�zmienne sk�adowe i zwracaj� ich warto�ci.

W linii 15. jest zadeklarowana publiczna funkcja sk�adowa Meow(). Ta funkcjanie jest akcesorem. Nie zwraca warto�ci ani ich nie ustawia; wykonuje inn�us�ug� dla klasy — wy�wietla s�owo Miau. Zmienne sk�adowe s� zadeklarowanew liniach 19. i 20.

Aby ustawi wiek Friska, powiniene� przekaza warto� metodzie SetAge()(ustaw wiek), na przyk�ad:

Cat Frisky;Frisky.SetAge(5); // ustawia wiek Friska // u�ywaj�c publicznego akcesora

W dalszej cz��ci lekcji poznasz kod, dzi�ki któremu metoda SetAge() oraz innemog� dzia�a.

Page 35: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

320 Lekcja 10. Klasy i obiekty

Zadeklarowanie metod lub danych jako prywatnych umo�liwia kompilatorowiwyszukanie w programach pomy�ek, zanim stan� si� one b��dami. Ka�dy szanuj�cysi� programista potrafi znale� sposób na obej�cie prywatno�ci sk�adowych.Stroustrup, autor j�zyka C++, stwierdza, �e „...mechanizmy ochrony z poziomuj�zyka chroni� przed pomy�k�, a nie przed �wiadomym oszustwem” (WNT, 1995).

S�owo kluczowe class

Sk�adnia s�owa kluczowego class jest nast�puj�ca:

class nazwa_klasy{ // s�owa kluczowe kontroli dost�pu // zadeklarowane zmienne i sk�adowe klasy};

S�owo kluczowe class s�u�y do deklarowania nowych typów. Klasa stanowi zbiórdanych sk�adowych klasy, które s� zmiennymi ró�nych typów, tak�e innych klas.Klasa zawiera tak�e funkcje klasy — tzw. metody — które s� funkcjami u�ywanymido manipulowania danymi w danej klasie i wykonywania innych us�ug dla klasy.

Obiekty nowego typu definiuje si� w taki sam sposób, w jaki definiuje si� innezmienne. Nale�y okre�li� typ (klas�), a po nim nazw� zmiennej (obiektu).Do uzyskania dost�pu do funkcji i danych klasy s�u�y operator kropki (.).

S�owa kluczowe kontroli dost�pu okre�laj�, które sekcje klasy s� prywatne, a którepubliczne. Domy�lnie wszystkie sk�adowe klasy s� prywatne. Ka�de s�owo kluczowezmienia kontrol� dost�pu od danego miejsca a� do koca klasy, lub kontrol�wyst�pienia nast�pnego s�owa kluczowego kontroli dost�pu. Deklaracja klasykoczy si� zamykaj�cym nawiasem klamrowym i �rednikiem.

Przyk�ad 1

class Cat{ public: unsigned int Age; unsigned int Weight; void Meow();};

Cat Frisky;Frisky.Age = 8;Frisky.Weight = 18;Frisky.Meow();Przyk�ad 2class Car{

Page 36: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

Implementowanie metod klasy 321

public: // pi�� nast�pnych sk�adowych jest publicznych void Start(); void Accelerate(); void Brake(); void SetYear(int year); int GetYear();

private: // pozosta�a cz��� jest prywatna int Year; char Model [255];}; // koniec deklaracji klasy

Car OldFaithful; // tworzy egzemplarz klasyint bought; // lokalna zmienna typu intOldFaithful.SetYear(84); // ustawia sk�adow� Year na 84bought = OldFaithful.GetYear(); // ustawia zmienn� bought na 84OldFaithful.Start(); //wywo�uje metod� Start

Tak Nie

U�ywaj publicznych akcesorów, czylipublicznych funkcji dost�powych.

Odwo�uj si� do prywatnych zmiennychsk�adowych z funkcji sk�adowychklasy.

Nie deklaruj zmiennych sk�adowychjako publiczne, o ile nie ma takiejpotrzeby.

Nie u�ywaj prywatnych zmiennychsk�adowych klasy poza t� klas�.

Implementowanie metod klasyJak ju� si� przekona�e�, akcesory stanowi� publiczny interfejs do prywatnychdanych klasy. Ka�dy akcesor musi posiada, wraz z innymi zadeklarowanymimetodami klasy, implementacj�. Implementacja jest nazywana definicj��funkcji.

Definicja funkcji sk�adowej rozpoczyna si� podobnie jak definicja zwyk�ej funkcji.W pierwszej kolejno�ci trzeba poda typ zwracany z danej funkcji lub u�ys�owa kluczowego void, je�li funkcja niczego nie zwraca. Nast�pnie podajemynazw� klasy, po której wyst�puj� dwa dwukropki, nazwa funkcji i jej parametry.Listing 10.3 przedstawia pe�n� deklaracj� prostej klasy Cat, wraz z implementacj�jej akcesorów i jednej ogólnej funkcji tej klasy.

Page 37: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

322 Lekcja 10. Klasy i obiekty

Listing 10.3. Implementacja metod prostej klasy

1: // Demonstruje deklarowanie klasy oraz 2: // definiowanie jej metod 3: #include <iostream> // dla cout 4: 5: class Cat // pocz�tek deklaracji klasy 6: { 7: public: // pocz�tek sekcji publicznej 8: int GetAge(); // akcesor 9: void SetAge(int age); // akcesor10: void Meow(); // ogólna funkcja11: private: // pocz�tek sekcji prywatnej12: int itsAge; // zmienna sk�adowa13: };14:15: // GetAge, publiczny akcesor16: // zwracaj�cy warto�� sk�adowej itsAge17: int Cat::GetAge()18: {19: return itsAge;20: }21:22: // definicja SetAge, akcesora23: // publicznego24: // ustawiaj�cego sk�adow� itsAge25: void Cat::SetAge(int age)26: {27: // ustawia zmienn� sk�adow� itsAge28: // zgodnie z warto�ci� przekazan� w parametrze age29: itsAge = age;30: }31:32: // definicja metody Meow33: // zwraca: void34: // parametery: brak35: // dzia�anie: wy�wietla na ekranie s�owo "miauczy"36: void Cat::Meow()37: {38: std::cout << "Miauczy.\n";39: }40:41: // tworzy kota, ustawia jego wiek, sprawia,42: // �e miauczy, wy�wietla jego wiek i ponownie miauczy.43: int main()44: {45: Cat Frisky;46: Frisky.SetAge(5);47: Frisky.Meow();

Page 38: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

Implementowanie metod klasy 323

48: std::cout << "Frisky jest kotem i ma " ;49: std::cout << Frisky.GetAge() << " lat.\n";50: Frisky.Meow();51: return 0;52: }

Wynik �

Miauczy.Frisky jest kotem i ma 5 lat.Miauczy.

Analiza �

Linie od 5. do 13. zawieraj� definicj� klasy Cat (kot). Linia 7. zawiera s�owokluczowe public, które informuje kompilator, �e to, co po nim nast�puje, jestzestawem publicznych sk�adowych. Linia 8. zawiera deklaracj� publicznegoakcesora GetAge() (pobierz wiek). GetAge() zapewnia dost�p do prywatnejzmiennej sk�adowej itsAge (jego wiek), zadeklarowanej w linii 12. Linia 9.zawiera publiczny akcesor SetAge() (ustaw wiek). Funkcja SetAge() otrzymujeparametr typu int, który nast�pnie przypisuje sk�adowej itsAge.

Linia 10. zawiera deklaracj� metody Meow() (miaucz). Funkcja Meow() nie jestakcesorem. Jest to ogólna metoda klasy, wy�wietlaj�ca na ekranie s�owo „Miauczy.”

Linia 11. rozpoczyna sekcj� prywatn�, która obejmuje jedynie zadeklarowan�w linii 12. prywatn� sk�adow� itsAge. Deklaracja klasy ko�czy si� w linii 13.zamykaj�cym nawiasem klamrowym i �rednikiem.

Linie od 17. do 20. zawieraj� definicj� sk�adowej funkcji GetAge(). Ta metodanie ma parametrów i zwraca warto� ca�kowit�. Zauwa�, �e ta metoda klasyzawiera nazw� klasy, dwa dwukropki oraz nazw� funkcji (linia 17.). Ta sk�adniainformuje kompilator, �e definiowana funkcja GetAge() jest w�a�nie t� funkcj�,która zosta�a zadeklarowana w klasie Cat. Poza formatem tego nag�ówka,definiowanie funkcji w�asnej GetAge() niczym nie ró�ni si� od definiowaniainnych (zwyk�ych) funkcji.

Funkcja GetAge() posiada tylko jedn� lini� i zwraca po prostu warto� zmiennejsk�adowej itsAge. Zauwa�, �e funkcja main() nie ma dost�pu do tej zmiennejsk�adowej, gdy� jest ona prywatna dla klasy Cat. Funkcja main() ma za to dost�pdo publicznej metody GetAge().

Page 39: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

324 Lekcja 10. Klasy i obiekty

Poniewa� ta metoda jest sk�adow� klasy Cat, ma pe�ny dost�p do zmiennej itsAge.Dzi�ki temu mo�e zwróci funkcji main() warto� zmiennej itsAge.

Linia 25. zawiera definicj� funkcji sk�adowej SetAge(). Mo�esz zauwa�y, �e tafunkcja pobiera jedn� warto� w postaci liczby ca�kowitej (age) i nie zwraca �adnejwarto�ci, co jest wskazane przez s�owo kluczowe void. Ta funkcja posiadaparametr w postaci warto�ci ca�kowitej i przypisuje sk�adowej itsAge jegowarto� (linia 29.). Poniewa� jest sk�adow� klasy Cat, ma bezpo�redni dost�pdo jej zmiennych prywatnych i publicznych.

Linia 36. rozpoczyna definicj� (czyli implementacj�) metody Meow() klasy Cat.Jest to jednoliniowa funkcja wy�wietlaj�ca na ekranie s�owo „Miauczy”, zako�czoneznakiem nowej linii. Pami�taj, �e znak \n powoduje przej�cie do nowej linii. Mo�eszzauwa�y, �e metoda Meow() jest zaimplementowana podobnie jak funkcjaakcesora, czyli rozpoczyna si� od typu zwracanej warto�ci, a nast�pnie mamynazw� klasy, nazw� funkcji oraz parametry (w tym przypadku nie ma �adnychparametrów).

Linia 43. rozpoczyna cia�o funkcji main(), czyli w�a�ciwy program. W linii 45.,funkcja main() deklaruje obiekt Cat o nazwie Frisky. Ujmuj�c to inaczej, mo�napowiedzie, �e funkcja main() deklaruje kota (Cat) o imieniu Frisky.

W linii 46. zmiennej itsAge tego obiektu jest przypisywana warto� 5 (poprzezu�ycie akcesora SetAge()). Zauwa�, �e wywo�anie tej metody nast�puje dzi�kiu�yciu nazwy obiektu (Frisky), po której zastosowano operator kropki (.) i nazw�metody (SetAge()). W podobny sposób wywo�ywane s� wszystkie inne metodywszystkich klas.

Poj�cia funkcja sk�adowa i metoda sk�adowa mog� by� u�ywane zamiennie.

Linia 47. wywo�uje funkcj� sk�adow� Meow(), za� w linii 49. za pomoc� akcesoraGetAge(), wy�wietlany jest komunikat. Linia 50. ponownie wywo�uje funkcj� Meow().Cho wymienione metody s� cz��ci� klasy (Cat) i u�ywane poprzez obiekt (Frisky),to dzia�aj� dok�adnie tak samo jak funkcje, które widzia�e� do tej pory.

Konstruktory i destruktoryIstniej� dwa sposoby definiowania zmiennej ca�kowitej. Mo�na zdefiniowa zmienn�,a nast�pnie, w dalszej cz��ci programu, przypisa jej warto�. Na przyk�ad:

Page 40: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

Konstruktory i destruktory 325

int Weight; // definiujemy zmienn�... // tu inny kodWeight = 7; // przypisujemy jej warto��

Mo�emy te� zdefiniowa zmienn� i jednocze�nie zainicjalizowa j�. Na przyk�ad:

int Weight = 7; // definiujemy i inicjalizujemy warto�ci� 7

Inicjalizacja ��czy w sobie definiowanie zmiennej oraz pocz�tkowe przypisaniewarto�ci. Nic nie stoi na przeszkodzie temu, by zmieni pó�niej warto� zmiennej.Inicjalizacja powoduje tylko, �e zmienna nigdy nie b�dzie pozbawiona sensownejwarto�ci.

W jaki sposób zainicjalizowa sk�adowe klasy? Klasy posiadaj� specjalne funkcjesk�adowe, zwane konstruktorami. Konstruktor (ang. constructor) mo�e w raziepotrzeby posiada parametry, ale nie mo�e zwraca warto�ci — nawet typu void.Konstruktor jest metod� klasy o takiej samej nazwie, jak nazwa klasy.

Gdy zadeklarujesz konstruktor, powiniene� tak�e zadeklarowa destruktor(ang. destructor). Konstruktor tworzy i inicjalizuje obiekt danej klasy, za� destruktorporz�dkuje obiekt i zwalnia pami�, któr� mog�e� w niej zaalokowa (albow konstruktorze, albo w trakcie cyklu �yciowego obiektu). Destruktor zawszenosi nazw� klasy, poprzedzon� znakiem tyldy (~). Destruktory nie maj�argumentów i nie zwracaj� warto�ci. Dlatego deklaracja destruktora klasy Catma nast�puj�c� posta:

~Cat();

Domy�lne konstruktory i destruktoryIstnieje wiele rodzajów konstruktorów; niektóre z nich posiadaj� argumenty,inne nie. Konstruktor, którego mo�na wywo�a bez �adnych argumentów, jestnazywany konstruktorem domy�lnym. Istnieje tylko jeden rodzaj destruktora.On tak�e nie posiada argumentów.

Je�li nie stworzysz konstruktora lub destruktora, kompilator stworzy je zaCiebie. Konstruktor dostarczany przez kompilator jest konstruktorem domy�lnym— czyli konstruktorem bez argumentów. Stworzone przez kompilator domy�lnykonstruktor i destruktor nie maj� �adnych argumentów, a na dodatek w ogóle nicnie robi�! Je�eli chcesz, aby wykonywa�y jakiekolwiek operacje, musisz samodzielnieutworzy domy�lny konstruktor i destruktor.

Page 41: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

326 Lekcja 10. Klasy i obiekty

U�ycie domy�lnego konstruktoraDo czego mo�e przyda si� konstruktor, który nic nie robi? Jest to problemtechniczny: wszystkie obiekty musz� by konstruowane i niszczone, dlategow odpowiednich momentach wywo�ywane s� te nic nie robi�ce funkcje.

Aby móc zadeklarowa obiekt bez przekazywania parametrów, na przyk�ad

Cat Boots; // Boots nie ma parametrów

musisz posiada konstruktor w postaci

Cat();

Gdy definiujesz obiekt klasy, wywo�ywany jest konstruktor. Gdyby konstruktorklasy Cat mia� dwa parametry, móg�by� zdefiniowa obiekt Cat, pisz�c

Cat Frisky (5, 7);

W tym przypadku pierwszy parametr móg�by by wiekiem, natomiast drugimóg�by oznacza wag� kota. Gdyby konstruktor mia� jeden parametr, napisa�by�

Cat Frisky (3);

W przypadku, gdy konstruktor nie ma �adnych parametrów (gdy jest konstruktoremdomy�lnym), mo�esz opu�ci nawiasy i napisa

Cat Frisky;

Jest to wyj�tek od regu�y, zgodnie z któr� wszystkie funkcje wymagaj� zastosowanianawiasów, nawet je�li nie maj� parametrów. W�a�nie dlatego mo�esz napisa:

Cat Frisky;

Jest to interpretowane jako wywo�anie konstruktora domy�lnego. Nie dostarczamymu parametrów i pomijamy nawiasy.

Zwró uwag�, �e nie musisz u�ywa domy�lnego konstruktora dostarczanegoprzez kompilator. Zawsze mo�esz napisa w�asny konstruktor domy�lny — tj.konstruktor bez parametrów. Mo�esz zastosowa w nim cia�o funkcji, w którymmo�esz zainicjalizowa obiekt. Zgodnie z konwencj�, zawsze zaleca si� zdefiniowaniekonstruktora i ustawienie zmiennym sk�adowym odpowiednich warto�cidomy�lnych w celu zagwarantowania prawid�owego zachowania obiektu.

Zgodnie z konwencj�, gdy deklarujesz konstruktor, powiniene� tak�e zadeklarowadestruktor, nawet je�li nie robi on niczego. Nawet je�li destruktor domy�lny b�dziedzia�a� poprawnie, nie zaszkodzi zadeklarowa w�asnego. Dzi�ki niemu kod stajesi� bardziej przejrzysty.

Page 42: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

Konstruktory i destruktory 327

Listing 10.4 zawiera now� wersj� klasy Cat, w której do zainicjalizowania obiektukota nie u�yto domy�lnego konstruktora. Wiek kota zosta� ustawiony zgodniez warto�ci� otrzyman� jako parametr konstruktora. Listing pokazuje równie�miejsce, w którym wywo�ywany jest destruktor.

Listing 10.4. U�ycie konstruktora i destruktora

1: // Demonstruje deklarowanie konstruktora 2: // i destruktora dla klasy Cat 3: // Domy�lny konstruktor zosta� stworzony przez programist� 4: #include <iostream> // dla cout 5: 6: class Cat // pocz�tek deklaracji klasy 7: { 8: public: // pocz�tek sekcji publicznej 9: Cat(int initialAge); // konstruktor10: ~Cat(); // destruktor11: int GetAge(); // akcesor12: void SetAge(int age); // akcesor13: void Meow();14: private: // pocz�tek sekcji prywatnej15: int itsAge; // zmienna sk�adowa16: };17:18: // konstruktor klasy Cat19: Cat::Cat(int initialAge)20: {21: itsAge = initialAge;22: }23:24: Cat::~Cat() // destruktor, nic nie robi25: {26: }27:28: // GetAge, publiczny akcesor29: // zwraca warto�� sk�adowej itsAge30: int Cat::GetAge()31: {32: return itsAge;33: }34:35: // definicja SetAge, akcesora36: // publicznego37: void Cat::SetAge(int age)38: {39: // ustawia zmienn� sk�adow� itsAge40: // zgodnie z warto�ci� przekazan� w parametrze age41: itsAge = age;

Page 43: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

328 Lekcja 10. Klasy i obiekty

42: }43:44: // definicja metody Meow45: // zwraca: void46: // parametery: brak47: // dzia�anie: wy�wietla na ekranie s�owo "miauczy"48: void Cat::Meow()49: {50: std::cout << "Miauczy.\n";51: }52:53: // tworzy kota, ustawia jego wiek, sprawia,54: // �e miauczy, wy�wietla jego wiek i ponownie miauczy.55: int main()56: {57: Cat Frisky(5);58: Frisky.Meow();59: std::cout << "Frisky jest kotem i ma " ;60: std::cout << Frisky.GetAge() << " lat.\n";61: Frisky.Meow();62: Frisky.SetAge(7);63: std::cout << "Teraz Frisky ma " ;64: std::cout << Frisky.GetAge() << " lat.\n";65: return 0;66: }

Wynik �

Miauczy.Frisky jest kotem i ma 5 lat.Miauczy.Teraz Frisky ma 7 lat.

Analiza �

Listing 10.4 przypomina listing 10.3, jednak w linii 9. dodano konstruktor,posiadaj�cy argument w postaci warto�ci ca�kowitej. Linia 10. deklaruje destruktor,który nie posiada parametrów. Destruktory nigdy nie maj� parametrów, za�destruktory i konstruktory nie zwracaj� �adnych warto�ci — nawet typu void.

Linie od 19. do 22. zawieraj� implementacj� konstruktora. Jest ona podobna doimplementacji akcesora SetAge(). Jak mo�esz zobaczy, nazwa klasy poprzedzanazw� konstruktora. Jak ju� wcze�niej wspomniano, to identyfikuje metod�(w tym przypadku Cat()) jako cz�� klasy Cat. Poniewa� wymieniona metodajest konstruktorem, to nie zwraca �adnej warto�ci, nawet void. Jednak w linii 21.konstruktor pobiera warto� pocz�tkow� przypisan� danej sk�adowej itsAge.

Page 44: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

Funkcje sk�adowe const 329

Linie od 24. do 26. przedstawiaj� implementacj� destruktora ~Cat(). W tejchwili ta funkcja nie robi nic, ale je�li deklaracja klasy zawiera deklaracj�destruktora, zdefiniowany musi zosta wtedy tak�e ten destruktor. Podobniejak w przypadku konstruktora oraz innych metod, destruktor jest poprzedzonynazw� klasy. Podobnie jak w przypadku konstruktora, ale odmiennie ni�w przypadku innych metod, nie podaje si� zwracanego typu oraz parametrów.To jest standardowy wymóg dla destruktorów.

Linia 57. zawiera definicj� obiektu Frisky, stanowi�cego egzemplarz klasy Cat.Do konstruktora obiektu Frisky przekazywana jest warto� 5. Nie ma potrzebywywo�ywania funkcji SetAge(), gdy� Frisky zosta� stworzony z warto�ci� 5znajduj�c� si� w zmiennej sk�adowej itsAge, tak jak pokazano w linii 60. W linii 62.zmiennej itsAge obiektu Frisky jest przypisywana warto� 7. T� now� warto�wy�wietla linia 64.

Tak Nie

W celu zainicjalizowania obiektówu�ywaj konstruktorów.

Je�eli doda�e� konstruktor, dodajrównie� destruktor.

Pami�taj, �e konstruktory i destruktorynie mog� zwraca� warto�ci.

Pami�taj, �e destruktory nie mog�mie� parametrów.

Funkcje sk�adowe constS�owo kluczowe const s�u�y do deklarowania zmiennych, które nie ulegaj�zmianie. Const mo�na stosowa równie� wraz z funkcjami sk�adowymi w klasie.Je�li zadeklarujesz metod� klasy jako const, obiecujesz w ten sposób, �e metodata nie zmieni warto�ci �adnej ze sk�adowych klasy.

Aby zadeklarowa metod� w ten sposób, umie� s�owo kluczowe const zanawiasami, lecz przed �rednikiem. Przyk�adowo:

void SomeFunction() const;

Pokazana powy�ej deklaracja funkcji sk�adowej const o nazwie SomeFunction()nie posiada argumentów i zwraca typ void. Wiesz, �e powy�sza funkcja nie zmieni�adnych elementów sk�adowych w klasie, poniewa� zosta�a zadeklarowana wrazze s�owem kluczowym const.

Page 45: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

330 Lekcja 10. Klasy i obiekty

Wraz z modyfikatorem const cz�sto deklarowane s� akcesory, które jedyniepobieraj� warto�. Przedstawiona wcze�niej klasa Cat posiada dwa akcesory:

void SetAge(int anAge);int GetAge();

Funkcja SetAge() nie mo�e by funkcj� const, gdy� modyfikuje warto� zmiennejsk�adowej itsAge. Natomiast funkcja GetAge() mo�e i powinna by const, gdy�nie modyfikuje warto�ci �adnej ze sk�adowych klasy. Funkcja GetAge() po prostuzwraca bie��c� warto� sk�adowej itsAge. Zatem deklaracje tych funkcji mo�naprzepisa nast�puj�co:

void SetAge(int anAge);int GetAge() const;

Gdy zadeklarujesz funkcj� jako const, za� implementacja tej funkcji modyfikujeobiekt poprzez modyfikacj� warto�ci którejkolwiek ze sk�adowych, kompilatorzg�osi b��d. Na przyk�ad, gdy napiszesz funkcj� GetAge() w taki sposób, �e b�dzieszzapami�tywa� ilo� zapyta� o wiek kota, spowodujesz b��d kompilacji. Jest tospowodowane tym, �e wywo�uj�c t� metod�, modyfikujesz zawarto� obiektu Cat.

Deklarowanie funkcji jako const wsz�dzie tam, gdzie jest to mo�liwe, nale�ydo tradycji programistycznej. Za ka�dym razem, gdy to zrobisz, umo�liwiszkompilatorowi wykrycie pomy�ki, zanim stanie si� ona b��dem, który ujawni si�ju� podczas dzia�ania programu.

Po co u�ywa kompilatora do wykrywania b��dów?

Gdyby mo�na by�o tworzy� programy w stu procentach pozbawione b��dów,by�oby cudowanie, jednak tylko bardzo niewielu programistów jest w stanietego dokona�. Wielu programistów opracowa�o jednak system pozwalaj�cyzminimalizowa� ilo�� b��dów przez wczesne ich wykrycie i poprawienie.

Cho� b��dy kompilatora s� irytuj�ce i stanowi� dla programisty przeklestwo, jednaks� czym� du�o lepszym ni� opisana dalej alternatywa. J�zyk o s�abej kontroli typówumo�liwia naruszanie zasad kontraktu bez s�owa sprzeciwu ze strony kompilatora,jednak program mo�e za�ama� si� w trakcie dzia�ania — na przyk�ad wtedy, gdypracuje z nim Twój szef. Co gorsze, w takim przypadku testowanie w celuwychwycenia tych b��dów b�dzie ma�o pomocne, poniewa� istnieje zbyt du�o�cie�ek wykonywania kodu rzeczywistych programów, aby móc przetestowa� jewszystkie.

B��dy czasu kompilacji — tj. b��dy wykryte podczas kompilowania programu —s� zdecydowanie lepsze ni� b��dy czasu dzia�ania — tj. b��dy wykryte podczasdzia�ania programu. S� lepsze, gdy� du�o �atwiej i precyzyjniej mo�na okre�li�

Page 46: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

Gdzie umieszcza� deklaracje klasy i definicje metod 331

ich przyczyn�. Mo�e si� zdarzy�, �e program zostanie wykonany wielokrotniebez wykonania wszystkich istniej�cych �cie�ek wykonania kodu. Dlatego b��dczasu dzia�ania mo�e przez d�u�szy czas pozosta� niezauwa�ony. B��dy kompilacjis� wykrywane podczas ka�dej kompilacji, s� wi�c du�o �atwiejsze do zidentyfikowaniai poprawienia. Celem dobrego programowania jest ochrona przed pojawianiem si�b��dów czasu dzia�ania. Jedn� ze znanych i sprawdzonych technik jest wykorzystaniekompilatora do wykrycia pomy�ek ju� na wczesnym etapie tworzenia programu.

Gdzie umieszcza� deklaracje klasyi definicje metodKa�da funkcja, któr� zadeklarujesz dla klasy, musi posiada definicj�. Definicjajest nazywana tak�e implementacj��funkcji. Podobnie jak w przypadku innychfunkcji, definicja metody klasy posiada nag�ówek i cia�o.

Definicja musi znajdowa si� w pliku, który mo�e zosta znaleziony przezkompilator. Wi�kszo� kompilatorów C++ wymaga, by taki plik mia� rozszerzenie.c lub .cpp. W tej ksi��ce korzystamy z rozszerzenia .cpp, ale aby mie pewno�,sprawd�, czego oczekuje Twój kompilator.

Wiele kompilatorów zak�ada, �e pliki z rozszerzeniem .c s� programami C,za� pliki z rozszerzeniem .cpp s� programami C++. Mo�esz u�ywa� dowolnegorozszerzenia, ale rozszerzenie .cpp wyeliminuje ewentualne nieporozumienia.

W pliku, w którym umieszczasz implementacj� funkcji, mo�esz umie�ci równie�jej deklaracj�, ale nie nale�y to do dobrych obyczajów. Zgodnie z konwencj�zaadoptowan� przez wi�kszo� programistów, deklaracje umieszcza si� w takzwanych plikach nag�ówkowych, zwykle posiadaj�cych t� sam� nazw�, leczz rozszerzeniem .h, .hp lub .hpp. W tej ksi��ce dla plików nag�ówkowych stosujemyrozszerzenie .h, ale sprawd� w swoim kompilatorze, jakie rozszerzenie powiniene�stosowa.

Na przyk�ad, deklaracj� klasy Cat powiniene� umie�ci w pliku o nazwie Cat.h, za�definicj� metod tej klasy w pliku o nazwie Cat.cpp. Nast�pnie powiniene� do��czydo pliku .cpp plik nag�ówkowy, poprzez umieszczenie na pocz�tku pliku Cat.cppnast�puj�cej dyrektywy:

#include "Cat.h"

Page 47: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

332 Lekcja 10. Klasy i obiekty

Informuje ona kompilator, by wstawi� w tym miejscu zawarto� pliku Cat.h tak,jakby� j� wpisa� r�cznie. Uwaga: niektóre kompilatory nalegaj�, by wielko� literw nazwie pliku w dyrektywie #include zgadza�a si� z wielko�ci� liter w nazwiepliku na dysku.

Dlaczego masz si� trudzi, rozdzielaj�c program na pliki .h i .cpp, skoro i tak plik .hjest wstawiany do pliku .cpp? W wi�kszo�ci przypadków klienci klasy nie dbaj�o szczegó�y jej implementacji. Odczytanie pliku nag�ówkowego daje im wystarczaj�c�ilo� informacji, by zignorowa plik implementacji. Poza tym, ten sam plik .h mo�eszdo��cza do wielu ró�nych plików .cpp.

Deklaracja klasy mówi kompilatorowi, czym jest ta klasa, jakie dane zawieraoraz jakie funkcje posiada. Deklaracja klasy jest nazywana jej interfejsem, gdy�informuje kompilator w jaki sposób ma z ni� wspó�dzia�a�. Ten interfejs jestzwykle przechowywany w pliku .h, cz�sto nazywanym plikiem nag�ówkowym.

Definicja funkcji mówi kompilatorowi, jak dzia�a dana funkcja. Definicja funkcjijest nazywana implementacj� metody klasy i jest przechowywana w pliku .cpp.Szczegó�y dotycz�ce implementacji klasy nale�� wy��cznie do jej autora. Klienciklasy — tj. cz��ci programu u�ywaj�ce tej klasy — nie musz�, ani nie powinnywiedzie�, jak zaimplementowane zosta�y funkcje.

Implementacja inlineMo�esz poprosi kompilator, by uczyni� zwyk�� funkcj� funkcj� inline, funkcjamiinline mog� sta si� równie� metody klasy. W tym celu nale�y umie�ci s�owokluczowe inline przed typem zwracanej warto�ci. Na przyk�ad, implementacjainline funkcji GetWeight() wygl�da nast�puj�co:

inline int Cat::GetWeight(){ return itsWeight; // zwraca dan� sk�adow� itsWeight}

Definicj� funkcji mo�na tak�e umie�ci w deklaracji klasy, co automatycznie sprawia,�e ta funkcja staje si� funkcj� inline. Na przyk�ad:

class Cat{ public: int GetWeight() { return itsWeight; } // inline void SetWeight(int aWeight);};

Page 48: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

Implementacja inline 333

Zwró uwag� na sk�adni� definicji funkcji GetWeight(). Cia�o funkcji inlinezaczyna si� natychmiast po deklaracji metody klasy; po nawiasach nie wyst�puje�rednik. Podobnie jak w innych funkcjach, definicja zaczyna si� od otwieraj�cegonawiasu klamrowego i ko�czy zamykaj�cym nawiasem klamrowym. Jak zwykle,bia�e znaki nie maj� znaczenia; mo�esz zapisa t� deklaracj� jako:

class Cat{ public: int GetWeight() const { return itsWeight; } // inline void SetWeight(int aWeight);};

Listingi 10.5 i 10.6 odtwarzaj� klas� Cat, tym razem jednak deklaracja klasyzosta�a umieszczona w pliku Cat.h, za� jej definicja w pliku Cat.cpp. Oprócz tego,na listingu 10.5 akcesor Meow() zosta� zadeklarowany jako funkcja inline.

Listing 10.5. Deklaracja klasy Cat w pliku CAT.h

1: #include <iostream> 2: class Cat 3: { 4: public: 5: Cat (int initialAge); 6: ~Cat(); 7: int GetAge() const { return itsAge;} // inline! 8: void SetAge (int age) { itsAge = age;} // inline! 9: void Meow() const { std::cout << "Miauczy.\n";} // inline!10: private:11: int itsAge;12: };

Listing 10.6. Implementacja klasy Cat w pliku CAT.cpp

1: // Demonstruje funkcje inline 2: // oraz do��czanie pliku nag�ówkowego 3: // pami�taj o w��czeniu plików nag�ówkowych! 4: #include "Cat.h" 5: 6: 7: Cat::Cat(int initialAge) //konstruktor 8: { 9: itsAge = initialAge;10: }

Page 49: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

334 Lekcja 10. Klasy i obiekty

11:12: Cat::~Cat() //destruktor, nic nie robi13: {14: }15:16: // tworzy kota, ustawia jego wiek, sprawia17: // �e miauczy, wy�wietla jego wiek i ponownie miauczy.18: int main()19: {20: Cat Frisky(5);21: Frisky.Meow();22: std::cout << "Frisky jest kotem i ma " ;23: std::cout << Frisky.GetAge() << " lat.\n";24: Frisky.Meow();25: Frisky.SetAge(7);26: std::cout << "Teraz Frisky ma " ;27: std::cout << Frisky.GetAge() << " lat.\n";28: return 0;29: }

Wynik �

Miauczy.Frisky jest kotem i ma 5 lat.Miauczy.Teraz Frisky ma 7 lat.

Analiza �

Kod zaprezentowany na listingach 10.5 i 10.6 jest podobny do kodu z listingu 10.4,trzy metody zosta�y zadeklarowane w pliku deklaracji jako inline, a deklaracjazosta�a przeniesiona do pliku Cat.hpp (listing 10.5).

Funkcja GetAge() jest deklarowana w linii 6. pliku Cat.h, gdzie znajduje si�tak�e jej implementacja inline. Linie 7. i 8. zawieraj� kolejne funkcje inline,jednak w stosunku do poprzednich, „zwyk�ych” implementacji, dzia�anie tychfunkcji nie zmienia si�.

Linia 4. listingu 10.6 zawiera dyrektyw� #include "Cat.h", która powodujewstawienie do pliku zawarto�ci pliku Cat.h. Do��czaj�c plik Cat.h, informujeszprekompilator, by odczyta� zawarto� tego pliku i wstawi� j� w miejscu wyst�pieniadyrektywy #include (tak jakby�, pocz�wszy od linii 5, sam wpisa� t� zawarto�).

Ta technika umo�liwia umieszczenie deklaracji w pliku innym ni� implementacja,a jednocze�nie zapewnienie kompilatorowi dost�pu do niej. W programach C++

Page 50: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

Klasy, których danymi sk�adowymi s� inne klasy 335

technika ta jest powszechnie wykorzystywana. Zwykle deklaracje klas znajduj�si� w plikach .h, które s� do��czane do powi�zanych z nimi plików .cpp za pomoc�dyrektyw #include.

Linie od 18. do 29. stanowi� powtórzenie funkcji main() z listingu 10.4. Oznacza to,�e funkcje inline dzia�aj� tak samo jak zwyk�e funkcje.

Klasy, których danymi sk�adowymis� inne klasyBudowanie z�o�onych klas przez deklarowanie prostszych klas i do��czanie ich dodeklaracji bardziej skomplikowanej klasy nie jest niczym niezwyk�ym. Na przyk�ad,mo�esz zadeklarowa klas� ko�a, klas� silnika, klas� skrzyni biegów itd., a nast�pniepo��czy je w klas� „samochód”. Deklaruje to relacj� posiadania. Samochódposiada silnik, ko�a i skrzyni� biegów.

We�my inny przyk�ad. Prostok�t sk�ada si� z odcinków. Odcinek jest zdefiniowanyprzez dwa punkty. Punkt jest zdefiniowany przez wspó�rz�dn� x i wspó�rz�dn�y. Listing 10.7 przedstawia pe�n� deklaracj� klasy Rectangle (prostok�t), któramo�e wyst�pi w pliku Rectangle.h. Poniewa� prostok�t jest zdefiniowany jakocztery odcinki ��cz�ce cztery punkty, za� ka�dy punkt odnosi si� do wspó�rz�dnejw uk�adzie, najpierw zadeklarujemy klas� Point (punkt) jako przechowuj�c�wspó�rz�dne x oraz y punktu. Listing 10.8 zawiera implementacje obu klas.

Listing 10.7. Deklarowanie kompletnej klasy

1: // pocz�tek Rect.h 2: #include <iostream> 3: class Point // przechowuje wspó�rz�dne x,y 4: { 5: // bez konstruktora, u�ywa domy�lnego 6: public: 7: void SetX(int x) { itsX = x; } 8: void SetY(int y) { itsY = y; } 9: int GetX()const { return itsX;}10: int GetY()const { return itsY;}11: private:12: int itsX;13: int itsY;14: }; // koniec deklaracji klasy Point15:

Page 51: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

336 Lekcja 10. Klasy i obiekty

16:17: class Rectangle18: {19: public:20: Rectangle (int top, int left, int bottom, int right);21: ~Rectangle () {}22:23: int GetTop() const { return itsTop; }24: int GetLeft() const { return itsLeft; }25: int GetBottom() const { return itsBottom; }26: int GetRight() const { return itsRight; }27:28: Point GetUpperLeft() const { return itsUpperLeft; }29: Point GetLowerLeft() const { return itsLowerLeft; }30: Point GetUpperRight() const { return itsUpperRight; }31: Point GetLowerRight() const { return itsLowerRight; }32:33: void SetUpperLeft(Point Location) {itsUpperLeft = Location;}34: void SetLowerLeft(Point Location) {itsLowerLeft = Location;}35: void SetUpperRight(Point Location) {itsUpperRight = Location;}36: void SetLowerRight(Point Location) {itsLowerRight = Location;}37:38: void SetTop(int top) { itsTop = top; }39: void SetLeft (int left) { itsLeft = left; }40: void SetBottom (int bottom) { itsBottom = bottom; }41: void SetRight (int right) { itsRight = right; }42:43: int GetArea() const;44:45: private:46: Point itsUpperLeft;47: Point itsUpperRight;48: Point itsLowerLeft;49: Point itsLowerRight;50: int itsTop;51: int itsLeft;52: int itsBottom;53: int itsRight;54: };55: // koniec Rect.h

Listing 10.8. Rect.cpp

1: // pocz�tek rect.cpp 2: #include "rect.h" 3: Rectangle::Rectangle(int top, int left, int bottom, int right)

Page 52: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

Klasy, których danymi sk�adowymi s� inne klasy 337

4: { 5: itsTop = top; 6: itsLeft = left; 7: itsBottom = bottom; 8: itsRight = right; 9:10: itsUpperLeft.SetX(left);11: itsUpperLeft.SetY(top);12:13: itsUpperRight.SetX(right);14: itsUpperRight.SetY(top);15:16: itsLowerLeft.SetX(left);17: itsLowerLeft.SetY(bottom);18:19: itsLowerRight.SetX(right);20: itsLowerRight.SetY(bottom);21: }22:23:24: // oblicza obszar prostok�ta przez obliczenie25: // i pomno�enie szeroko�ci i wysoko�ci26: int Rectangle::GetArea() const27: {28: int Width = itsRight-itsLeft;29: int Height = itsTop - itsBottom;30: return (Width * Height);31: }32:33: int main()34: {35: //inicjalizuje lokaln� zmienn� typu Rectangle36: Rectangle MyRectangle (100, 20, 50, 80 );37:38: int Area = MyRectangle.GetArea();39:40: std::cout << "Obszar: " << Area << "\n";41: std::cout << "Wsp. X lewego górnego rogu: ";42: std::cout << MyRectangle.GetUpperLeft().GetX();43: return 0;44: }

Wynik �

Obszar: 3000Wsp. X lewego górnego rogu: 20

Page 53: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

338 Lekcja 10. Klasy i obiekty

Analiza �

Linie od 3. do 14. listingu 10.7 deklaruj� klas� Point (punkt), która s�u�y doprzechowywania wspó�rz�dnych x i y okre�lonego punktu rysunku. W tymprogramie nie wykorzystujemy nale�ycie klasy Point. Jej zastosowania wymagaj�jednak inne metody rysunkowe.

Gdy nadasz klasie nazw� Rectangle, niektóre kompilatory zg�osz� b��d. Wynikato z istnienia wewn�trznej klasy o nazwie Rectangle. W takim przypadku po prostuzmie nazw� klasy na myRectangle.

W deklaracji klasy Point, w liniach 12. i 13., zadeklarowali�my dwie zmiennesk�adowe (itsX oraz itsY). Te zmienne przechowuj� wspó�rz�dne punktu.Zak�adamy, �e wspó�rz�dna x ro�nie w prawo, a wspó�rz�dna y w gór�. Istniej�tak�e inne systemy. W niektórych programach okienkowych wspó�rz�dna y ro�nie„w dó�” okna.

Klasa Point u�ywa akcesorów inline, zwracaj�cych i ustawiaj�cych wspó�rz�dneX i Y punktu. Te akcesory zosta�y zadeklarowane w liniach od 7. do 10. Punktyu�ywaj� konstruktora i destruktora domy�lnego. W zwi�zku z tym ich wspó�rz�dnetrzeba ustawia jawnie.

Linia 17. rozpoczyna deklaracj� klasy Rectangle (prostok�t). Klasa ta sk�ada si�z czterech punktów reprezentuj�cych cztery naro�niki prostok�ta. Konstruktor klasyRectangle (linia 20.) otrzymuje cztery warto�ci ca�kowite, top (górna), left (lewa),bottom (dolna) oraz right (prawa). Do czterech zmiennych sk�adowych (listing10.8) kopiowane s� cztery parametry konstruktora i tworzone s� cztery punkty.

Oprócz standardowych akcesorów, klasa Rectangle posiada funkcj� GetArea()(pobierz obszar), zadeklarowan� w linii 43. Zamiast przechowywa obszarw zmiennej, funkcja GetArea() oblicza go w liniach od 28. do 30. listingu 10.8.W tym celu oblicza szeroko� i wysoko� prostok�ta, nast�pnie mno�y je przez siebie.

Uzyskanie wspó�rz�dnej x lewego górnego wierzcho�ka prostok�ta wymagadost�pu do punktu UpperLeft (lewy górny) i zapytania o jego wspó�rz�dn� X.Poniewa� funkcja GetUpperLeft() jest funkcj� klasy Rectangle, mo�e onabezpo�rednio odwo�ywa si� do prywatnych danych tej klasy, w��cznie ze zmienn�(itsUpperLeft). Poniewa� itsUpperLeft jest obiektem klasy Point, a zmiennaitsX tej klasy jest prywatna, funkcja GetUpperLeft() nie mo�e odwo�ywa si�do niej bezpo�rednio. Zamiast tego, w celu uzyskania tej warto�ci musi u�ypublicznego akcesora GetX().

Page 54: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

Klasy, których danymi sk�adowymi s� inne klasy 339

Linia 33. listingu 10.8 stanowi pocz�tek cia�a programu. Pami� nie jest alokowanaa� do linii 36.; w obszarze tym nic si� nie dzieje. Jedyna rzecz, jak� zrobili�my,to poinformowanie kompilatora, jak ma stworzy punkt i prostok�t (gdybyby�y potrzebne w przysz�o�ci). W linii 36. definiujemy obiekt typu Rectangle,przekazuj�c mu warto�ci top, left, bottom oraz right.

W linii 38. tworzymy lokaln� zmienn� Area (obszar) typu int. Ta zmiennaprzechowuje obszar stworzonego przez nas prostok�ta. Zmienn� Area inicjalizujemyza pomoc� warto�ci zwróconej przez funkcj� GetArea() klasy Rectangle. Klientklasy Rectangle mo�e stworzy obiekt tej klasy i uzyska jego obszar, nie znaj�cnawet implementacji funkcji GetArea().

Plik Rect.h zosta� przedstawiony na listingu 10.7. Obserwuj�c plik nag�ówkowy,który zawiera deklaracj� klasy Rectangle, programista mo�e wysnu wniosek,�e funkcja GetArea() zwraca warto� typu int. Sposób, w jaki funkcja GetArea()uzyskuje t� warto�, nie interesuje klientów klasy Rectangle. Autor klasy Rectanglemóg�by zmieni funkcj� GetArea(); nie wp�yn��oby to na programy, które z niejkorzystaj�, o ile warto�ci� zwrotn� nadal by�aby liczba ca�kowita.

Linia 42. listingu 10.8 mo�e wydawa si� nieco dziwna, ale je�li zastanowisz si� nadtym, co tam si� dzieje, powinna sta si� jasna. W tej linii kodu nast�puje pobraniewspó�rz�dnej x lewego górnego punktu prostok�ta. Wzgl�dem prostok�tawywo�ywana jest metoda GetUpperLeft(), która zwraca obiekt typu Point.Z tego obiektu potrzebujemy wspó�rz�dnej x. Wcze�niej dowiedzia�e� si�,�e akcesorem dla punktu x klasy Point jest GetX(). Dlatego te� w celu pobraniawspó�rz�dnej x lewego górnego naro�nika prostok�ta nale�y u�y akcesora GetX()wzgl�dem funkcji akcesora GetUpperLeft() obiektu MyRectangle. To w�a�nieprzedstawiono w linii 42.:

MyRectangle.GetUpperLeft().GetX();

Cz�sto zadawane pytanie

Jaka jest ró�nica pomi�dzy deklaracj� a definicj�?

Odpowied�

Deklaracja wprowadza now� nazw�, lecz nie alokuje pami�ci; dokonuje tego definicja.

Wszystkie deklaracje (z kilkoma wyj�tkami) s� tak�e definicjami. Najwa�niejszymwyj�tkiem jest deklaracja funkcji globalnej (prototyp) oraz deklaracja klasy (zwyklew pliku nag�ówkowym).

Page 55: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

340 Lekcja 10. Klasy i obiekty

StrukturyBardzo bliskim kuzynem s�owa kluczowego class jest s�owo kluczowe struct,u�ywane do deklarowania struktur. W C++ struktura jest odpowiednikiem klasy,ale wszystkie jej sk�adowe s� domy�lnie publiczne. Mo�esz zadeklarowa struktur�dok�adnie tak, jak klas�; mo�esz zastosowa w niej te same zmienne i funkcjesk�adowe. Gdy przestrzegasz jawnego deklarowania publicznych i prywatnychsekcji klasy, nie ma �adnej ró�nicy pomi�dzy klas� a struktur�. Spróbuj wprowadzido listingu 10.7 nast�puj�ce zmiany:

� w linii 3., zmie� class Point na struct Point,

� w linii 17., zmie� class Rectangle na struct Rectangle.

Nast�pnie skompiluj i uruchom program. Otrzymane wyniki nie powinny si� odsiebie ró�ni.

Prawdopodobnie zastanawiasz si�, dlaczego dwa s�owa kluczowe spe�niaj� t�sam� funkcj�. Przyczyn nale�y szuka w historii j�zyka. J�zyk C++ powstawa�jako rozszerzenie j�zyka C. J�zyk C posiada struktury, ale nie posiadaj� one metod.Bjarne Stroustrup, twórca j�zyka C++, rozbudowa� struktury, ale zmieni� ich nazw�na klasy, odzwierciedlaj�c w ten sposób ich nowe, rozszerzone mo�liwo�ci orazzmian� w domy�lnej dost�pno�ci elementów sk�adowych. To pozwala równie�na u�ywanie w programach C++ ogromnej biblioteki funkcji j�zyka C.

Tak Nie

Umieszczaj deklaracj� klasy w plikunag�ówkowym .h, za� funkcje sk�adowedefiniuj w pliku .cpp.

U�ywaj const wsz�dzie tam, gdziejest to mo�liwe.

Nie przechod� dalej, zanim dok�adnienie zrozumiesz zasady dzia�ania klasy.

PodsumowanieW tej lekcji nauczy�e� si� tworzy nowe typy danych za pomoc� klas. Wiesz tak�e,jak definiowa zmienne tych nowych typów, które nazywamy obiektami.

Klasa mo�e mie dane sk�adowe, którymi s� zmienne ró�nych typów, ��czniez innymi klasami. Poza tym, klasa mo�e zawiera funkcje sk�adowe — nazywanerównie� metodami. Wymienione funkcje sk�adowe s�u�� do manipulowaniadanymi sk�adowymi oraz przeprowadzania innych operacji.

Page 56: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

Pytania i odpowiedzi 341

Elementy sk�adowe klasy, zarówno dane, jak i funkcje, mog� by publiczne b�d�prywatne. Elementy publiczne s� dost�pne w dowolnym miejscu programu.Z kolei elementy prywatne s� dost�pne jedynie dla funkcji sk�adowych danejklasy. Domy�lnie, elementy sk�adowe s� definiowane jako prywatne.

Dobrym nawykiem w programowaniu jest izolowanie interfejsu — inaczejdeklaracji — klasy w pliku nag�ówkowym. Zazwyczaj odbywa si� to poprzezu�ycie pliku z rozszerzeniem .h, a nast�pnie wykorzystanie go w plikach kodu(z rozszerzeniem .cpp) za pomoc� instrukcji include. Implementacja metod klasyznajduje si� w pliku z rozszerzeniem .cpp.

Konstruktory klasy mog� by u�ywane do inicjalizacji danych sk�adowychobiektu. Natomiast destruktory s� wykonywane w trakcie niszczenia obiektu.W destruktorze bardzo cz�sto nast�puje zwolnienie pami�ci i innych zasobów,które mog�y zosta zaalokowane przez metody klasy.

Pytania i odpowiedziPytanie:�Jak�du�y�jest�obiekt�klasy?

Odpowied�: Wielko� obiektu w pami�ci zale�y od wielko�ci jego zmiennychsk�adowych. Metody klasy zu�ywaj� bardzo niewielkie ilo�ci pami�ci, która jestwykorzystywana do przechowywania informacji o po�o�eniu metody (wska�nika).

Niektóre kompilatory umieszczaj� zmienne w pami�ci w taki sposób, �e dwubajtowezmienne zu�ywaj� wi�cej ni� tylko dwa bajty pami�ci. Zajrzyj do dokumentacjiu�ywanego kompilatora, aby to sprawdzi. Jednak na tym etapie nie nale�yprzejmowa si� takimi szczegó�ami.

Pytanie:�Je�eli�zadeklaruj��klas��Cat�wraz�z�prywatnym�elementem�sk�adowymitsAge,�a�nast�pnie�zdefiniuj��dwa�obiekty�Frisky�i�Boots,�czy�obiekt�Bootsb�dzie�mia��dost�p�do�zmiennej�sk�adowej�itsAge�obiektu�Frisky?

Odpowied�: Nie. Ró�ne egzemplarze klasy mog� uzyska dost�p jedynie do danychpublicznych innych egzemplarzy tej klasy. Innymi s�owy, je�eli Frisky i Bootsto egzemplarze klasy Cat, funkcje sk�adowe obiektu Frisky mog� uzyska dost�pdo danych obiektu Frisky, ale ju� nie do danych obiektu Boots.

Pytanie:�Dlaczego�nie�powinienem�definiowa��jako�publicznych�wszystkichdanych�sk�adowych?

Page 57: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

342 Lekcja 10. Klasy i obiekty

Odpowied�: Zdefiniowanie danych sk�adowych jako prywatne umo�liwiaklientowi klasy u�ywanie tych danych bez �adnej zale�no�ci dotycz�cej sposobuich przechowywania b�d� obliczania. Przyk�adowo, je�eli klasa Cat (kot) mametod� GetAge(), klient klasy Cat mo�e zapyta obiekt o wiek kota, nie znaj�ci nie przejmuj�c si� sposobem, w jaki klasa Cat przechowuje ten wiek b�d� jakoblicza go w locie. Oznacza to, �e programista klasy Cat mo�e w przysz�o�ci zmieniprojekt tej klasy bez wymagania od u�ytkowników klasy Cat zmiany ich programów.

Pytanie:�Je�eli�u�ycie�funkcji�const�do�zmiany�klasy�powoduje�b��d�w�trakcie

kompilacji,�to�dlaczego�nie�powinienem�po�prostu�pozby��si��s�ów�kluczowychconst,�by�mie��pewno��,��e�te�b��dy�nie�wyst�pi�?

Odpowied�: Je�eli funkcja sk�adowa nie powinna zmienia klasy, to u�ycie s�owakluczowego const jest dobrym sposobem zagwarantowania, �e kompilatorpomo�e Ci w wykryciu pope�nionych b��dów. Przyk�adowo, funkcja GetAge()mo�e nie mie �adnego powodu do zmiany klasy Cat, ale w implementacji mo�eznajdowa si� poni�sza linia kodu:

if (itsAge = 100) cout << "Hej! Masz 100 lat\n";

Zdefiniowanie funkcji GetAge() jako const powoduje, �e kompilator zg�osi b��dw powy�szej linii kodu. Celem programisty by�o sprawdzenie, czy warto�zmiennej itsAge wynosi 100, ale ten kod przez pomy�k� przypisuje warto� 100zmiennej itsAge. Poniewa� przypisanie powoduje zmian� klasy — a zdefiniowano,�e ta metoda nie powinna modyfikowa klasy — kompilator wychwytuje b��d.

Ten rodzaj b��du mo�e by trudny do wychwycenia poprzez samo przegl�daniekodu. Oko bardzo cz�sto widzi to, co chce zobaczy. Co wa�niejsze, mo�e wydawasi�, �e program dzia�a prawid�owo, cho zmiennej itsAge przypisano niew�a�ciw�warto�. Wcze�niej czy pó�niej to musi spowodowa problemy.

Pytanie:�Czy�istnieje�jakikolwiek�powód�u�ywania�struktury�w�programie�C++?

Odpowied�: Wielu programistów C++ rezerwuje s�owo kluczowe struct dlaklas pozbawionych funkcji. To relikt starych struktur C, które nie mia�y funkcji.Szczerze mówi�c, to myl�ca i kiepska praktyka programistyczna. Dzisiejszastruktura pozbawiona metod jutro mo�e ich potrzebowa. Wówczas b�dzieszzmuszony albo do zmiany na typ class, albo do z�amania regu�y i umieszczeniametod w strukturze. Je�eli musisz wywo�a star� funkcj� j�zyka C wymagaj�c�okre�lonej struktury, jest to jedyny dobry powód jej u�ywania.

Page 58: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

Warsztaty 343

Pytanie:�Niektórzy�programi�ci�pracuj�cy�z�programowaniem�zorientowanymobiektowo�u�ywaj��terminu�tworzenie�egzemplarza.�Co�to�oznacza?

Odpowied�: Tworzenie�egzemplarza to po prostu okre�lenie procesu tworzeniaobiektu na podstawie klasy. Okre�lony obiekt zdefiniowany jako konkretny typklasy to pojedynczy egzemplarz klasy.

WarsztatyWarsztaty zawieraj� pytania w formie quizu, które pomog� Ci w utrwaleniuwiedzy przedstawionej w tej lekcji, a tak�e wiczenia pozwalaj�ce na sprawdzeniestopnia opanowania materia�u. Spróbuj odpowiedzie na pytania i rozwi�za quizprzed sprawdzeniem odpowiedzi w dodatku D. Zanim przejdziesz do kolejnejlekcji, upewnij si� tak�e, �e rozumiesz odpowiedzi.

Quiz 1. Co to jest operator kropki i do czego s�u�y?

2. Co powoduje zarezerwowanie pami�ci — deklaracja czy definicja?

3. Czy deklaracja klasy jest jej interfejsem, czy implementacj�?

4. Jaka jest ró�nica mi�dzy publicznymi i prywatnymi danymi sk�adowymi?

5. Czy funkcja sk�adowa mo�e by prywatna?

6. Czy dana sk�adowa mo�e by publiczna?

7. Je�eli zadeklarujesz dwa obiekty Cat, to czy mog� mie ró�ne warto�ciw swoich elementach sk�adowych itsAge?

8. Czy deklaracje klas s� ko�czone �rednikiem? A definicje metod klasy?

9. Jaki b�dzie nag�ówek funkcji Meow() klasy Cat, je�li nie pobiera onaparametrów i zwraca void?

10. Która funkcja jest wywo�ywana w celu inicjalizacji klasy?

�wiczenia 1. Napisz kod deklaruj�cy klas� o nazwie Employee wraz z nast�puj�cymidanymi sk�adowymi: itsAge, itsYearsOfService oraz itsSalary.

2. Przepisz deklaracj� klasy Employee w taki sposób, aby dane sk�adoweby�y prywatne. Zapewnij publiczne metody akcesorów pozwalaj�ce napobieranie i ustawianie warto�ci ka�dej danej sk�adowej.

Page 59: C++ dla każdego. Wydanie IIpdf.helion.pl/cppint/cppint-10.pdf · Idź do • Spis treści • Przykładowy rozdział • Katalog online • Dodaj do koszyka • Zamów cennik •

344 Lekcja 10. Klasy i obiekty

3. Napisz program u�ywaj�cy klasy Employee, który tworzy dwóchpracowników. Ustaw warto�ci ich danych sk�adowych itsAge,itsYearsOfService i itsSalary, a nast�pnie wy�wietl je. B�dzieszmusia� doda kod tak�e w metodach akcesorów.

4. Kontynuuj�c wiczenie 3., napisz kod dla metody klasy Employee, którejcelem b�dzie podanie zarobków ka�dego pracownika zaokr�glonychdo najbli�szego tysi�ca.

5. Zmie� klas� Employee w taki sposób, aby� móg� zainicjalizowa danesk�adowe itsAge, itsYearsOfService oraz itsSalary w trakcie tworzeniapracownika.

6. owcy�b��dów: Co jest nie tak z poni�sz� deklaracj�?

class Square{ public: int Side;}

7. owcy�b��dów: Dlaczego poni�sza deklaracja nie jest zbyt u�yteczna?

class Cat{ int GetAge() const; private: int itsAge;};

8. owcy�b��dów: Wymie� trzy b��dy w poni�szym kodzie, które powinnyby znalezione przez kompilator.

class TV{ public: void SetStation(int Station); int GetStation() const; private: int itsStation;};main(){ TV myTV; myTV.itsStation = 9; TV.SetStation(10); TV myOtherTv(2);}