SlideShare uma empresa Scribd logo
1 de 46
Baixar para ler offline
IDZ DO
         PRZYK£ADOWY ROZDZIA£

                           SPIS TRE CI   C++. Projektowanie
                                         zorientowane obiektowo.
           KATALOG KSI¥¯EK               Vademecum profesjonalisty
                      KATALOG ONLINE     Autor: Nicolai M. Josuttis
                                         T³umaczenie: Jaromir Senczyk
       ZAMÓW DRUKOWANY KATALOG           ISBN: 83-7361-195-9
                                         Tytu³ orygina³u: Object-Oriented Programming in C++
                                         Format: B5, stron: 560
              TWÓJ KOSZYK
                    DODAJ DO KOSZYKA     C++ jest obecnie wiod¹cym jêzykiem programowania obiektowego. Jego podstawowymi
                                         zaletami w stosunku do innych jêzyków obiektowych jest wysoka efektywno æ
                                         i uniwersalno æ. Stosowany jest do tworzenia komercyjnego oprogramowania oraz
         CENNIK I INFORMACJE             efektywnych rozwi¹zañ z³o¿onych problemów.
                                         Ksi¹¿ka krok po kroku omawia wszystkie w³a ciwo ci jêzyka i wyja nia sposoby ich
                   ZAMÓW INFORMACJE      praktycznego u¿ycia. Przedstawione przyk³ady programów nie s¹ zbyt skomplikowane,
                     O NOWO CIACH        by nie odrywaæ Twojej uwagi od omawianych zagadnieñ, ale nie s¹ te¿ sztucznie
                                         uproszczone. Kluczowym za³o¿eniem jêzyka C++ jest programowanie z wykorzystaniem
                       ZAMÓW CENNIK      szablonów, które umo¿liwiaj¹ tworzenie rozwi¹zañ o wysokim poziomie ogólno ci —
                                         na przyk³ad implementacjê polimorfizmu. Nicolai Josuttis omawia mo¿liwo æ ³¹czenia
                                         szablonów z programowaniem obiektowym, która decyduje o potê¿nych mo¿liwo ciach
                 CZYTELNIA               jêzyka C++ jako narzêdzia tworzenia wydajnych programów. W tym zakresie ksi¹¿ka
                                         wykracza daleko poza podstawy.
          FRAGMENTY KSI¥¯EK ONLINE          • Wprowadzenie do C++ i programowania obiektowego
                                            • Podstawowe pojêcia jêzyka C++
                                            • Programowanie klas
                                            • Dziedziczenie i polimorfizm
                                            • Sk³adowe dynamiczne i statyczne
                                            • Szablony jêzyka C++
                                            • Szczegó³owe omówienie standardowej biblioteki wej cia-wyj cia
                                         Ksi¹¿ka ta jest idealnym podrêcznikiem umo¿liwiaj¹cym studiowanie jêzyka C++
                                         w domowym zaciszu. Prezentuje ona zagadnienia podstawowe, ale w wielu przypadkach
                                         przekracza je dostarczaj¹c prawdziwie profesjonalnej wiedzy.
                                         Wyczerpuj¹cy, szczegó³owy, praktyczny i aktualny podrêcznik programowania w jêzyku C++.
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
5RKU VTG EK
             2TGFOQYC  
4QFKC    1 MUKæ EG  
             1.1. Dlaczego napisałem tę ksią kę?......................................................................................13
             1.2. Wymagania .....................................................................................................................14
             1.3. Organizacja ksią ki.........................................................................................................14
             1.4. W jaki sposób nale y czytać ksią kę? ............................................................................15
             1.5. Przykłady programów i dodatkowe informacje..............................................................15
4QFKC    9RTQYCFGPKG Lú[M %

 K RTQITCOQYCPKG QDKGMVQYG  
             2.1. Język C++ .......................................................................................................................19
                  2.1.1. Kryteria projektowania .........................................................................................19
                  2.1.2. Historia języka ......................................................................................................20
             2.2. C++ jako język programowania obiektowego ................................................................20
                  2.2.1. Obiekty, klasy i instancje......................................................................................21
                  2.2.2. Klasy w języku C++ .............................................................................................23
                  2.2.3. Hermetyzacja danych............................................................................................25
                  2.2.4. Dziedziczenie........................................................................................................27
                  2.2.5. Polimorfizm ..........................................................................................................28
             2.3. Inne koncepcje języka C++.............................................................................................29
                  2.3.1. Obsługa wyjątków ................................................................................................30
                  2.3.2. Szablony................................................................................................................30
                  2.3.3. Przestrzenie nazw..................................................................................................32
             2.4. Terminologia...................................................................................................................32
4QFKC    2QFUVCYQYG RQLúEKC Lú[MC %

  
             3.1. Pierwszy program ...........................................................................................................35
                  3.1.1. „Hello, World!”.....................................................................................................35
                  3.1.2. Komentarze w języku C++ ...................................................................................37
                  3.1.3. Funkcja main() ......................................................................................................37
                  3.1.4. Wejście i wyjście ..................................................................................................39
                  3.1.5. Przestrzenie nazw..................................................................................................40
                  3.1.6. Podsumowanie ......................................................................................................41
             3.2. Typy, operatory i instrukcje sterujące.............................................................................41
                  3.2.1. Pierwszy program, który przeprowadza obliczenia ..............................................41
                  3.2.2. Typy podstawowe .................................................................................................44
4   C++. Programowanie zorientowane obiektowo. Vademecum profesjonalisty


             3.2.3. Operatory ..............................................................................................................48
             3.2.4. Instrukcje sterujące ...............................................................................................54
             3.2.5. Podsumowanie ......................................................................................................57
        3.3. Funkcje i moduły ............................................................................................................58
             3.3.1. Pliki nagłówkowe..................................................................................................58
             3.3.2. Plik źródłowy zawierający definicję.....................................................................60
             3.3.3. Plik źródłowy zawierający wywołanie funkcji .....................................................60
             3.3.4. Kompilacja i konsolidacja.....................................................................................61
             3.3.5. Rozszerzenia nazw plików....................................................................................62
             3.3.6. Systemowe pliki nagłówkowe i biblioteki............................................................63
             3.3.7. Preprocesor ...........................................................................................................63
             3.3.8. Przestrzenie nazw..................................................................................................66
             3.3.9. Słowo kluczowe static...........................................................................................67
             3.3.10. Podsumowanie ....................................................................................................69
        3.4. Łańcuchy znaków ...........................................................................................................70
             3.4.1. Pierwszy przykład programu wykorzystującego łańcuchy znaków .....................70
             3.4.2. Kolejny przykładowy program wykorzystujący łańcuchy znaków ......................74
             3.4.3. Przegląd operacji na łańcuchach znaków .............................................................78
             3.4.4. Łańcuchy znaków i C-łańcuchy............................................................................79
             3.4.5. Podsumowanie ......................................................................................................80
        3.5. Kolekcje ..........................................................................................................................80
             3.5.1. Program wykorzystujący klasę vector ..................................................................81
             3.5.2. Program wykorzystujący klasę deque...................................................................82
             3.5.3. Wektory i kolejki ..................................................................................................83
             3.5.4. Iteratory.................................................................................................................84
             3.5.5. Przykładowy program wykorzystujący listy.........................................................87
             3.5.6. Przykłady programów wykorzystujących kontenery asocjacyjne ........................88
             3.5.7. Algorytmy .............................................................................................................92
             3.5.8. Algorytmy wielozakresowe ..................................................................................96
             3.5.9. Iteratory strumieni.................................................................................................98
             3.5.10. Uwagi końcowe ................................................................................................100
             3.5.11. Podsumowanie ..................................................................................................101
        3.6. Obsługa wyjątków ........................................................................................................102
             3.6.1. Powody wprowadzenia obsługi wyjątków..........................................................102
             3.6.2. Koncepcja obsługi wyjątków..............................................................................104
             3.6.3. Standardowe klasy wyjątków .............................................................................105
             3.6.4. Przykład obsługi wyjątku....................................................................................106
             3.6.5. Obsługa nieoczekiwanych wyjątków..................................................................109
             3.6.6. Funkcje pomocnicze obsługi błędów..................................................................110
             3.6.7. Podsumowanie ....................................................................................................111
        3.7. Wskaźniki, tablice i C-łańcuchy ...................................................................................112
             3.7.1. Wskaźniki ...........................................................................................................112
             3.7.2. Tablice.................................................................................................................115
             3.7.3. C-łańcuchy ..........................................................................................................117
             3.7.4. Podsumowanie ....................................................................................................121
        3.8. Zarządzanie pamięcią za pomocą operatorów new i delete..........................................121
             3.8.1. Operator new.......................................................................................................123
             3.8.2. Operator delete....................................................................................................123
Spis treści                     5


                  3.8.3. Dynamiczne zarządzanie pamięcią tablic ...........................................................124
                  3.8.4. Obsługa błędów związanych z operatorem new.................................................126
                  3.8.5. Podsumowanie ....................................................................................................126
             3.9. Komunikacja ze światem zewnętrznym .......................................................................126
                  3.9.1. Parametry wywołania programu .........................................................................126
                  3.9.2. Dostęp do zmiennych środowiska ......................................................................128
                  3.9.3. Przerwanie działania programu...........................................................................128
                  3.9.4. Wywoływanie innych programów......................................................................129
                  3.9.5. Podsumowanie ....................................................................................................130
4QFKC    2TQITCOQYCPKG MNCU  
             4.1. Pierwsza klasa: Fraction ...............................................................................................131
                  4.1.1. Zanim rozpoczniemy implementację..................................................................131
                  4.1.2. Deklaracja klasy Fraction ...................................................................................134
                  4.1.3. Struktura klasy ....................................................................................................135
                  4.1.4. Funkcje składowe................................................................................................138
                  4.1.5. Konstruktory .......................................................................................................138
                  4.1.6. Przecią enie funkcji ............................................................................................140
                  4.1.7. Implementacja klasy Fraction .............................................................................141
                  4.1.8. Wykorzystanie klasy Fraction.............................................................................146
                  4.1.9. Tworzenie obiektów tymczasowych...................................................................151
                  4.1.10. Notacja UML ....................................................................................................152
                  4.1.11. Podsumowanie ..................................................................................................152
             4.2. Operatory klas...............................................................................................................153
                  4.2.1. Deklaracje operatorów ........................................................................................153
                  4.2.2. Implementacja operatorów..................................................................................156
                  4.2.3. Posługiwanie się operatorami .............................................................................163
                  4.2.4. Operatory globalne..............................................................................................164
                  4.2.5. Ograniczenia w definiowaniu operatorów ..........................................................165
                  4.2.6. Specjalne właściwości niektórych operatorów ...................................................166
                  4.2.7. Podsumowanie ....................................................................................................170
             4.3. Optymalizacja efektywności kodu................................................................................170
                  4.3.1. Wstępna optymalizacja klasy Fraction ...............................................................171
                  4.3.2. Domyślne parametry funkcji...............................................................................174
                  4.3.3. Funkcje rozwijane w miejscu wywołania ...........................................................175
                  4.3.4. Optymalizacja z perspektywy u ytkownika .......................................................177
                  4.3.5. Instrukcja using...................................................................................................178
                  4.3.6. Deklaracje pomiędzy instrukcjami .....................................................................179
                  4.3.7. Konstruktory kopiujące.......................................................................................181
                  4.3.8. Podsumowanie ....................................................................................................182
             4.4. Referencje i stałe...........................................................................................................183
                  4.4.1. Konstruktory kopiujące i przekazywanie parametrów .......................................183
                  4.4.2. Referencje ...........................................................................................................184
                  4.4.3. Stałe.....................................................................................................................187
                  4.4.4. Stałe funkcje składowe .......................................................................................189
                  4.4.5. Klasa Fraction wykorzystująca referencje ..........................................................190
                  4.4.6. Wskaźniki stałych i stałe wskaźniki ...................................................................193
                  4.4.7. Podsumowanie ....................................................................................................195
6       C++. Programowanie zorientowane obiektowo. Vademecum profesjonalisty


             4.5. Strumienie wejścia i wyjścia.........................................................................................196
                  4.5.1. Strumienie ...........................................................................................................196
                  4.5.2. Korzystanie ze strumieni.....................................................................................197
                  4.5.3. Stan strumienia....................................................................................................203
                  4.5.4. Operatory wejścia i wyjścia dla typów definiowanych przez u ytkownika .......205
                  4.5.5. Podsumowanie ....................................................................................................214
             4.6. Klasy zaprzyjaźnione i inne typy..................................................................................214
                  4.6.1. Automatyczna konwersja typów.........................................................................215
                  4.6.2. Słowo kluczowe explicit .....................................................................................217
                  4.6.3. Funkcje zaprzyjaźnione ......................................................................................217
                  4.6.4. Funkcje konwersji...............................................................................................223
                  4.6.5. Problemy automatycznej konwersji typu............................................................225
                  4.6.6. Inne zastosowania słowa kluczowego friend......................................................227
                  4.6.7. Słowo kluczowe friend i programowanie obiektowe..........................................227
                  4.6.8. Podsumowanie ....................................................................................................228
             4.7. Obsługa wyjątków w klasach .......................................................................................229
                  4.7.1. Powody zastosowania obsługi wyjątków w klasie Fraction ...............................229
                  4.7.2. Obsługa wyjątków w klasie Fraction..................................................................230
                  4.7.3. Klasy wyjątków ..................................................................................................237
                  4.7.4. Ponowne wyrzucenie wyjątku ............................................................................237
                  4.7.5. Wyjątki w destruktorach .....................................................................................238
                  4.7.6. Wyjątki i deklaracje interfejsów .........................................................................238
                  4.7.7. Hierarchie klas wyjątków ...................................................................................239
                  4.7.8. Projektowanie klas wyjątków .............................................................................242
                  4.7.9. Wyrzucanie standardowych wyjątków ...............................................................244
                  4.7.10. Bezpieczeństwo wyjątków................................................................................244
                  4.7.11. Podsumowanie ..................................................................................................245
4QFKC    KGFKEGPKG K RQNKOQTHKO 
             5.1. Dziedziczenie pojedyncze.............................................................................................249
                  5.1.1. Klasa Fraction jako klasa bazowa.......................................................................249
                  5.1.2. Klasa pochodna RFraction..................................................................................251
                  5.1.3. Deklaracja klasy pochodnej RFraction ...............................................................253
                  5.1.4. Dziedziczenie i konstruktory ..............................................................................255
                  5.1.5. Implementacja klas pochodnych.........................................................................258
                  5.1.6. Wykorzystanie klasy pochodnej .........................................................................260
                  5.1.7. Konstruktory obiektów klasy bazowej................................................................262
                  5.1.8. Podsumowanie ....................................................................................................264
             5.2. Funkcje wirtualne .........................................................................................................264
                  5.2.1. Problemy z przesłanianiem funkcji.....................................................................265
                  5.2.2. Statyczne i dynamiczne wiązanie funkcji ...........................................................267
                  5.2.3. Przecią enie i przesłanianie ................................................................................271
                  5.2.4. Dostęp do parametrów klasy bazowej ................................................................273
                  5.2.5. Destruktory wirtualne .........................................................................................274
                  5.2.6. Właściwe sposoby stosowania dziedziczenia .....................................................275
                  5.2.7. Inne pułapki przesłaniania funkcji ......................................................................279
                  5.2.8. Dziedziczenie prywatne i deklaracje dostępu .....................................................281
                  5.2.9. Podsumowanie ....................................................................................................284
Spis treści                    7


             5.3. Polimorfizm ..................................................................................................................285
                  5.3.1. Czym jest polimorfizm?......................................................................................285
                  5.3.2. Polimorfizm w języku C++.................................................................................287
                  5.3.3. Przykład polimorfizmu w języku C++................................................................288
                  5.3.4. Abstrakcyjna klasa bazowa GeoObj ...................................................................291
                  5.3.5. Zastosowanie polimorfizmu wewnątrz klas........................................................298
                  5.3.6. Polimorfizm nie wymaga instrukcji wyboru.......................................................304
                  5.3.7. Przywracanie obiektowi jego rzeczywistej klasy ...............................................304
                  5.3.8. Projektowanie przez kontrakt .............................................................................308
                  5.3.9. Podsumowanie ....................................................................................................309
             5.4. Dziedziczenie wielokrotne............................................................................................310
                  5.4.1. Przykład dziedziczenia wielokrotnego ...............................................................310
                  5.4.2. Wirtualne klasy bazowe......................................................................................315
                  5.4.3. Identyczność i adresy..........................................................................................318
                  5.4.4. Wielokrotne dziedziczenie tej samej klasy bazowej...........................................321
                  5.4.5. Podsumowanie ....................................................................................................321
             5.5. Pułapki projektowania z u yciem dziedziczenia ..........................................................322
                  5.5.1. Dziedziczenie kontra zawieranie ........................................................................322
                  5.5.2. Błędy projektowania: ograniczanie dziedziczenia..............................................323
                  5.5.3. Błędy projektowania: dziedziczenie zmieniające wartość..................................324
                  5.5.4. Błędy projektowania: dziedziczenie zmieniające interpretację wartości............326
                  5.5.5. Unikajmy dziedziczenia! ....................................................................................327
                  5.5.6. Podsumowanie ....................................................................................................327
4QFKC    5M CFQYG F[PCOKEPG K UVCV[EPG  
             6.1. Składowe dynamiczne ..................................................................................................329
                  6.1.1. Implementacja klasy String.................................................................................329
                  6.1.2. Konstruktory i składowe dynamiczne.................................................................334
                  6.1.3. Implementacja konstruktora kopiującego ...........................................................336
                  6.1.4. Destruktory .........................................................................................................337
                  6.1.5. Implementacja operatora przypisania .................................................................337
                  6.1.6. Pozostałe operatory.............................................................................................339
                  6.1.7. Wczytywanie łańcucha klasy String ...................................................................341
                  6.1.8. Komercyjne implementacje klasy String ............................................................344
                  6.1.9. Inne zastosowania składowych dynamicznych...................................................346
                  6.1.10. Podsumowanie ..................................................................................................347
             6.2. Inne aspekty składowych dynamicznych......................................................................348
                  6.2.1. Składowe dynamiczne w obiektach stałych........................................................348
                  6.2.2. Funkcje konwersji dla składowych dynamicznych.............................................351
                  6.2.3. Funkcje konwersji i instrukcje warunkowe ........................................................353
                  6.2.4. Stałe jako zmienne ..............................................................................................355
                  6.2.5. Zapobieganie wywołaniu domyślnych operacji..................................................357
                  6.2.6. Klasy zastępcze...................................................................................................358
                  6.2.7. Obsługa wyjątków z u yciem parametrów .........................................................361
                  6.2.8. Podsumowanie ....................................................................................................365
             6.3. Dziedziczenie i klasy o składowych dynamicznych.....................................................365
                  6.3.1. Klasa CPPBook::String jak klasa bazowa ..........................................................365
                  6.3.2 Klasa pochodna ColString ..................................................................................368
                  6.3.3. Dziedziczenie funkcji zaprzyjaźnionych ............................................................371
8       C++. Programowanie zorientowane obiektowo. Vademecum profesjonalisty


                  6.3.4. Plik źródłowy klasy pochodnej ColString ..........................................................373
                  6.3.5. Aplikacja klasy ColString ...................................................................................374
                  6.3.6. Dziedziczenie specjalnych funkcji dla składowych dynamicznych ...................375
                  6.3.7. Podsumowanie ....................................................................................................376
             6.4. Klasy zawierające klasy................................................................................................376
                  6.4.1. Obiekty jako składowe innych klas ....................................................................377
                  6.4.2. Implementacja klasy Person ...............................................................................377
                  6.4.3. Podsumowanie ....................................................................................................383
             6.5. Składowe statyczne i typy pomocnicze ........................................................................383
                  6.5.1. Statyczne składowe klas .....................................................................................384
                  6.5.2. Deklaracje typu wewnątrz klasy .........................................................................389
                  6.5.3. Typy wyliczeniowe jako statyczne stałe klasy ...................................................391
                  6.5.4. Klasy zagnie d one i klasy lokalne ....................................................................392
                  6.5.5. Podsumowanie ....................................................................................................393
4QFKC    5CDNQP[ 
             7.1. Dlaczego szablony? ......................................................................................................395
                  7.1.1. Terminologia.......................................................................................................396
             7.2. Szablony funkcji ...........................................................................................................396
                  7.2.1. Definiowanie szablonów funkcji ........................................................................397
                  7.2.2. Wywoływanie szablonów funkcji.......................................................................398
                  7.2.3. Praktyczne wskazówki dotyczące u ywania szablonów ....................................399
                  7.2.4. Szablony i automatyczna konwersja typu...........................................................399
                  7.2.5. Przecią anie szablonów ......................................................................................400
                  7.2.6. Zmienne lokalne..................................................................................................402
                  7.2.7. Podsumowanie ....................................................................................................402
             7.3. Szablony klas ................................................................................................................403
                  7.3.1. Implementacja szablonu klasy Stack ..................................................................403
                  7.3.2. Zastosowanie szablonu klasy Stack ....................................................................406
                  7.3.3. Specjalizacja szablonów klas..............................................................................408
                  7.3.4. Domyślne parametry szablonu............................................................................410
                  7.3.5. Podsumowanie ....................................................................................................412
             7.4. Inne parametry szablonów ............................................................................................412
                  7.4.1. Przykład zastosowania innych parametrów szablonów......................................412
                  7.4.2. Ograniczenia parametrów szablonów .................................................................415
                  7.4.3. Podsumowanie ....................................................................................................416
             7.5. Inne zagadnienia związane z szablonami .....................................................................416
                  7.5.1. Słowo kluczowe typename .................................................................................416
                  7.5.2. Składowe jako szablony......................................................................................417
                  7.5.3. Polimorfizm statyczny z u yciem szablonów.....................................................420
                  7.5.4. Podsumowanie ....................................................................................................424
             7.6. Szablony w praktyce .....................................................................................................424
                  7.6.1. Kompilacja kodu szablonu..................................................................................424
                  7.6.2. Obsługa błędów ..................................................................................................429
                  7.6.3. Podsumowanie ....................................................................................................430
4QFKC    5VCPFCTFQYC DKDNKQVGMC YGL EKC K Y[L EKC Y UEGIÎ CEJ  
             8.1. Standardowe klasy strumieni ........................................................................................433
                  8.1.1. Klasy strumieni i obiekty strumieni....................................................................434
                  8.1.2. Stan strumienia....................................................................................................436
Spis treści                    9


                  8.1.3. Operatory standardowe .......................................................................................439
                  8.1.4. Funkcje standardowe ..........................................................................................440
                  8.1.5. Manipulatory.......................................................................................................443
                  8.1.6. Definicje formatu ................................................................................................445
                  8.1.7. Internacjonalizacja ..............................................................................................455
                  8.1.8. Podsumowanie ....................................................................................................458
             8.2. Dostęp do plików ..........................................................................................................458
                  8.2.1. Klasy strumieni dla plików .................................................................................458
                  8.2.2. Wykorzystanie klas strumieni plików.................................................................459
                  8.2.3. Znaczniki plików ................................................................................................461
                  8.2.4. Jawne otwieranie i zamykanie plików ................................................................462
                  8.2.5. Swobodny dostęp do plików...............................................................................463
                  8.2.6. Przekierowanie standardowych kanałów do plików...........................................466
                  8.2.7. Podsumowanie ....................................................................................................467
             8.3. Klasy strumieni łańcuchów...........................................................................................467
                  8.3.1. Klasy strumieni łańcuchów.................................................................................468
                  8.3.2. Operator rzutowania leksykalnego .....................................................................470
                  8.3.3. Strumienie C-łańcuchów.....................................................................................472
                  8.3.4. Podsumowanie ....................................................................................................474
4QFKC    +PPG Y C EKYQ EK Lú[MC 
             9.1. Dodatkowe informacje o bibliotece standardowej........................................................475
                  9.1.1. Operacje na wektorach........................................................................................475
                  9.1.2. Operacje wspólne dla wszystkich kontenerów STL ...........................................482
                  9.1.3. Algorytmy STL...................................................................................................482
                  9.1.4. Ograniczenia wartości numerycznych ................................................................488
                  9.1.5. Podsumowanie ....................................................................................................492
             9.2. Definiowanie specjalnych operatorów..........................................................................493
                  9.2.1. Inteligentne wskaźniki ........................................................................................493
                  9.2.2. Obiekty funkcji ...................................................................................................496
                  9.2.3. Podsumowanie ....................................................................................................500
             9.3. Inne aspekty operatorów new i delete...........................................................................500
                  9.3.1. Operatory new i delete, które nie wyrzucają wyjątków......................................500
                  9.3.2. Określanie poło enia obiektu..............................................................................501
                  9.3.3. Funkcje obsługi operatora new ...........................................................................501
                  9.3.4. Przecią anie operatorów new i delete.................................................................506
                  9.3.5. Dodatkowe parametry operatora new .................................................................509
                  9.3.6. Podsumowanie ....................................................................................................510
             9.4. Wskaźniki funkcji i wskaźniki składowych..................................................................510
                  9.4.1. Wskaźniki funkcji ...............................................................................................510
                  9.4.2. Wskaźniki składowych .......................................................................................511
                  9.4.3. Wskaźniki składowych i zewnętrzne interfejsy..................................................514
                  9.4.4. Podsumowanie ....................................................................................................515
             9.5. Łączenie programów w językach C i C++....................................................................516
                  9.5.1. Łączenie zewnętrzne...........................................................................................516
                  9.5.2. Pliki nagłówkowe w językach C i C++ ..............................................................517
                  9.5.3. Kompilacja funkcji main()..................................................................................517
                  9.5.4. Podsumowanie ....................................................................................................518
10          C++. Programowanie zorientowane obiektowo. Vademecum profesjonalisty


                  9.6. Dodatkowe słowa kluczowe .........................................................................................518
                       9.6.1. Unie.....................................................................................................................518
                       9.6.2. Typy wyliczeniowe.............................................................................................519
                       9.6.3. Słowo kluczowe volatile .....................................................................................520
                       9.6.4. Podsumowanie ....................................................................................................520
4QFKC  2QFUWOQYCPKG 
                  10.1. Hierarchia operatorów języka C++.............................................................................521
                  10.2. Właściwości operacji klas...........................................................................................523
                  10.3. Zasady automatycznej konwersji typów.....................................................................524
                  10.4. Przydatne zasady programowania i projektowania ....................................................525
QFCVGM #         $KDNKQITCHKC  
QFCVGM $         5 QYPKM  
                  5MQTQYKF
Rozdział 7.
5CDNQP[
             W rozdziale tym przedstawiona zostanie koncepcja szablonów. Szablony umo liwiają
             parametryzację kodu dla ró nych typów. Dzięki temu na przykład funkcja wyznaczają-
             ca najmniejszą wartość lub klasa kolekcji mo e zostać zaimplementowana, zanim usta-
             lony zostanie typ parametru funkcji lub elementu kolekcji. Kod generowany na podsta-
             wie szablonu nie przetwarza jednak dowolnych typów: w momencie, gdy ustalony
             zostanie typ parametru. Obowiązuje równie zwykła kontrola zgodności typów.

             Najpierw przedstawione zostaną szablony funkcji, a następnie szablony klas. Omówie-
             nie szablonów zakończymy przedstawieniem sposobów ich wykorzystania, w tym spe-
             cjalnych technik projektowania.

             Więcej informacji na temat szablonów mo na znaleźć w ksią ce C++ Templates — The
             Complete Guide1, której autorami są Nicolai M. Josuttis i David Vandevoorde (patrz
             VandevoordeJosuttisTemplate). Ksią ka ta zawiera podobne wprowadzenie do proble-
             matyki szablonów, wyczerpujący opis szablonów, szeregu technik kodowania i zaawan-
             sowanych zastosowań szablonów.


 NCEGIQ UCDNQP[!
             W językach programowania, które wią ą zmienne z określonym typem danych, często
             pojawia się sytuacja wymagająca wielokrotnego zdefiniowania tej samej funkcji dla
             ró nych typów parametrów. Typowym przykładem jest funkcja zwracająca większą
             z przekazanych jej dwóch wartości. Musi ona zostać zaimplementowana osobno dla
             ka dego typu, dla którego chcemy ja wykorzystywać. W języku C mo na tego uniknąć,
             posługując się makrodefinicją. Poniewa działanie makrodefinicji polega na mecha-
             nicznym zastępowaniu przez preprocesor jednego tekstu programu innym, rozwiązanie
             takie nie jest zalecane (ze względu na brak kontroli zgodności typów, mo liwość wy-
             stąpienia efektów ubocznych, etc.).

             Nie tylko wielokrotna implementacja funkcji wymaga dodatkowej pracy. Podobna sytu-
             acja występuje w przypadku implementacji zaawansowanych typów, takich jak konte-
             nery. Zarządzanie kolekcją elementów kontenera wymaga implementacji szeregu funkcji,

1
    C++. Szablony. Vademecum profesjonalisty, Helion 2003.
396    C++. Programowanie zorientowane obiektowo. Vademecum profesjonalisty


       w przypadku których istotny jest przede wszystkim typ elementu kolekcji. Gdyby nie
       mo liwość wykorzystania specjalnych właściwości języka C++, wszystkie te funkcje
       musiałyby być implementowane za ka dym razem, gdy pojawia się nowy typ elemen-
       tów kolekcji.

       Stos jest typowym przykładem, w którym pojawia się wiele implementacji słu ących
       zarządzaniu ró nymi obiektami. Stos umo liwia przechowywanie i usuwanie elemen-
       tów konkretnego typu. Jeśli stosowalibyśmy poznane dotychczas konstrukcje języka
       C++, zmuszeni bylibyśmy implementować jego operacje osobno dla ka dego typu ele-
       mentów, które mogą być umieszczone na stosie, poniewa deklaracja stosu wymaga
       podania typu jego elementów. Te same operacje musielibyśmy więc implementować
       wielokrotnie, mimo, e rzeczywisty algorytm nie ulega zmianie. Nie tylko wymaga to
       dodatkowej pracy, ale mo e stać się tak e źródłem błędów.

       Dlatego te w języku C++ wprowadzono szablony. Szablony reprezentują funkcje bądź
       klasy, które nie zostały zaimplementowane dla konkretnego typu, poniewa typ ten zo-
       stanie dopiero zdefiniowany. Aby u yć szablonu funkcji lub klasy, programista aplika-
       cji musi określić typ, dla którego dany szablom zostanie zrealizowany. Wystarczy więc,
        e funkcja wyznaczająca większą z dwóch wartości zostanie zaimplementowana tylko
       raz — jako szablon. Podobnie kontenery, takie jak stosy, listy itp., wymagają tylko jed-
       nokrotnego zaimplementowania i przetestowania, a następnie mogą być wykorzystywane
       dla dowolnego typu elementów, który umo liwia przeprowadzanie odpowiednich operacji.

       Sposoby definiowania i posługiwania się szablonami zostaną wyjaśnione poni ej, naj-
       pierw dla funkcji na przykładzie funkcji OCZ
, a następnie dla klas, na przykładzie stosu.


 6GTOKPQNQIKC
       Terminologia związana z szablonami nie jest ściśle zdefiniowana. Na przykład funkcja,
       której typ został sparametryzowany, nazywana jest czasami szablonem funkcji, a innym
       razem funkcją szablonu. Poniewa drugie z tych określeń jest nieco mylące (mo e okre-
       ślać szablon funkcji, ale tak e funkcję nie związaną z szablonem), powinno się raczej
       u ywać określenia szablon funkcji. Podobnie klasa sparametryzowana ze względu na
       typ powinna być nazywana szablonem klasy, a nie klasą szablonu.

       Proces, w którym przez podstawienie do szablonu wartości parametru powstaje zwykła
       klasa, funkcja lub funkcja składowa, nazywany jest tworzeniem instancji szablonu. Nie-
       stety, termin „tworzenie instancji” u ywany jest tak e w terminologii obiektowej dla
       określenia tworzenia obiektu danej klasy. Dlatego te znaczenie terminu „tworzenie in-
       stancji” zale y w przypadku języka C++ od kontekstu, w którym zostaje on u yty.


 5CDNQP[ HWPMELK
       Jak ju wspomnieliśmy, szablony funkcji umo liwiają definiowanie grup funkcji, które
       mogą następnie zostać u yte dla ró nych typów.
Rozdział 7.   Szablony        397


       W przeciwieństwie do działania makrodefinicji, działanie szablonów nie polega na me-
       chanicznym zastępowaniu tekstów. Semantyka funkcji zostaje sprawdzona przez kom-
       pilator, co pozwala zapobiec niepo ądanym efektom ubocznym. Nie istnieje na przy-
       kład (tak jak w przypadku makrodefinicji) niebezpieczeństwo wielokrotnego zastąpienia
       parametru P

, na skutek którego pojedyncza instrukcja inkrementacji staje się wielo-
       krotną inkrementacją.


 GHKPKQYCPKG UCDNQPÎY HWPMELK
       Szablony funkcji definiowane są jak zwykłe funkcje, a parametryzowany typ poprzedza
       ich deklarację. Na przykład szablon funkcji wyznaczającej większą z dwóch wartości
       zostanie zadeklarowany w następujący sposób:
        VGORNCVG V[RGPCOG 6
        EQPUV 6 OCZ
EQPUV 6  EQPUV 6 

       W pierwszym wierszu zadeklarowany został parametr typu 6. Słowo kluczowe V[RGPCOG
       oznacza, e następujący po nim symbol reprezentuje typ. Słowo to zostało wprowadzone
       w języku C++ stosunkowo późno. Wcześniej u ywano zamiast niego słowa kluczowego
       ENCUU:
        VGORNCVG ENCUU 6

       Pomiędzy słowami tymi nie ma ró nic semantycznych. U ycie słowa kluczowego ENCUU
       nie wymaga, by parametryzowany typ był klasą. U ywając obu słów kluczowych mo-
        emy korzystać z dowolnych typów (podstawowych, klas etc.) pod warunkiem, e
       umo liwiają one wykonywanie operacji u ywanych przez szablon. W naszym przykła-
       dzie dla typu 6 musi być zdefiniowany operator porównania (), którego u ywa imple-
       mentacja szablonu funkcji OCZ
.

       Zastosowanie symbolu 6 dla typu szablonu nie jest wymagane, ale w praktyce bywa
       często stosowane. W poni szej deklaracji symbol 6 u ywany jest w celu określenie typu
       funkcji oraz typu jej parametrów:
         VORNOCZJRR
        VGORNCVG V[RGPCOG 6
        EQPUV 6 OCZ
EQPUV 6 C EQPUV 6 D
        ]
            TGVWTP C D ! C  D
        _

       Instrukcje umieszczone w ciele szablonu nie ró nią się niczym od instrukcji zwykłej
       implementacji funkcji. W powy szym przykładzie porównywane są dwie wartości typu
       6 i zwracana jest większa z nich. Zastosowanie referencji stałych (EQPUV 6 ) zapobiega
       tworzeniu kopii parametrów funkcji i wartości zwracanych przez funkcję (patrz podroz-
       dział 4.4).
398          C++. Programowanie zorientowane obiektowo. Vademecum profesjonalisty



 9[YQ [YCPKG UCDNQPÎY HWPMELK
             Szablonu funkcji u ywamy w taki sam sposób, jak zwykłej funkcji. Demonstruje to po-
             ni szy program2:
                VORNOCZERR
                KPENWFG KQUVTGCO
                KPENWFG UVTKPI
                KPENWFG OCZJRR

               KPV OCKP

               ]
                   KPV         C D  FYKG OKGPPG V[RW KPV
                   UVFUVTKPI U V  FYKG OKGPPG V[RW UVFUVTKPI
                   
                   UVFEQWV  OCZ
CD  UVFGPFN    OCZ
 FNC FYÎEJ YCTVQ EK EC MQYKV[EJ
                   UVFEQWV  OCZ
UV  UVFGPFN  OCZ
 FNC FYÎEJ C EWEJÎY
               _

             Dopiero w momencie, gdy funkcja OCZ
 zostaje wywołana dla dwóch obiektów takiego
             samego typu, szablon staje się rzeczywistym kodem. Kompilator wykorzystuje definicję
             szablonu i tworzy jego instancję, zastępując typ 6 typem KPV lub UVFUVTKPI. W ten
             sposób tworzony jest rzeczywisty kod implementacji dla typu KPV bądź typu UVF
             UVTKPI. Szablony nie są więc kompilowane jako kod, który mo e działać z dowolnym
             typem danych, lecz jedynie wykorzystywane w celu wygenerowania kodu dla konkret-
             nego typu. Jeśli szablon OCZ
 zostanie wywołany dla siedmiu ró nych typów, to skom-
             pilowanych zostanie siedem funkcji.

             Proces, w którym na podstawie szablonu generowany jest kod, który zostanie skompi-
             lowany, nazywany jest tworzeniem instancji lub, precyzyjniej (ze względu na zastoso-
             wanie określenia „tworzenie instancji” w terminologii obiektowej), tworzeniem instan-
             cji szablonu.

             Utworzenie instancji szablonu jest oczywiście mo liwe tylko wtedy, gdy dla danego typu
             zdefiniowane są wszystkie operacje u ywane przez szablon. Aby mo liwe było utwo-
             rzenie instancji szablonu OCZ
 dla typu UVFUVTKPI, w klasie UVFUVTKPI musi być
             zdefiniowany operator porównania ().

             Zauwa my, e w przeciwieństwie do działania makrodefinicji, działanie szablonów nie
             polega na zastępowaniu tekstów. Wywołanie
               OCZ
Z
nie jest mo e szczególnie u yteczne, ale będzie działać poprawnie. Zwróci większą
             wartość jednego z przekazanych jej wyra eń, a ka de z wyra eń wartościowane będzie
             tylko raz (czyli zmienna Z będzie inkrementowana jeden raz).



2
    Wywołanie szablonu OCZ
 dla typu string zostało jawnie poprzedzone operatorem globalnego zakresu,
    poniewa w standardowej bibliotece zdefiniowana jest funkcja UVFOCZ
. Poniewa typ UVTKPI równie
    znajduje się w przestrzeni nazw UVF, to funkcja OCZ
 nie poprzedzona operatorem zakresu zostałaby
    odnaleziona właśnie w tej przestrzeni (patrz „Wyszukiwanie Koeniga”, str. 179).
Rozdział 7.    Szablony         399



 2TCMV[EPG YUMCÎYMK FQV[EæEG W [YCPKC UCDNQPÎY
       Koncepcja szablonów wykracza poza zwykły model kompilacji (konsolidacji), wyko-
       rzystujący odrębne jednostki translacji. Nie mo na na przykład umieścić szablonów
       w osobnym module i skompilować go, a następnie osobno skompilować aplikacji u y-
       wającej tych szablonów i skonsolidować oba uzyskane pliki wynikowe. Nie jest to
       mo liwe, poniewa typ, dla którego ma zostać u yty szablon, zostaje określony dopiero
       w momencie u ycia szablonu.

       Istnieją ró ne sposoby rozwiązania tego problemu. Najprostszy i najbardziej uniwersalny
       polega na umieszczeniu całego kodu szablonu w pliku nagłówkowym. Dołączając na-
       stępnie zawartości pliku nagłówkowego do kodu aplikacji umo liwiamy generację
       i kompilację kodu dla konkretnych typów.

       Nieprzypadkowo więc definicja szablonu OCZ
 z poprzedniego przykładu została
       umieszczona w pliku nagłówkowym. Nale y przy tym zauwa yć, e słowo kluczowe
       KPNKPG (patrz podrozdział 4.3.3) nie musi być zastosowane. W przypadku szablonów
       dopuszczalne jest istnienie wielu definicji w ró nych jednostkach translacji. Jeśli jednak
       preferujemy rozwijanie szablonu funkcji w miejscu jego wywołania, powinniśmy zasy-
       gnalizować to kompilatorowi właśnie za pomocą słowa kluczowego KPNKPG.

       Więcej zagadnień związanych z posługiwaniem się szablonami zostanie omówionych
       w podrozdziale 7.6.

 5CDNQP[ K CWVQOCV[EPC MQPYGTULC V[RW
       Podczas tworzenia instancji szablonu nie jest brana pod uwagę automatyczna konwersja
       typu. Jeśli szablon posiada wiele parametrów typu 6, przekazane mu argumenty muszą
       być tego samego typu. Wywołanie szablonu OCZ
 dla obiektów ró nych typów nie jest
       więc mo liwe:
        VGORNCVG V[RGPCOG 6
        EQPUV 6 OCZ
EQPUV 6  EQPUV   QDC RCTCOGVT[ OCLæ V[R 6
        
        KPV K
        NQPI N
        
        OCZ
KN  $ ä OKGPPG K QTC N RQUKCFCLæ TÎ PG V[R[


       ,CYPC MYCNKHKMCELC
       Wywołując szablon mo emy zastosować jawną kwalifikację typu, dla którego zostanie
       on u yty:
        OCZNQPI 
K N  Y[YQ CPKG UCDNQPW OCZ
 FNC V[RW NQPI

       W tym przypadku tworzona jest instancja szablonu funkcji OCZ
 dla typu NQPI jako pa-
       rametru 6 szablonu. Następnie, podobnie jak w przypadku zwykłych funkcji, kompilator
       sprawdza, czy przekazane parametry mogą być u yte jako wartości typu NQPI, co jest
       mo liwe w naszym przykładzie ze względu na istnienie domyślnej konwersji typu KPV
       do typu NQPI.
400    C++. Programowanie zorientowane obiektowo. Vademecum profesjonalisty


       5CDNQP[ Q YKGNW RCTCOGVTCEJ
       Szablon mo e zostać zdefiniowany tak e dla ró nych typów:
        VGORNCVG V[RGPCOG 6 V[RGPCOG 6
        KPNKPG 6 OCZ
EQPUV 6  EQPUV 6 
        ]
            TGVWTP C  D ! D  C
        _
        
        KPV K
        NQPI N
        
        OCZ
KN  YTCEC YCTVQ è V[RW KPV

       Problemem w tym przypadku jest typ wartości zwracanej przez funkcję, poniewa
       w momencie definiowania szablonu nie wiemy, który z parametrów zostanie zwrócony.
       Dodatkowo, jeśli zwrócony będzie drugi parametr, dla wartości zwracanej utworzony
       zostanie lokalny obiekt tymczasowy, poniewa posiada ona inny typ. Obiekt tymczaso-
       wy nie mo e zostać zwrócony przez referencję, wobec czego typ zwracany przez sza-
       blon został zmieniony z EQPUV 6 na 6.

       W takim przypadku lepszym rozwiązaniem jest mo liwość jawnej kwalifikacji.

 2TGEKæ CPKG UCDNQPÎY
       Szablony mogą być przecią ane dla pewnych typów. W ten sposób ogólna implementa-
       cja szablonu mo e zostać zastąpiona inną implementacją dla konkretnych typów. Roz-
       wiązanie takie posiada szereg zalet:
          Szablony funkcji mogą zostać zdefiniowane dla dodatkowych typów oraz ich
          kombinacji (na przykład mo e zostać zdefiniowana funkcja OCZ
 o parametrach
          typu HNQCV i %22$QQM(TCEVKQP).
          Implementacje mogą zostać zoptymalizowane dla konkretnych typów.
          Typy, dla których implementacja szablonu nie jest odpowiednia, mogą zostać
          właściwie obsłu one.

       Wywołanie szablonu OCZ
 dla C-łańcuchów (typ EQPUV EJCT
) spowoduje błąd:
        EQPUV EJCT
U
        EQPUV EJCT
U
        
        EQPUV EJCT
OCZUVTKPI  OCZ
UU  $ ä RQTÎYPWLG CFTGU[

       Implementacja szablonu porówna w tym przypadku adresy C-łańcuchów zamiast ich
       zawartości (patrz podrozdział 3.7.3).

       Problem ten mo emy rozwiązać poprzez przecią enie szablonu dla C-łańcuchów:
        KPNKPG EQPUV EJCT
OCZ 
EQPUV EJCT
C EQPUV EJCT
D
        ]
            TGVWTP UVFUVTEOR
CD  ! C  D
        _
Rozdział 7.   Szablony   401


Przecią enie szablonu mo e tak e dotyczyć wskaźników. Mo emy w ten sposób sprawić,
 e jeśli szablon OCZ
 zostanie wywołany dla wskaźników, porównane zostaną wska-
zywane przez nie obiekty, a nie ich adresy. Na przykład:
 VGORNCVG V[RGPCOG 6
 6
EQPUV OCZ 
6
EQPUV C 6
EQPUV D
 ]
     TGVWTP
C
D ! C  D
 _

Zwróćmy uwagę, e jeśli wskaźnik ma zostać przekazany jako stała referencja, słowo
kluczowe EQPUV musi zostać umieszczone po znaku gwiazdki. W przeciwnym razie za-
deklarowany zostanie wskaźnik do stałej (patrz tak e podrozdział 4.4.6).

Przecią ając szablony funkcji powinniśmy wprowadzać jedynie niezbędne modyfikacje,
takie jak zmiany liczby parametrów czy jawne ich określenie. W przeciwnym razie
wprowadzone zmiany mogą stać się powodem powstawania nieoczekiwanych efektów.
Dlatego te w naszym przykładzie argumenty wszystkich przecią onych implementacji
powinny być przekazywane poprzez stałe referencje:
  VORNOCZERR
  KPENWFG KQUVTGCO
  KPENWFG EUVTKPI

  YTCEC YKúMUæ  FYÎEJ YCTVQ EK FQYQNPGIQ V[RW
 VGORNCVG V[RGPCOG 6
 KPNKPG EQPUV 6 OCZ 
EQPUV 6 C EQPUV 6 D
 ]
     UVFEQWV  OCZ 
 FNC 6  UVFGPFN
     TGVWTP C  D ! D  C
 _

  FNC FYÎEJ YUMC PKMÎY
 VGORNCVG V[RGPCOG 6
 KPNKPG 6
EQPUV OCZ 
6
EQPUV C 6
EQPUV D
 ]
     UVFEQWV  OCZ 
 FNC 6
UVFGPFN
     TGVWTP
C
D ! D  C
 _

  FNC FYÎEJ % C EWEJÎY
 KPNKPG EQPUV EJCT
EQPUV OCZ 
EQPUV   EJCT
EQPUV C
                               EQPUV   EJCT
EQPUV D
 ]
     UVFEQWV  OCZ 
 FNC EJCT
UVFGPFN
     TGVWTP UVFUVTEOR
CD   !     D  C
 _

Wykonanie przedstawionego poni ej programu:
  VORNOCZERR
  KPENWFG KQUVTGCO
  KPENWFG UVTKPI
  KPENWFG OCZJRR

 KPV OCKP
402    C++. Programowanie zorientowane obiektowo. Vademecum profesjonalisty


        ]
             KPV C                               FYKG OKGPPG V[RW KPV
             KPV D
             UVFEQWV  OCZ
CD  UVFGPFN    OCZ
 FNC FYÎEJ CTIWOGPVÎY V[RW KPV

             UVFUVTKPI U JGNNQ                  FYC C EWEJ[
             UVFUVTKPI V JQNNC 
             UVFEQWV  OCZ
UV  UVFGPFN  OCZ
 FNC FYÎEJ CTIWOGPVÎY V[RW UVTKPI

             KPV
R  D                            FYC YUMC PKMK
             KPV
R  C
             UVFEQWV
OCZ
RR  UVFGPFN  OCZ
 FNC FYÎEJ YUMC PKMÎY

             EQPUV EJCT
U  JGNNQ                FYC % C EWEJ[
             EQPUV EJCT
U  QVVQ 
             UVFEQWV  OCZ
UU  UVFGPFN  OCZ
 FNC FYÎEJ % C EWEJÎY
        _

       spowoduje wyświetlenie następujących napisów:
        OCZ 
   FNC 6
        
        OCZ 
   FNC 6
        JQNNC
        OCZ 
   FNC 6
OCZ 
   FNC EJCT

Mais conteúdo relacionado

Mais procurados

C++. 50 efektywnych sposobów na udoskonalenie Twoich programów
C++. 50 efektywnych sposobów na udoskonalenie Twoich programówC++. 50 efektywnych sposobów na udoskonalenie Twoich programów
C++. 50 efektywnych sposobów na udoskonalenie Twoich programówWydawnictwo Helion
 
C++. Kruczki i fortele w programowaniu
C++. Kruczki i fortele w programowaniuC++. Kruczki i fortele w programowaniu
C++. Kruczki i fortele w programowaniuWydawnictwo Helion
 
Język C++. Koncepcje i techniki programowania
Język C++. Koncepcje i techniki programowaniaJęzyk C++. Koncepcje i techniki programowania
Język C++. Koncepcje i techniki programowaniaWydawnictwo Helion
 
Aplikacje w Visual C++ 2005. Przykłady
Aplikacje w Visual C++ 2005. PrzykładyAplikacje w Visual C++ 2005. Przykłady
Aplikacje w Visual C++ 2005. PrzykładyWydawnictwo Helion
 
C++. Potęga języka. Od przykładu do przykładu
C++. Potęga języka. Od przykładu do przykładuC++. Potęga języka. Od przykładu do przykładu
C++. Potęga języka. Od przykładu do przykładuWydawnictwo Helion
 
Wyjątkowy język C++. 40 nowych łamigłówek, zadań programistycznych i rozwiązań
Wyjątkowy język C++. 40 nowych łamigłówek, zadań programistycznych i rozwiązańWyjątkowy język C++. 40 nowych łamigłówek, zadań programistycznych i rozwiązań
Wyjątkowy język C++. 40 nowych łamigłówek, zadań programistycznych i rozwiązańWydawnictwo Helion
 
C++Builder. Kompendium programisty
C++Builder. Kompendium programistyC++Builder. Kompendium programisty
C++Builder. Kompendium programistyWydawnictwo Helion
 
C++Builder i Turbo C++. Podstawy
C++Builder i Turbo C++. PodstawyC++Builder i Turbo C++. Podstawy
C++Builder i Turbo C++. PodstawyWydawnictwo Helion
 
Język Cg. Programowanie grafiki w czasie rzeczywistym
Język Cg. Programowanie grafiki w czasie rzeczywistymJęzyk Cg. Programowanie grafiki w czasie rzeczywistym
Język Cg. Programowanie grafiki w czasie rzeczywistymWydawnictwo Helion
 
Język C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistówJęzyk C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistówWydawnictwo Helion
 
Programowanie. Koncepcje, techniki i modele
Programowanie. Koncepcje, techniki i modeleProgramowanie. Koncepcje, techniki i modele
Programowanie. Koncepcje, techniki i modeleWydawnictwo Helion
 

Mais procurados (20)

C++. 50 efektywnych sposobów na udoskonalenie Twoich programów
C++. 50 efektywnych sposobów na udoskonalenie Twoich programówC++. 50 efektywnych sposobów na udoskonalenie Twoich programów
C++. 50 efektywnych sposobów na udoskonalenie Twoich programów
 
C++. Kruczki i fortele w programowaniu
C++. Kruczki i fortele w programowaniuC++. Kruczki i fortele w programowaniu
C++. Kruczki i fortele w programowaniu
 
C++. Styl programowania
C++. Styl programowaniaC++. Styl programowania
C++. Styl programowania
 
C# i .NET
C# i .NETC# i .NET
C# i .NET
 
Język C++. Koncepcje i techniki programowania
Język C++. Koncepcje i techniki programowaniaJęzyk C++. Koncepcje i techniki programowania
Język C++. Koncepcje i techniki programowania
 
Aplikacje w Visual C++ 2005. Przykłady
Aplikacje w Visual C++ 2005. PrzykładyAplikacje w Visual C++ 2005. Przykłady
Aplikacje w Visual C++ 2005. Przykłady
 
Visual C# .NET. Encyklopedia
Visual C# .NET. EncyklopediaVisual C# .NET. Encyklopedia
Visual C# .NET. Encyklopedia
 
C#. Programowanie
C#. ProgramowanieC#. Programowanie
C#. Programowanie
 
C++. Potęga języka. Od przykładu do przykładu
C++. Potęga języka. Od przykładu do przykładuC++. Potęga języka. Od przykładu do przykładu
C++. Potęga języka. Od przykładu do przykładu
 
C++. Sztuka programowania
C++. Sztuka programowaniaC++. Sztuka programowania
C++. Sztuka programowania
 
Wyjątkowy język C++. 40 nowych łamigłówek, zadań programistycznych i rozwiązań
Wyjątkowy język C++. 40 nowych łamigłówek, zadań programistycznych i rozwiązańWyjątkowy język C++. 40 nowych łamigłówek, zadań programistycznych i rozwiązań
Wyjątkowy język C++. 40 nowych łamigłówek, zadań programistycznych i rozwiązań
 
C++ bez obaw
C++ bez obawC++ bez obaw
C++ bez obaw
 
C#. Wzorce projektowe
C#. Wzorce projektoweC#. Wzorce projektowe
C#. Wzorce projektowe
 
C++Builder. Kompendium programisty
C++Builder. Kompendium programistyC++Builder. Kompendium programisty
C++Builder. Kompendium programisty
 
C++Builder i Turbo C++. Podstawy
C++Builder i Turbo C++. PodstawyC++Builder i Turbo C++. Podstawy
C++Builder i Turbo C++. Podstawy
 
Język Cg. Programowanie grafiki w czasie rzeczywistym
Język Cg. Programowanie grafiki w czasie rzeczywistymJęzyk Cg. Programowanie grafiki w czasie rzeczywistym
Język Cg. Programowanie grafiki w czasie rzeczywistym
 
Język C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistówJęzyk C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistów
 
Programowanie. Koncepcje, techniki i modele
Programowanie. Koncepcje, techniki i modeleProgramowanie. Koncepcje, techniki i modele
Programowanie. Koncepcje, techniki i modele
 
Programowanie. Od podstaw
Programowanie. Od podstawProgramowanie. Od podstaw
Programowanie. Od podstaw
 
C# i ASP.NET. Szybki start
C# i ASP.NET. Szybki startC# i ASP.NET. Szybki start
C# i ASP.NET. Szybki start
 

Destaque

Sound Blaster Live! Przewodnik po karcie dźwiękowej
Sound Blaster Live! Przewodnik po karcie dźwiękowejSound Blaster Live! Przewodnik po karcie dźwiękowej
Sound Blaster Live! Przewodnik po karcie dźwiękowejWydawnictwo Helion
 
DirectX. Rendering w czasie rzeczywistym
DirectX. Rendering w czasie rzeczywistymDirectX. Rendering w czasie rzeczywistym
DirectX. Rendering w czasie rzeczywistymWydawnictwo Helion
 
C++ Builder. Symulacje komputerowe
C++ Builder. Symulacje komputeroweC++ Builder. Symulacje komputerowe
C++ Builder. Symulacje komputeroweWydawnictwo Helion
 
Bezpieczeństwo w sieciach Windows
Bezpieczeństwo w sieciach WindowsBezpieczeństwo w sieciach Windows
Bezpieczeństwo w sieciach WindowsWydawnictwo Helion
 
Delphi 7. Ćwiczenia zaawansowane
Delphi 7. Ćwiczenia zaawansowaneDelphi 7. Ćwiczenia zaawansowane
Delphi 7. Ćwiczenia zaawansowaneWydawnictwo Helion
 
Oracle9i. Administrowanie bazami danych od podstaw
Oracle9i. Administrowanie bazami danych od podstawOracle9i. Administrowanie bazami danych od podstaw
Oracle9i. Administrowanie bazami danych od podstawWydawnictwo Helion
 
20150429 - Rola architekta korporacyjnego w instytucji publicznej - M. Bukows...
20150429 - Rola architekta korporacyjnego w instytucji publicznej - M. Bukows...20150429 - Rola architekta korporacyjnego w instytucji publicznej - M. Bukows...
20150429 - Rola architekta korporacyjnego w instytucji publicznej - M. Bukows...Michal Bukowski, MBA, P2P
 
Windows XP PL. Ćwiczenia zaawansowane
Windows XP PL. Ćwiczenia zaawansowaneWindows XP PL. Ćwiczenia zaawansowane
Windows XP PL. Ćwiczenia zaawansowaneWydawnictwo Helion
 
Książka multimedialna - korzyści i zagrożenia
Książka multimedialna -  korzyści i zagrożeniaKsiążka multimedialna -  korzyści i zagrożenia
Książka multimedialna - korzyści i zagrożeniaBeata Taraszkiewicz
 
Prezentacja dla rad_osiedli
Prezentacja dla rad_osiedliPrezentacja dla rad_osiedli
Prezentacja dla rad_osiedliCentrum OPUS
 
Raport - sytuacja finansowa szpitali
Raport - sytuacja finansowa szpitaliRaport - sytuacja finansowa szpitali
Raport - sytuacja finansowa szpitaliŁukasz Konopko
 
Procenty
ProcentyProcenty
Procentyjaga12
 
Znieczulenie do ciecia cesarskiego
Znieczulenie do ciecia cesarskiegoZnieczulenie do ciecia cesarskiego
Znieczulenie do ciecia cesarskiegoPolanest
 
Kobiety w zarządzaniu i czynniki ich sukcesów
Kobiety w zarządzaniu i czynniki ich sukcesówKobiety w zarządzaniu i czynniki ich sukcesów
Kobiety w zarządzaniu i czynniki ich sukcesówwshwroclaw
 

Destaque (20)

AutoCAD 2004
AutoCAD 2004AutoCAD 2004
AutoCAD 2004
 
Sound Blaster Live! Przewodnik po karcie dźwiękowej
Sound Blaster Live! Przewodnik po karcie dźwiękowejSound Blaster Live! Przewodnik po karcie dźwiękowej
Sound Blaster Live! Przewodnik po karcie dźwiękowej
 
DirectX. Rendering w czasie rzeczywistym
DirectX. Rendering w czasie rzeczywistymDirectX. Rendering w czasie rzeczywistym
DirectX. Rendering w czasie rzeczywistym
 
C++ Builder. Symulacje komputerowe
C++ Builder. Symulacje komputeroweC++ Builder. Symulacje komputerowe
C++ Builder. Symulacje komputerowe
 
AutoCAD 2004. Pierwsze kroki
AutoCAD 2004. Pierwsze krokiAutoCAD 2004. Pierwsze kroki
AutoCAD 2004. Pierwsze kroki
 
Bezpieczeństwo w sieciach Windows
Bezpieczeństwo w sieciach WindowsBezpieczeństwo w sieciach Windows
Bezpieczeństwo w sieciach Windows
 
AutoCAD 2004 PL
AutoCAD 2004 PLAutoCAD 2004 PL
AutoCAD 2004 PL
 
Delphi 7. Ćwiczenia zaawansowane
Delphi 7. Ćwiczenia zaawansowaneDelphi 7. Ćwiczenia zaawansowane
Delphi 7. Ćwiczenia zaawansowane
 
Oracle9i. Administrowanie bazami danych od podstaw
Oracle9i. Administrowanie bazami danych od podstawOracle9i. Administrowanie bazami danych od podstaw
Oracle9i. Administrowanie bazami danych od podstaw
 
20150429 - Rola architekta korporacyjnego w instytucji publicznej - M. Bukows...
20150429 - Rola architekta korporacyjnego w instytucji publicznej - M. Bukows...20150429 - Rola architekta korporacyjnego w instytucji publicznej - M. Bukows...
20150429 - Rola architekta korporacyjnego w instytucji publicznej - M. Bukows...
 
Windows XP PL. Ćwiczenia zaawansowane
Windows XP PL. Ćwiczenia zaawansowaneWindows XP PL. Ćwiczenia zaawansowane
Windows XP PL. Ćwiczenia zaawansowane
 
Książka multimedialna - korzyści i zagrożenia
Książka multimedialna -  korzyści i zagrożeniaKsiążka multimedialna -  korzyści i zagrożenia
Książka multimedialna - korzyści i zagrożenia
 
Prezentacja dla rad_osiedli
Prezentacja dla rad_osiedliPrezentacja dla rad_osiedli
Prezentacja dla rad_osiedli
 
Dostęp do informacji publicznej
Dostęp do informacji publicznejDostęp do informacji publicznej
Dostęp do informacji publicznej
 
Raport - sytuacja finansowa szpitali
Raport - sytuacja finansowa szpitaliRaport - sytuacja finansowa szpitali
Raport - sytuacja finansowa szpitali
 
Procenty
ProcentyProcenty
Procenty
 
Austria - edukacja i religia
Austria - edukacja i religiaAustria - edukacja i religia
Austria - edukacja i religia
 
Znieczulenie do ciecia cesarskiego
Znieczulenie do ciecia cesarskiegoZnieczulenie do ciecia cesarskiego
Znieczulenie do ciecia cesarskiego
 
Uwolnij pewność siebie
Uwolnij pewność siebieUwolnij pewność siebie
Uwolnij pewność siebie
 
Kobiety w zarządzaniu i czynniki ich sukcesów
Kobiety w zarządzaniu i czynniki ich sukcesówKobiety w zarządzaniu i czynniki ich sukcesów
Kobiety w zarządzaniu i czynniki ich sukcesów
 

Semelhante a C++. Programowanie zorientowane obiektowo. Vademecum profesjonalisty

Język C++. Szkoła programowania. Wydanie V
Język C++. Szkoła programowania. Wydanie VJęzyk C++. Szkoła programowania. Wydanie V
Język C++. Szkoła programowania. Wydanie VWydawnictwo Helion
 
RS 232C - praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Wy...
RS 232C - praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Wy...RS 232C - praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Wy...
RS 232C - praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Wy...Wydawnictwo Helion
 
Język C. Wskaźniki. Vademecum profesjonalisty
Język C. Wskaźniki. Vademecum profesjonalistyJęzyk C. Wskaźniki. Vademecum profesjonalisty
Język C. Wskaźniki. Vademecum profesjonalistyWydawnictwo Helion
 
C++ Builder 6. Vademecum profesjonalisty
C++ Builder 6. Vademecum profesjonalistyC++ Builder 6. Vademecum profesjonalisty
C++ Builder 6. Vademecum profesjonalistyWydawnictwo Helion
 
Struktura organizacyjna i architektura systemów komputerowych
Struktura organizacyjna i architektura systemów komputerowychStruktura organizacyjna i architektura systemów komputerowych
Struktura organizacyjna i architektura systemów komputerowychWydawnictwo Helion
 
Visual C++ 2005 Express Edition. Tworzenie aplikacji dla Windows
Visual C++ 2005 Express Edition. Tworzenie aplikacji dla WindowsVisual C++ 2005 Express Edition. Tworzenie aplikacji dla Windows
Visual C++ 2005 Express Edition. Tworzenie aplikacji dla WindowsWydawnictwo Helion
 
Programowanie w języku C. FAQ
Programowanie w języku C. FAQProgramowanie w języku C. FAQ
Programowanie w języku C. FAQWydawnictwo Helion
 
Programowanie obiektowe w Visual Basic .NET dla każdego
Programowanie obiektowe w Visual Basic .NET dla każdegoProgramowanie obiektowe w Visual Basic .NET dla każdego
Programowanie obiektowe w Visual Basic .NET dla każdegoWydawnictwo Helion
 
Język C++. Standardy kodowania. 101 zasad, wytycznych i zalecanych praktyk
Język C++. Standardy kodowania. 101 zasad, wytycznych i zalecanych praktykJęzyk C++. Standardy kodowania. 101 zasad, wytycznych i zalecanych praktyk
Język C++. Standardy kodowania. 101 zasad, wytycznych i zalecanych praktykWydawnictwo Helion
 
C++ dla programistów gier. Wydanie II
C++ dla programistów gier. Wydanie IIC++ dla programistów gier. Wydanie II
C++ dla programistów gier. Wydanie IIWydawnictwo Helion
 
Więcej niż architektura oprogramowania
Więcej niż architektura oprogramowaniaWięcej niż architektura oprogramowania
Więcej niż architektura oprogramowaniaWydawnictwo Helion
 

Semelhante a C++. Programowanie zorientowane obiektowo. Vademecum profesjonalisty (14)

Język C++. Szkoła programowania. Wydanie V
Język C++. Szkoła programowania. Wydanie VJęzyk C++. Szkoła programowania. Wydanie V
Język C++. Szkoła programowania. Wydanie V
 
RS 232C - praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Wy...
RS 232C - praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Wy...RS 232C - praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Wy...
RS 232C - praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Wy...
 
Język C. Wskaźniki. Vademecum profesjonalisty
Język C. Wskaźniki. Vademecum profesjonalistyJęzyk C. Wskaźniki. Vademecum profesjonalisty
Język C. Wskaźniki. Vademecum profesjonalisty
 
C++ Builder 6. Vademecum profesjonalisty
C++ Builder 6. Vademecum profesjonalistyC++ Builder 6. Vademecum profesjonalisty
C++ Builder 6. Vademecum profesjonalisty
 
Struktura organizacyjna i architektura systemów komputerowych
Struktura organizacyjna i architektura systemów komputerowychStruktura organizacyjna i architektura systemów komputerowych
Struktura organizacyjna i architektura systemów komputerowych
 
ABC Delphi 2006
ABC Delphi 2006ABC Delphi 2006
ABC Delphi 2006
 
Visual C++ 2005 Express Edition. Tworzenie aplikacji dla Windows
Visual C++ 2005 Express Edition. Tworzenie aplikacji dla WindowsVisual C++ 2005 Express Edition. Tworzenie aplikacji dla Windows
Visual C++ 2005 Express Edition. Tworzenie aplikacji dla Windows
 
Programowanie w języku C. FAQ
Programowanie w języku C. FAQProgramowanie w języku C. FAQ
Programowanie w języku C. FAQ
 
C++Builder 6 i bazy danych
C++Builder 6 i bazy danychC++Builder 6 i bazy danych
C++Builder 6 i bazy danych
 
Programowanie obiektowe w Visual Basic .NET dla każdego
Programowanie obiektowe w Visual Basic .NET dla każdegoProgramowanie obiektowe w Visual Basic .NET dla każdego
Programowanie obiektowe w Visual Basic .NET dla każdego
 
C#. Ćwiczenia
C#. ĆwiczeniaC#. Ćwiczenia
C#. Ćwiczenia
 
Język C++. Standardy kodowania. 101 zasad, wytycznych i zalecanych praktyk
Język C++. Standardy kodowania. 101 zasad, wytycznych i zalecanych praktykJęzyk C++. Standardy kodowania. 101 zasad, wytycznych i zalecanych praktyk
Język C++. Standardy kodowania. 101 zasad, wytycznych i zalecanych praktyk
 
C++ dla programistów gier. Wydanie II
C++ dla programistów gier. Wydanie IIC++ dla programistów gier. Wydanie II
C++ dla programistów gier. Wydanie II
 
Więcej niż architektura oprogramowania
Więcej niż architektura oprogramowaniaWięcej niż architektura oprogramowania
Więcej niż architektura oprogramowania
 

Mais de Wydawnictwo Helion

Tworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyTworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyWydawnictwo Helion
 
Blog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikBlog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikWydawnictwo Helion
 
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktycznePozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczneWydawnictwo Helion
 
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesieE-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesieWydawnictwo Helion
 
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsMicrosoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsWydawnictwo Helion
 
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IICo potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IIWydawnictwo Helion
 
Makrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuMakrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuWydawnictwo Helion
 
Java. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIJava. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIWydawnictwo Helion
 
Ajax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningAjax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningWydawnictwo Helion
 
PowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykPowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykWydawnictwo Helion
 
Serwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaSerwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaWydawnictwo Helion
 

Mais de Wydawnictwo Helion (20)

Tworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyTworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. Projekty
 
Blog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikBlog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnik
 
Access w biurze i nie tylko
Access w biurze i nie tylkoAccess w biurze i nie tylko
Access w biurze i nie tylko
 
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktycznePozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
 
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesieE-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
 
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsMicrosoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
 
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IICo potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
 
Makrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuMakrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółu
 
Windows PowerShell. Podstawy
Windows PowerShell. PodstawyWindows PowerShell. Podstawy
Windows PowerShell. Podstawy
 
Java. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIJava. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie II
 
JavaScript. Pierwsze starcie
JavaScript. Pierwsze starcieJavaScript. Pierwsze starcie
JavaScript. Pierwsze starcie
 
Ajax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningAjax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny trening
 
PowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykPowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktyk
 
Excel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktykExcel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktyk
 
Access 2007 PL. Seria praktyk
Access 2007 PL. Seria praktykAccess 2007 PL. Seria praktyk
Access 2007 PL. Seria praktyk
 
Word 2007 PL. Seria praktyk
Word 2007 PL. Seria praktykWord 2007 PL. Seria praktyk
Word 2007 PL. Seria praktyk
 
Serwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaSerwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacja
 
AutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PLAutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PL
 
Bazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcieBazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcie
 
Inventor. Pierwsze kroki
Inventor. Pierwsze krokiInventor. Pierwsze kroki
Inventor. Pierwsze kroki
 

C++. Programowanie zorientowane obiektowo. Vademecum profesjonalisty

  • 1. IDZ DO PRZYK£ADOWY ROZDZIA£ SPIS TRE CI C++. Projektowanie zorientowane obiektowo. KATALOG KSI¥¯EK Vademecum profesjonalisty KATALOG ONLINE Autor: Nicolai M. Josuttis T³umaczenie: Jaromir Senczyk ZAMÓW DRUKOWANY KATALOG ISBN: 83-7361-195-9 Tytu³ orygina³u: Object-Oriented Programming in C++ Format: B5, stron: 560 TWÓJ KOSZYK DODAJ DO KOSZYKA C++ jest obecnie wiod¹cym jêzykiem programowania obiektowego. Jego podstawowymi zaletami w stosunku do innych jêzyków obiektowych jest wysoka efektywno æ i uniwersalno æ. Stosowany jest do tworzenia komercyjnego oprogramowania oraz CENNIK I INFORMACJE efektywnych rozwi¹zañ z³o¿onych problemów. Ksi¹¿ka krok po kroku omawia wszystkie w³a ciwo ci jêzyka i wyja nia sposoby ich ZAMÓW INFORMACJE praktycznego u¿ycia. Przedstawione przyk³ady programów nie s¹ zbyt skomplikowane, O NOWO CIACH by nie odrywaæ Twojej uwagi od omawianych zagadnieñ, ale nie s¹ te¿ sztucznie uproszczone. Kluczowym za³o¿eniem jêzyka C++ jest programowanie z wykorzystaniem ZAMÓW CENNIK szablonów, które umo¿liwiaj¹ tworzenie rozwi¹zañ o wysokim poziomie ogólno ci — na przyk³ad implementacjê polimorfizmu. Nicolai Josuttis omawia mo¿liwo æ ³¹czenia szablonów z programowaniem obiektowym, która decyduje o potê¿nych mo¿liwo ciach CZYTELNIA jêzyka C++ jako narzêdzia tworzenia wydajnych programów. W tym zakresie ksi¹¿ka wykracza daleko poza podstawy. FRAGMENTY KSI¥¯EK ONLINE • Wprowadzenie do C++ i programowania obiektowego • Podstawowe pojêcia jêzyka C++ • Programowanie klas • Dziedziczenie i polimorfizm • Sk³adowe dynamiczne i statyczne • Szablony jêzyka C++ • Szczegó³owe omówienie standardowej biblioteki wej cia-wyj cia Ksi¹¿ka ta jest idealnym podrêcznikiem umo¿liwiaj¹cym studiowanie jêzyka C++ w domowym zaciszu. Prezentuje ona zagadnienia podstawowe, ale w wielu przypadkach przekracza je dostarczaj¹c prawdziwie profesjonalnej wiedzy. Wyczerpuj¹cy, szczegó³owy, praktyczny i aktualny podrêcznik programowania w jêzyku C++. Wydawnictwo Helion ul. Chopina 6 44-100 Gliwice tel. (32)230-98-63 e-mail: helion@helion.pl
  • 2. 5RKU VTG EK 2TGFOQYC 4QFKC 1 MUKæ EG 1.1. Dlaczego napisałem tę ksią kę?......................................................................................13 1.2. Wymagania .....................................................................................................................14 1.3. Organizacja ksią ki.........................................................................................................14 1.4. W jaki sposób nale y czytać ksią kę? ............................................................................15 1.5. Przykłady programów i dodatkowe informacje..............................................................15 4QFKC 9RTQYCFGPKG Lú[M % K RTQITCOQYCPKG QDKGMVQYG 2.1. Język C++ .......................................................................................................................19 2.1.1. Kryteria projektowania .........................................................................................19 2.1.2. Historia języka ......................................................................................................20 2.2. C++ jako język programowania obiektowego ................................................................20 2.2.1. Obiekty, klasy i instancje......................................................................................21 2.2.2. Klasy w języku C++ .............................................................................................23 2.2.3. Hermetyzacja danych............................................................................................25 2.2.4. Dziedziczenie........................................................................................................27 2.2.5. Polimorfizm ..........................................................................................................28 2.3. Inne koncepcje języka C++.............................................................................................29 2.3.1. Obsługa wyjątków ................................................................................................30 2.3.2. Szablony................................................................................................................30 2.3.3. Przestrzenie nazw..................................................................................................32 2.4. Terminologia...................................................................................................................32 4QFKC 2QFUVCYQYG RQLúEKC Lú[MC % 3.1. Pierwszy program ...........................................................................................................35 3.1.1. „Hello, World!”.....................................................................................................35 3.1.2. Komentarze w języku C++ ...................................................................................37 3.1.3. Funkcja main() ......................................................................................................37 3.1.4. Wejście i wyjście ..................................................................................................39 3.1.5. Przestrzenie nazw..................................................................................................40 3.1.6. Podsumowanie ......................................................................................................41 3.2. Typy, operatory i instrukcje sterujące.............................................................................41 3.2.1. Pierwszy program, który przeprowadza obliczenia ..............................................41 3.2.2. Typy podstawowe .................................................................................................44
  • 3. 4 C++. Programowanie zorientowane obiektowo. Vademecum profesjonalisty 3.2.3. Operatory ..............................................................................................................48 3.2.4. Instrukcje sterujące ...............................................................................................54 3.2.5. Podsumowanie ......................................................................................................57 3.3. Funkcje i moduły ............................................................................................................58 3.3.1. Pliki nagłówkowe..................................................................................................58 3.3.2. Plik źródłowy zawierający definicję.....................................................................60 3.3.3. Plik źródłowy zawierający wywołanie funkcji .....................................................60 3.3.4. Kompilacja i konsolidacja.....................................................................................61 3.3.5. Rozszerzenia nazw plików....................................................................................62 3.3.6. Systemowe pliki nagłówkowe i biblioteki............................................................63 3.3.7. Preprocesor ...........................................................................................................63 3.3.8. Przestrzenie nazw..................................................................................................66 3.3.9. Słowo kluczowe static...........................................................................................67 3.3.10. Podsumowanie ....................................................................................................69 3.4. Łańcuchy znaków ...........................................................................................................70 3.4.1. Pierwszy przykład programu wykorzystującego łańcuchy znaków .....................70 3.4.2. Kolejny przykładowy program wykorzystujący łańcuchy znaków ......................74 3.4.3. Przegląd operacji na łańcuchach znaków .............................................................78 3.4.4. Łańcuchy znaków i C-łańcuchy............................................................................79 3.4.5. Podsumowanie ......................................................................................................80 3.5. Kolekcje ..........................................................................................................................80 3.5.1. Program wykorzystujący klasę vector ..................................................................81 3.5.2. Program wykorzystujący klasę deque...................................................................82 3.5.3. Wektory i kolejki ..................................................................................................83 3.5.4. Iteratory.................................................................................................................84 3.5.5. Przykładowy program wykorzystujący listy.........................................................87 3.5.6. Przykłady programów wykorzystujących kontenery asocjacyjne ........................88 3.5.7. Algorytmy .............................................................................................................92 3.5.8. Algorytmy wielozakresowe ..................................................................................96 3.5.9. Iteratory strumieni.................................................................................................98 3.5.10. Uwagi końcowe ................................................................................................100 3.5.11. Podsumowanie ..................................................................................................101 3.6. Obsługa wyjątków ........................................................................................................102 3.6.1. Powody wprowadzenia obsługi wyjątków..........................................................102 3.6.2. Koncepcja obsługi wyjątków..............................................................................104 3.6.3. Standardowe klasy wyjątków .............................................................................105 3.6.4. Przykład obsługi wyjątku....................................................................................106 3.6.5. Obsługa nieoczekiwanych wyjątków..................................................................109 3.6.6. Funkcje pomocnicze obsługi błędów..................................................................110 3.6.7. Podsumowanie ....................................................................................................111 3.7. Wskaźniki, tablice i C-łańcuchy ...................................................................................112 3.7.1. Wskaźniki ...........................................................................................................112 3.7.2. Tablice.................................................................................................................115 3.7.3. C-łańcuchy ..........................................................................................................117 3.7.4. Podsumowanie ....................................................................................................121 3.8. Zarządzanie pamięcią za pomocą operatorów new i delete..........................................121 3.8.1. Operator new.......................................................................................................123 3.8.2. Operator delete....................................................................................................123
  • 4. Spis treści 5 3.8.3. Dynamiczne zarządzanie pamięcią tablic ...........................................................124 3.8.4. Obsługa błędów związanych z operatorem new.................................................126 3.8.5. Podsumowanie ....................................................................................................126 3.9. Komunikacja ze światem zewnętrznym .......................................................................126 3.9.1. Parametry wywołania programu .........................................................................126 3.9.2. Dostęp do zmiennych środowiska ......................................................................128 3.9.3. Przerwanie działania programu...........................................................................128 3.9.4. Wywoływanie innych programów......................................................................129 3.9.5. Podsumowanie ....................................................................................................130 4QFKC 2TQITCOQYCPKG MNCU 4.1. Pierwsza klasa: Fraction ...............................................................................................131 4.1.1. Zanim rozpoczniemy implementację..................................................................131 4.1.2. Deklaracja klasy Fraction ...................................................................................134 4.1.3. Struktura klasy ....................................................................................................135 4.1.4. Funkcje składowe................................................................................................138 4.1.5. Konstruktory .......................................................................................................138 4.1.6. Przecią enie funkcji ............................................................................................140 4.1.7. Implementacja klasy Fraction .............................................................................141 4.1.8. Wykorzystanie klasy Fraction.............................................................................146 4.1.9. Tworzenie obiektów tymczasowych...................................................................151 4.1.10. Notacja UML ....................................................................................................152 4.1.11. Podsumowanie ..................................................................................................152 4.2. Operatory klas...............................................................................................................153 4.2.1. Deklaracje operatorów ........................................................................................153 4.2.2. Implementacja operatorów..................................................................................156 4.2.3. Posługiwanie się operatorami .............................................................................163 4.2.4. Operatory globalne..............................................................................................164 4.2.5. Ograniczenia w definiowaniu operatorów ..........................................................165 4.2.6. Specjalne właściwości niektórych operatorów ...................................................166 4.2.7. Podsumowanie ....................................................................................................170 4.3. Optymalizacja efektywności kodu................................................................................170 4.3.1. Wstępna optymalizacja klasy Fraction ...............................................................171 4.3.2. Domyślne parametry funkcji...............................................................................174 4.3.3. Funkcje rozwijane w miejscu wywołania ...........................................................175 4.3.4. Optymalizacja z perspektywy u ytkownika .......................................................177 4.3.5. Instrukcja using...................................................................................................178 4.3.6. Deklaracje pomiędzy instrukcjami .....................................................................179 4.3.7. Konstruktory kopiujące.......................................................................................181 4.3.8. Podsumowanie ....................................................................................................182 4.4. Referencje i stałe...........................................................................................................183 4.4.1. Konstruktory kopiujące i przekazywanie parametrów .......................................183 4.4.2. Referencje ...........................................................................................................184 4.4.3. Stałe.....................................................................................................................187 4.4.4. Stałe funkcje składowe .......................................................................................189 4.4.5. Klasa Fraction wykorzystująca referencje ..........................................................190 4.4.6. Wskaźniki stałych i stałe wskaźniki ...................................................................193 4.4.7. Podsumowanie ....................................................................................................195
  • 5. 6 C++. Programowanie zorientowane obiektowo. Vademecum profesjonalisty 4.5. Strumienie wejścia i wyjścia.........................................................................................196 4.5.1. Strumienie ...........................................................................................................196 4.5.2. Korzystanie ze strumieni.....................................................................................197 4.5.3. Stan strumienia....................................................................................................203 4.5.4. Operatory wejścia i wyjścia dla typów definiowanych przez u ytkownika .......205 4.5.5. Podsumowanie ....................................................................................................214 4.6. Klasy zaprzyjaźnione i inne typy..................................................................................214 4.6.1. Automatyczna konwersja typów.........................................................................215 4.6.2. Słowo kluczowe explicit .....................................................................................217 4.6.3. Funkcje zaprzyjaźnione ......................................................................................217 4.6.4. Funkcje konwersji...............................................................................................223 4.6.5. Problemy automatycznej konwersji typu............................................................225 4.6.6. Inne zastosowania słowa kluczowego friend......................................................227 4.6.7. Słowo kluczowe friend i programowanie obiektowe..........................................227 4.6.8. Podsumowanie ....................................................................................................228 4.7. Obsługa wyjątków w klasach .......................................................................................229 4.7.1. Powody zastosowania obsługi wyjątków w klasie Fraction ...............................229 4.7.2. Obsługa wyjątków w klasie Fraction..................................................................230 4.7.3. Klasy wyjątków ..................................................................................................237 4.7.4. Ponowne wyrzucenie wyjątku ............................................................................237 4.7.5. Wyjątki w destruktorach .....................................................................................238 4.7.6. Wyjątki i deklaracje interfejsów .........................................................................238 4.7.7. Hierarchie klas wyjątków ...................................................................................239 4.7.8. Projektowanie klas wyjątków .............................................................................242 4.7.9. Wyrzucanie standardowych wyjątków ...............................................................244 4.7.10. Bezpieczeństwo wyjątków................................................................................244 4.7.11. Podsumowanie ..................................................................................................245 4QFKC KGFKEGPKG K RQNKOQTHKO 5.1. Dziedziczenie pojedyncze.............................................................................................249 5.1.1. Klasa Fraction jako klasa bazowa.......................................................................249 5.1.2. Klasa pochodna RFraction..................................................................................251 5.1.3. Deklaracja klasy pochodnej RFraction ...............................................................253 5.1.4. Dziedziczenie i konstruktory ..............................................................................255 5.1.5. Implementacja klas pochodnych.........................................................................258 5.1.6. Wykorzystanie klasy pochodnej .........................................................................260 5.1.7. Konstruktory obiektów klasy bazowej................................................................262 5.1.8. Podsumowanie ....................................................................................................264 5.2. Funkcje wirtualne .........................................................................................................264 5.2.1. Problemy z przesłanianiem funkcji.....................................................................265 5.2.2. Statyczne i dynamiczne wiązanie funkcji ...........................................................267 5.2.3. Przecią enie i przesłanianie ................................................................................271 5.2.4. Dostęp do parametrów klasy bazowej ................................................................273 5.2.5. Destruktory wirtualne .........................................................................................274 5.2.6. Właściwe sposoby stosowania dziedziczenia .....................................................275 5.2.7. Inne pułapki przesłaniania funkcji ......................................................................279 5.2.8. Dziedziczenie prywatne i deklaracje dostępu .....................................................281 5.2.9. Podsumowanie ....................................................................................................284
  • 6. Spis treści 7 5.3. Polimorfizm ..................................................................................................................285 5.3.1. Czym jest polimorfizm?......................................................................................285 5.3.2. Polimorfizm w języku C++.................................................................................287 5.3.3. Przykład polimorfizmu w języku C++................................................................288 5.3.4. Abstrakcyjna klasa bazowa GeoObj ...................................................................291 5.3.5. Zastosowanie polimorfizmu wewnątrz klas........................................................298 5.3.6. Polimorfizm nie wymaga instrukcji wyboru.......................................................304 5.3.7. Przywracanie obiektowi jego rzeczywistej klasy ...............................................304 5.3.8. Projektowanie przez kontrakt .............................................................................308 5.3.9. Podsumowanie ....................................................................................................309 5.4. Dziedziczenie wielokrotne............................................................................................310 5.4.1. Przykład dziedziczenia wielokrotnego ...............................................................310 5.4.2. Wirtualne klasy bazowe......................................................................................315 5.4.3. Identyczność i adresy..........................................................................................318 5.4.4. Wielokrotne dziedziczenie tej samej klasy bazowej...........................................321 5.4.5. Podsumowanie ....................................................................................................321 5.5. Pułapki projektowania z u yciem dziedziczenia ..........................................................322 5.5.1. Dziedziczenie kontra zawieranie ........................................................................322 5.5.2. Błędy projektowania: ograniczanie dziedziczenia..............................................323 5.5.3. Błędy projektowania: dziedziczenie zmieniające wartość..................................324 5.5.4. Błędy projektowania: dziedziczenie zmieniające interpretację wartości............326 5.5.5. Unikajmy dziedziczenia! ....................................................................................327 5.5.6. Podsumowanie ....................................................................................................327 4QFKC 5M CFQYG F[PCOKEPG K UVCV[EPG 6.1. Składowe dynamiczne ..................................................................................................329 6.1.1. Implementacja klasy String.................................................................................329 6.1.2. Konstruktory i składowe dynamiczne.................................................................334 6.1.3. Implementacja konstruktora kopiującego ...........................................................336 6.1.4. Destruktory .........................................................................................................337 6.1.5. Implementacja operatora przypisania .................................................................337 6.1.6. Pozostałe operatory.............................................................................................339 6.1.7. Wczytywanie łańcucha klasy String ...................................................................341 6.1.8. Komercyjne implementacje klasy String ............................................................344 6.1.9. Inne zastosowania składowych dynamicznych...................................................346 6.1.10. Podsumowanie ..................................................................................................347 6.2. Inne aspekty składowych dynamicznych......................................................................348 6.2.1. Składowe dynamiczne w obiektach stałych........................................................348 6.2.2. Funkcje konwersji dla składowych dynamicznych.............................................351 6.2.3. Funkcje konwersji i instrukcje warunkowe ........................................................353 6.2.4. Stałe jako zmienne ..............................................................................................355 6.2.5. Zapobieganie wywołaniu domyślnych operacji..................................................357 6.2.6. Klasy zastępcze...................................................................................................358 6.2.7. Obsługa wyjątków z u yciem parametrów .........................................................361 6.2.8. Podsumowanie ....................................................................................................365 6.3. Dziedziczenie i klasy o składowych dynamicznych.....................................................365 6.3.1. Klasa CPPBook::String jak klasa bazowa ..........................................................365 6.3.2 Klasa pochodna ColString ..................................................................................368 6.3.3. Dziedziczenie funkcji zaprzyjaźnionych ............................................................371
  • 7. 8 C++. Programowanie zorientowane obiektowo. Vademecum profesjonalisty 6.3.4. Plik źródłowy klasy pochodnej ColString ..........................................................373 6.3.5. Aplikacja klasy ColString ...................................................................................374 6.3.6. Dziedziczenie specjalnych funkcji dla składowych dynamicznych ...................375 6.3.7. Podsumowanie ....................................................................................................376 6.4. Klasy zawierające klasy................................................................................................376 6.4.1. Obiekty jako składowe innych klas ....................................................................377 6.4.2. Implementacja klasy Person ...............................................................................377 6.4.3. Podsumowanie ....................................................................................................383 6.5. Składowe statyczne i typy pomocnicze ........................................................................383 6.5.1. Statyczne składowe klas .....................................................................................384 6.5.2. Deklaracje typu wewnątrz klasy .........................................................................389 6.5.3. Typy wyliczeniowe jako statyczne stałe klasy ...................................................391 6.5.4. Klasy zagnie d one i klasy lokalne ....................................................................392 6.5.5. Podsumowanie ....................................................................................................393 4QFKC 5CDNQP[ 7.1. Dlaczego szablony? ......................................................................................................395 7.1.1. Terminologia.......................................................................................................396 7.2. Szablony funkcji ...........................................................................................................396 7.2.1. Definiowanie szablonów funkcji ........................................................................397 7.2.2. Wywoływanie szablonów funkcji.......................................................................398 7.2.3. Praktyczne wskazówki dotyczące u ywania szablonów ....................................399 7.2.4. Szablony i automatyczna konwersja typu...........................................................399 7.2.5. Przecią anie szablonów ......................................................................................400 7.2.6. Zmienne lokalne..................................................................................................402 7.2.7. Podsumowanie ....................................................................................................402 7.3. Szablony klas ................................................................................................................403 7.3.1. Implementacja szablonu klasy Stack ..................................................................403 7.3.2. Zastosowanie szablonu klasy Stack ....................................................................406 7.3.3. Specjalizacja szablonów klas..............................................................................408 7.3.4. Domyślne parametry szablonu............................................................................410 7.3.5. Podsumowanie ....................................................................................................412 7.4. Inne parametry szablonów ............................................................................................412 7.4.1. Przykład zastosowania innych parametrów szablonów......................................412 7.4.2. Ograniczenia parametrów szablonów .................................................................415 7.4.3. Podsumowanie ....................................................................................................416 7.5. Inne zagadnienia związane z szablonami .....................................................................416 7.5.1. Słowo kluczowe typename .................................................................................416 7.5.2. Składowe jako szablony......................................................................................417 7.5.3. Polimorfizm statyczny z u yciem szablonów.....................................................420 7.5.4. Podsumowanie ....................................................................................................424 7.6. Szablony w praktyce .....................................................................................................424 7.6.1. Kompilacja kodu szablonu..................................................................................424 7.6.2. Obsługa błędów ..................................................................................................429 7.6.3. Podsumowanie ....................................................................................................430 4QFKC 5VCPFCTFQYC DKDNKQVGMC YGL EKC K Y[L EKC Y UEGIÎ CEJ 8.1. Standardowe klasy strumieni ........................................................................................433 8.1.1. Klasy strumieni i obiekty strumieni....................................................................434 8.1.2. Stan strumienia....................................................................................................436
  • 8. Spis treści 9 8.1.3. Operatory standardowe .......................................................................................439 8.1.4. Funkcje standardowe ..........................................................................................440 8.1.5. Manipulatory.......................................................................................................443 8.1.6. Definicje formatu ................................................................................................445 8.1.7. Internacjonalizacja ..............................................................................................455 8.1.8. Podsumowanie ....................................................................................................458 8.2. Dostęp do plików ..........................................................................................................458 8.2.1. Klasy strumieni dla plików .................................................................................458 8.2.2. Wykorzystanie klas strumieni plików.................................................................459 8.2.3. Znaczniki plików ................................................................................................461 8.2.4. Jawne otwieranie i zamykanie plików ................................................................462 8.2.5. Swobodny dostęp do plików...............................................................................463 8.2.6. Przekierowanie standardowych kanałów do plików...........................................466 8.2.7. Podsumowanie ....................................................................................................467 8.3. Klasy strumieni łańcuchów...........................................................................................467 8.3.1. Klasy strumieni łańcuchów.................................................................................468 8.3.2. Operator rzutowania leksykalnego .....................................................................470 8.3.3. Strumienie C-łańcuchów.....................................................................................472 8.3.4. Podsumowanie ....................................................................................................474 4QFKC +PPG Y C EKYQ EK Lú[MC 9.1. Dodatkowe informacje o bibliotece standardowej........................................................475 9.1.1. Operacje na wektorach........................................................................................475 9.1.2. Operacje wspólne dla wszystkich kontenerów STL ...........................................482 9.1.3. Algorytmy STL...................................................................................................482 9.1.4. Ograniczenia wartości numerycznych ................................................................488 9.1.5. Podsumowanie ....................................................................................................492 9.2. Definiowanie specjalnych operatorów..........................................................................493 9.2.1. Inteligentne wskaźniki ........................................................................................493 9.2.2. Obiekty funkcji ...................................................................................................496 9.2.3. Podsumowanie ....................................................................................................500 9.3. Inne aspekty operatorów new i delete...........................................................................500 9.3.1. Operatory new i delete, które nie wyrzucają wyjątków......................................500 9.3.2. Określanie poło enia obiektu..............................................................................501 9.3.3. Funkcje obsługi operatora new ...........................................................................501 9.3.4. Przecią anie operatorów new i delete.................................................................506 9.3.5. Dodatkowe parametry operatora new .................................................................509 9.3.6. Podsumowanie ....................................................................................................510 9.4. Wskaźniki funkcji i wskaźniki składowych..................................................................510 9.4.1. Wskaźniki funkcji ...............................................................................................510 9.4.2. Wskaźniki składowych .......................................................................................511 9.4.3. Wskaźniki składowych i zewnętrzne interfejsy..................................................514 9.4.4. Podsumowanie ....................................................................................................515 9.5. Łączenie programów w językach C i C++....................................................................516 9.5.1. Łączenie zewnętrzne...........................................................................................516 9.5.2. Pliki nagłówkowe w językach C i C++ ..............................................................517 9.5.3. Kompilacja funkcji main()..................................................................................517 9.5.4. Podsumowanie ....................................................................................................518
  • 9. 10 C++. Programowanie zorientowane obiektowo. Vademecum profesjonalisty 9.6. Dodatkowe słowa kluczowe .........................................................................................518 9.6.1. Unie.....................................................................................................................518 9.6.2. Typy wyliczeniowe.............................................................................................519 9.6.3. Słowo kluczowe volatile .....................................................................................520 9.6.4. Podsumowanie ....................................................................................................520 4QFKC 2QFUWOQYCPKG 10.1. Hierarchia operatorów języka C++.............................................................................521 10.2. Właściwości operacji klas...........................................................................................523 10.3. Zasady automatycznej konwersji typów.....................................................................524 10.4. Przydatne zasady programowania i projektowania ....................................................525 QFCVGM # $KDNKQITCHKC QFCVGM $ 5 QYPKM 5MQTQYKF
  • 10. Rozdział 7. 5CDNQP[ W rozdziale tym przedstawiona zostanie koncepcja szablonów. Szablony umo liwiają parametryzację kodu dla ró nych typów. Dzięki temu na przykład funkcja wyznaczają- ca najmniejszą wartość lub klasa kolekcji mo e zostać zaimplementowana, zanim usta- lony zostanie typ parametru funkcji lub elementu kolekcji. Kod generowany na podsta- wie szablonu nie przetwarza jednak dowolnych typów: w momencie, gdy ustalony zostanie typ parametru. Obowiązuje równie zwykła kontrola zgodności typów. Najpierw przedstawione zostaną szablony funkcji, a następnie szablony klas. Omówie- nie szablonów zakończymy przedstawieniem sposobów ich wykorzystania, w tym spe- cjalnych technik projektowania. Więcej informacji na temat szablonów mo na znaleźć w ksią ce C++ Templates — The Complete Guide1, której autorami są Nicolai M. Josuttis i David Vandevoorde (patrz VandevoordeJosuttisTemplate). Ksią ka ta zawiera podobne wprowadzenie do proble- matyki szablonów, wyczerpujący opis szablonów, szeregu technik kodowania i zaawan- sowanych zastosowań szablonów. NCEGIQ UCDNQP[! W językach programowania, które wią ą zmienne z określonym typem danych, często pojawia się sytuacja wymagająca wielokrotnego zdefiniowania tej samej funkcji dla ró nych typów parametrów. Typowym przykładem jest funkcja zwracająca większą z przekazanych jej dwóch wartości. Musi ona zostać zaimplementowana osobno dla ka dego typu, dla którego chcemy ja wykorzystywać. W języku C mo na tego uniknąć, posługując się makrodefinicją. Poniewa działanie makrodefinicji polega na mecha- nicznym zastępowaniu przez preprocesor jednego tekstu programu innym, rozwiązanie takie nie jest zalecane (ze względu na brak kontroli zgodności typów, mo liwość wy- stąpienia efektów ubocznych, etc.). Nie tylko wielokrotna implementacja funkcji wymaga dodatkowej pracy. Podobna sytu- acja występuje w przypadku implementacji zaawansowanych typów, takich jak konte- nery. Zarządzanie kolekcją elementów kontenera wymaga implementacji szeregu funkcji, 1 C++. Szablony. Vademecum profesjonalisty, Helion 2003.
  • 11. 396 C++. Programowanie zorientowane obiektowo. Vademecum profesjonalisty w przypadku których istotny jest przede wszystkim typ elementu kolekcji. Gdyby nie mo liwość wykorzystania specjalnych właściwości języka C++, wszystkie te funkcje musiałyby być implementowane za ka dym razem, gdy pojawia się nowy typ elemen- tów kolekcji. Stos jest typowym przykładem, w którym pojawia się wiele implementacji słu ących zarządzaniu ró nymi obiektami. Stos umo liwia przechowywanie i usuwanie elemen- tów konkretnego typu. Jeśli stosowalibyśmy poznane dotychczas konstrukcje języka C++, zmuszeni bylibyśmy implementować jego operacje osobno dla ka dego typu ele- mentów, które mogą być umieszczone na stosie, poniewa deklaracja stosu wymaga podania typu jego elementów. Te same operacje musielibyśmy więc implementować wielokrotnie, mimo, e rzeczywisty algorytm nie ulega zmianie. Nie tylko wymaga to dodatkowej pracy, ale mo e stać się tak e źródłem błędów. Dlatego te w języku C++ wprowadzono szablony. Szablony reprezentują funkcje bądź klasy, które nie zostały zaimplementowane dla konkretnego typu, poniewa typ ten zo- stanie dopiero zdefiniowany. Aby u yć szablonu funkcji lub klasy, programista aplika- cji musi określić typ, dla którego dany szablom zostanie zrealizowany. Wystarczy więc, e funkcja wyznaczająca większą z dwóch wartości zostanie zaimplementowana tylko raz — jako szablon. Podobnie kontenery, takie jak stosy, listy itp., wymagają tylko jed- nokrotnego zaimplementowania i przetestowania, a następnie mogą być wykorzystywane dla dowolnego typu elementów, który umo liwia przeprowadzanie odpowiednich operacji. Sposoby definiowania i posługiwania się szablonami zostaną wyjaśnione poni ej, naj- pierw dla funkcji na przykładzie funkcji OCZ , a następnie dla klas, na przykładzie stosu. 6GTOKPQNQIKC Terminologia związana z szablonami nie jest ściśle zdefiniowana. Na przykład funkcja, której typ został sparametryzowany, nazywana jest czasami szablonem funkcji, a innym razem funkcją szablonu. Poniewa drugie z tych określeń jest nieco mylące (mo e okre- ślać szablon funkcji, ale tak e funkcję nie związaną z szablonem), powinno się raczej u ywać określenia szablon funkcji. Podobnie klasa sparametryzowana ze względu na typ powinna być nazywana szablonem klasy, a nie klasą szablonu. Proces, w którym przez podstawienie do szablonu wartości parametru powstaje zwykła klasa, funkcja lub funkcja składowa, nazywany jest tworzeniem instancji szablonu. Nie- stety, termin „tworzenie instancji” u ywany jest tak e w terminologii obiektowej dla określenia tworzenia obiektu danej klasy. Dlatego te znaczenie terminu „tworzenie in- stancji” zale y w przypadku języka C++ od kontekstu, w którym zostaje on u yty. 5CDNQP[ HWPMELK Jak ju wspomnieliśmy, szablony funkcji umo liwiają definiowanie grup funkcji, które mogą następnie zostać u yte dla ró nych typów.
  • 12. Rozdział 7. Szablony 397 W przeciwieństwie do działania makrodefinicji, działanie szablonów nie polega na me- chanicznym zastępowaniu tekstów. Semantyka funkcji zostaje sprawdzona przez kom- pilator, co pozwala zapobiec niepo ądanym efektom ubocznym. Nie istnieje na przy- kład (tak jak w przypadku makrodefinicji) niebezpieczeństwo wielokrotnego zastąpienia parametru P , na skutek którego pojedyncza instrukcja inkrementacji staje się wielo- krotną inkrementacją. GHKPKQYCPKG UCDNQPÎY HWPMELK Szablony funkcji definiowane są jak zwykłe funkcje, a parametryzowany typ poprzedza ich deklarację. Na przykład szablon funkcji wyznaczającej większą z dwóch wartości zostanie zadeklarowany w następujący sposób: VGORNCVG V[RGPCOG 6 EQPUV 6 OCZ EQPUV 6 EQPUV 6 W pierwszym wierszu zadeklarowany został parametr typu 6. Słowo kluczowe V[RGPCOG oznacza, e następujący po nim symbol reprezentuje typ. Słowo to zostało wprowadzone w języku C++ stosunkowo późno. Wcześniej u ywano zamiast niego słowa kluczowego ENCUU: VGORNCVG ENCUU 6 Pomiędzy słowami tymi nie ma ró nic semantycznych. U ycie słowa kluczowego ENCUU nie wymaga, by parametryzowany typ był klasą. U ywając obu słów kluczowych mo- emy korzystać z dowolnych typów (podstawowych, klas etc.) pod warunkiem, e umo liwiają one wykonywanie operacji u ywanych przez szablon. W naszym przykła- dzie dla typu 6 musi być zdefiniowany operator porównania (), którego u ywa imple- mentacja szablonu funkcji OCZ . Zastosowanie symbolu 6 dla typu szablonu nie jest wymagane, ale w praktyce bywa często stosowane. W poni szej deklaracji symbol 6 u ywany jest w celu określenie typu funkcji oraz typu jej parametrów: VORNOCZJRR VGORNCVG V[RGPCOG 6 EQPUV 6 OCZ EQPUV 6 C EQPUV 6 D ] TGVWTP C D ! C D _ Instrukcje umieszczone w ciele szablonu nie ró nią się niczym od instrukcji zwykłej implementacji funkcji. W powy szym przykładzie porównywane są dwie wartości typu 6 i zwracana jest większa z nich. Zastosowanie referencji stałych (EQPUV 6 ) zapobiega tworzeniu kopii parametrów funkcji i wartości zwracanych przez funkcję (patrz podroz- dział 4.4).
  • 13. 398 C++. Programowanie zorientowane obiektowo. Vademecum profesjonalisty 9[YQ [YCPKG UCDNQPÎY HWPMELK Szablonu funkcji u ywamy w taki sam sposób, jak zwykłej funkcji. Demonstruje to po- ni szy program2: VORNOCZERR KPENWFG KQUVTGCO KPENWFG UVTKPI KPENWFG OCZJRR KPV OCKP ] KPV C D FYKG OKGPPG V[RW KPV UVFUVTKPI U V FYKG OKGPPG V[RW UVFUVTKPI UVFEQWV OCZ CD UVFGPFN OCZ FNC FYÎEJ YCTVQ EK EC MQYKV[EJ UVFEQWV OCZ UV UVFGPFN OCZ FNC FYÎEJ C EWEJÎY _ Dopiero w momencie, gdy funkcja OCZ zostaje wywołana dla dwóch obiektów takiego samego typu, szablon staje się rzeczywistym kodem. Kompilator wykorzystuje definicję szablonu i tworzy jego instancję, zastępując typ 6 typem KPV lub UVFUVTKPI. W ten sposób tworzony jest rzeczywisty kod implementacji dla typu KPV bądź typu UVF UVTKPI. Szablony nie są więc kompilowane jako kod, który mo e działać z dowolnym typem danych, lecz jedynie wykorzystywane w celu wygenerowania kodu dla konkret- nego typu. Jeśli szablon OCZ zostanie wywołany dla siedmiu ró nych typów, to skom- pilowanych zostanie siedem funkcji. Proces, w którym na podstawie szablonu generowany jest kod, który zostanie skompi- lowany, nazywany jest tworzeniem instancji lub, precyzyjniej (ze względu na zastoso- wanie określenia „tworzenie instancji” w terminologii obiektowej), tworzeniem instan- cji szablonu. Utworzenie instancji szablonu jest oczywiście mo liwe tylko wtedy, gdy dla danego typu zdefiniowane są wszystkie operacje u ywane przez szablon. Aby mo liwe było utwo- rzenie instancji szablonu OCZ dla typu UVFUVTKPI, w klasie UVFUVTKPI musi być zdefiniowany operator porównania (). Zauwa my, e w przeciwieństwie do działania makrodefinicji, działanie szablonów nie polega na zastępowaniu tekstów. Wywołanie OCZ Z
  • 14. nie jest mo e szczególnie u yteczne, ale będzie działać poprawnie. Zwróci większą wartość jednego z przekazanych jej wyra eń, a ka de z wyra eń wartościowane będzie tylko raz (czyli zmienna Z będzie inkrementowana jeden raz). 2 Wywołanie szablonu OCZ dla typu string zostało jawnie poprzedzone operatorem globalnego zakresu, poniewa w standardowej bibliotece zdefiniowana jest funkcja UVFOCZ . Poniewa typ UVTKPI równie znajduje się w przestrzeni nazw UVF, to funkcja OCZ nie poprzedzona operatorem zakresu zostałaby odnaleziona właśnie w tej przestrzeni (patrz „Wyszukiwanie Koeniga”, str. 179).
  • 15. Rozdział 7. Szablony 399 2TCMV[EPG YUMCÎYMK FQV[EæEG W [YCPKC UCDNQPÎY Koncepcja szablonów wykracza poza zwykły model kompilacji (konsolidacji), wyko- rzystujący odrębne jednostki translacji. Nie mo na na przykład umieścić szablonów w osobnym module i skompilować go, a następnie osobno skompilować aplikacji u y- wającej tych szablonów i skonsolidować oba uzyskane pliki wynikowe. Nie jest to mo liwe, poniewa typ, dla którego ma zostać u yty szablon, zostaje określony dopiero w momencie u ycia szablonu. Istnieją ró ne sposoby rozwiązania tego problemu. Najprostszy i najbardziej uniwersalny polega na umieszczeniu całego kodu szablonu w pliku nagłówkowym. Dołączając na- stępnie zawartości pliku nagłówkowego do kodu aplikacji umo liwiamy generację i kompilację kodu dla konkretnych typów. Nieprzypadkowo więc definicja szablonu OCZ z poprzedniego przykładu została umieszczona w pliku nagłówkowym. Nale y przy tym zauwa yć, e słowo kluczowe KPNKPG (patrz podrozdział 4.3.3) nie musi być zastosowane. W przypadku szablonów dopuszczalne jest istnienie wielu definicji w ró nych jednostkach translacji. Jeśli jednak preferujemy rozwijanie szablonu funkcji w miejscu jego wywołania, powinniśmy zasy- gnalizować to kompilatorowi właśnie za pomocą słowa kluczowego KPNKPG. Więcej zagadnień związanych z posługiwaniem się szablonami zostanie omówionych w podrozdziale 7.6. 5CDNQP[ K CWVQOCV[EPC MQPYGTULC V[RW Podczas tworzenia instancji szablonu nie jest brana pod uwagę automatyczna konwersja typu. Jeśli szablon posiada wiele parametrów typu 6, przekazane mu argumenty muszą być tego samego typu. Wywołanie szablonu OCZ dla obiektów ró nych typów nie jest więc mo liwe: VGORNCVG V[RGPCOG 6 EQPUV 6 OCZ EQPUV 6 EQPUV QDC RCTCOGVT[ OCLæ V[R 6 KPV K NQPI N OCZ KN $ ä OKGPPG K QTC N RQUKCFCLæ TÎ PG V[R[ ,CYPC MYCNKHKMCELC Wywołując szablon mo emy zastosować jawną kwalifikację typu, dla którego zostanie on u yty: OCZNQPI K N Y[YQ CPKG UCDNQPW OCZ FNC V[RW NQPI W tym przypadku tworzona jest instancja szablonu funkcji OCZ dla typu NQPI jako pa- rametru 6 szablonu. Następnie, podobnie jak w przypadku zwykłych funkcji, kompilator sprawdza, czy przekazane parametry mogą być u yte jako wartości typu NQPI, co jest mo liwe w naszym przykładzie ze względu na istnienie domyślnej konwersji typu KPV do typu NQPI.
  • 16. 400 C++. Programowanie zorientowane obiektowo. Vademecum profesjonalisty 5CDNQP[ Q YKGNW RCTCOGVTCEJ Szablon mo e zostać zdefiniowany tak e dla ró nych typów: VGORNCVG V[RGPCOG 6 V[RGPCOG 6 KPNKPG 6 OCZ EQPUV 6 EQPUV 6 ] TGVWTP C D ! D C _ KPV K NQPI N OCZ KN YTCEC YCTVQ è V[RW KPV Problemem w tym przypadku jest typ wartości zwracanej przez funkcję, poniewa w momencie definiowania szablonu nie wiemy, który z parametrów zostanie zwrócony. Dodatkowo, jeśli zwrócony będzie drugi parametr, dla wartości zwracanej utworzony zostanie lokalny obiekt tymczasowy, poniewa posiada ona inny typ. Obiekt tymczaso- wy nie mo e zostać zwrócony przez referencję, wobec czego typ zwracany przez sza- blon został zmieniony z EQPUV 6 na 6. W takim przypadku lepszym rozwiązaniem jest mo liwość jawnej kwalifikacji. 2TGEKæ CPKG UCDNQPÎY Szablony mogą być przecią ane dla pewnych typów. W ten sposób ogólna implementa- cja szablonu mo e zostać zastąpiona inną implementacją dla konkretnych typów. Roz- wiązanie takie posiada szereg zalet: Szablony funkcji mogą zostać zdefiniowane dla dodatkowych typów oraz ich kombinacji (na przykład mo e zostać zdefiniowana funkcja OCZ o parametrach typu HNQCV i %22$QQM(TCEVKQP). Implementacje mogą zostać zoptymalizowane dla konkretnych typów. Typy, dla których implementacja szablonu nie jest odpowiednia, mogą zostać właściwie obsłu one. Wywołanie szablonu OCZ dla C-łańcuchów (typ EQPUV EJCT
  • 17. ) spowoduje błąd: EQPUV EJCT
  • 18. U EQPUV EJCT
  • 19. U EQPUV EJCT
  • 20. OCZUVTKPI OCZ UU $ ä RQTÎYPWLG CFTGU[ Implementacja szablonu porówna w tym przypadku adresy C-łańcuchów zamiast ich zawartości (patrz podrozdział 3.7.3). Problem ten mo emy rozwiązać poprzez przecią enie szablonu dla C-łańcuchów: KPNKPG EQPUV EJCT
  • 23. D ] TGVWTP UVFUVTEOR CD ! C D _
  • 24. Rozdział 7. Szablony 401 Przecią enie szablonu mo e tak e dotyczyć wskaźników. Mo emy w ten sposób sprawić, e jeśli szablon OCZ zostanie wywołany dla wskaźników, porównane zostaną wska- zywane przez nie obiekty, a nie ich adresy. Na przykład: VGORNCVG V[RGPCOG 6 6
  • 27. EQPUV D ] TGVWTP
  • 28. C
  • 29. D ! C D _ Zwróćmy uwagę, e jeśli wskaźnik ma zostać przekazany jako stała referencja, słowo kluczowe EQPUV musi zostać umieszczone po znaku gwiazdki. W przeciwnym razie za- deklarowany zostanie wskaźnik do stałej (patrz tak e podrozdział 4.4.6). Przecią ając szablony funkcji powinniśmy wprowadzać jedynie niezbędne modyfikacje, takie jak zmiany liczby parametrów czy jawne ich określenie. W przeciwnym razie wprowadzone zmiany mogą stać się powodem powstawania nieoczekiwanych efektów. Dlatego te w naszym przykładzie argumenty wszystkich przecią onych implementacji powinny być przekazywane poprzez stałe referencje: VORNOCZERR KPENWFG KQUVTGCO KPENWFG EUVTKPI YTCEC YKúMUæ FYÎEJ YCTVQ EK FQYQNPGIQ V[RW VGORNCVG V[RGPCOG 6 KPNKPG EQPUV 6 OCZ EQPUV 6 C EQPUV 6 D ] UVFEQWV OCZ FNC 6 UVFGPFN TGVWTP C D ! D C _ FNC FYÎEJ YUMC PKMÎY VGORNCVG V[RGPCOG 6 KPNKPG 6
  • 32. EQPUV D ] UVFEQWV OCZ FNC 6
  • 33. UVFGPFN TGVWTP
  • 34. C
  • 35. D ! D C _ FNC FYÎEJ % C EWEJÎY KPNKPG EQPUV EJCT
  • 37. EQPUV C EQPUV EJCT
  • 38. EQPUV D ] UVFEQWV OCZ FNC EJCT
  • 39. UVFGPFN TGVWTP UVFUVTEOR CD ! D C _ Wykonanie przedstawionego poni ej programu: VORNOCZERR KPENWFG KQUVTGCO KPENWFG UVTKPI KPENWFG OCZJRR KPV OCKP
  • 40. 402 C++. Programowanie zorientowane obiektowo. Vademecum profesjonalisty ] KPV C FYKG OKGPPG V[RW KPV KPV D UVFEQWV OCZ CD UVFGPFN OCZ FNC FYÎEJ CTIWOGPVÎY V[RW KPV UVFUVTKPI U JGNNQ FYC C EWEJ[ UVFUVTKPI V JQNNC UVFEQWV OCZ UV UVFGPFN OCZ FNC FYÎEJ CTIWOGPVÎY V[RW UVTKPI KPV
  • 41. R D FYC YUMC PKMK KPV
  • 42. R C UVFEQWV
  • 43. OCZ RR UVFGPFN OCZ FNC FYÎEJ YUMC PKMÎY EQPUV EJCT
  • 44. U JGNNQ FYC % C EWEJ[ EQPUV EJCT
  • 45. U QVVQ UVFEQWV OCZ UU UVFGPFN OCZ FNC FYÎEJ % C EWEJÎY _ spowoduje wyświetlenie następujących napisów: OCZ FNC 6 OCZ FNC 6 JQNNC OCZ FNC 6
  • 46. OCZ FNC EJCT
  • 47. QVVQ OKGPPG NQMCNPG Szablony funkcji mogą posiadać zmienne lokalne typu będącego parametrem szablonu. Na przykład szablon funkcji zamieniającej wartości dwóch parametrów mo e zostać zaimplementowany w następujący sposób (proszę porównać z implementacją funkcji UYCR przedstawioną na stronie 185). VGORNCVG V[RGPCOG 6 XQKF UYCR 6 C 6 D ] 6 VOR C C D D VOR _ Zmienne lokalne mogą być równie statyczne. W takim przypadku tworzone są zmien- ne statyczne wszystkich typów, dla których wywoływany jest szablon funkcji. 2QFUWOQYCPKG Szablony są schematami kodu kompilowanego po wybraniu określonego typu danych. Tworzenie kodu w języku C++ na podstawie szablonu nazywamy tworzeniem instancji szablonu.
  • 48. Rozdział 7. Szablony 403 Szablony mogą posiadać wiele parametrów. Szablony funkcji mogą być przecią ane. 5CDNQP[ MNCU W takim sam sposób, jak parametryzowane są typy funkcji, mogą równie być parame- tryzowane typy w klasach. Mo liwość taka jest szczególnie przydatna w przypadku kontenerów u ywanych do zarządzania obiektami pewnego typu. Szablony klas mo emy wykorzystać do implementacji kontenerów, dla których typ elementów nie jest jeszcze zna- ny. W terminologii obiektowej szablony klas nazywane są klasami parametryzowanymi. Implementacja szablonów klas zostanie omówiona na przykładzie klasy stosu. Imple- mentacja ta wykorzystywać będzie szablon klasy XGEVQT , dostępny w bibliotece stan- dardowej (patrz podrozdziały 3.5.1 i 9.1.1). +ORNGOGPVCELC UCDNQPW MNCU[ 5VCEM Podobnie, jak w przypadku szablonów funkcji, tak e deklaracja i definicja szablonu klasy umieszczana jest zwykle w pliku nagłówkowym. Zawartość pliku nagłówkowego klasy 5VCEM jest następująca: VORNUVCEMJRR KPENWFG XGEVQT KPENWFG UVFGZEGRV
  • 49.
  • 50.
  • 51.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84. PCOGURCEG %22$QQM ] VGORNCVG V[RGPCOG 6 ENCUU 5VCEM ] RTKXCVG UVFXGEVQT6 GNGOU GNGOGPV[ RWDNKE 5VCEM MQPUVTWMVQT XQKF RWUJ EQPUV 6 WOKGUEC PQY[ GNGOGPV PC UE[EKG XQKF RQR WUWYC GNGOGPV G UE[VW 6 VQR EQPUV YTCEC GNGOGPV PCLFWLæE[ UKú PC UE[EKG _ MQPUVTWMVQT VGORNCVG V[RGPCOG 6 5VCEM6 5VCEM ] PKG Y[MQPWLG CFP[EJ KPUVTWMELK _ VGORNCVG V[RGPCOG 6 XQKF 5VCEM6 RWUJ EQPUV 6 GNGO
  • 85. 404 C++. Programowanie zorientowane obiektowo. Vademecum profesjonalisty ] GNGOURWUJADCEM GNGO WOKGUEC MQRKú PC UE[EKG UVQUW _ VGORNCVGV[RGPCOG 6 XQKF 5VCEM6 RQR ] KH GNGOUGORV[ ] VJTQY UVFQWVAQHATCPIG 5VCEM RQR RWUV[ UVQU _ GNGOURQRADCEM WUWYC GNGOGPV G UE[VW UVQUW _ VGORNCVG V[RGPCOG 6 6 5VCEM6 VQR EQPUV ] KH GNGOUGORV[ ] VJTQY UVFQWVAQHATCPIG 5VCEM VQR RWUV[ UVQU _ TGVWTP GNGOUDCEM YTCEC MQRKú GNGOGPVW PCLFWLæEGIQ UKú PC UE[EKG _ _
  • 86.
  • 87.
  • 88.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
  • 120.
  • 121. GMNCTCELC UCDNQPW MNCU[ Podobnie, jak w przypadku szablonu funkcji, deklaracja szablonu klasy poprzedzona jest określeniem parametru typu 6 (parametrów szablonu mo e być oczywiście więcej): VGORNCVG V[RGPCOG 6 ENCUU 5VCEM ] _ Zamiast słowa kluczowego V[RGPCOG mo e być te u yte słowo ENCUU: VGORNCVG ENCUU 6 ENCUU 5VCEM ] _ Wewnątrz klasy typ 6 mo e być u ywany w deklaracjach składowych klasy i funkcji składowych w taki sam sposób, jak ka dy zwykły typ. W naszym przykładzie elementy stosu zarządzane są wewnątrz klasy za pomocą wektora o elementach typu 6 (szablon jest zaimplementowany z u yciem innego szablonu), funkcja RWUJ u ywa referencji stałej typu 6 jako parametru, a funkcja VQR zwraca obiekt typu 6. Klasa stosu posiada typ 5VCEM6 , gdzie 6 jest parametrem szablonu. Typ ten musi zo- stać u yty za ka dym razem, gdy posługujemy się klasą stosu. Nazwy 5VCEM u ywamy jedynie podczas definiowania klasy oraz jej konstruktorów i destruktorów: ENCUU 5VCEM ] _
  • 122. Rozdział 7. Szablony 405 Poni szy przykład przedstawia sposób u ycia szablonu klasy jako typu parametrów funkcji lub wartości przez nie zwracanych (w deklaracjach konstruktora kopiującego i operatora przypisania)3: VGORNCVG V[RGPCOG 6 ENCUU 5VCEM ] 5VCEM EQPUV 5VCEM6 MQPUVTWMVQT MQRKWLæE[ 5VCEM6 QRGTCVQT EQPUV 5VCEM6 QRGTCVQT RT[RKUCPKC _ +ORNGOGPVCELC HWPMELK UM CFQY[EJ Definiując funkcję składową szablonu klasy musimy określić jej przynale ność do sza- blonu. Przykład implementacji funkcji RWUJ pokazuje, e nazwa funkcji musi zostać poprzedzona pełnym typem szablonu 5VCEM6 : VGORNCVG V[RGPCOG 6 XQKF 5VCEM6 RWUJ EQPUV 6 GNGO ] GNGOURWUJADCEM GNGO WOKGUEC MQRKú PC UVQUKG _ Implementacja ta w rzeczywistości deleguje operację do odpowiedniej funkcji szablonu klasy XGEVQT u ywanego wewnętrznie do zarządzania elementami stosu. Szczyt stosu jest w tym przypadku równowa ny elementowi znajdującemu się na końcu wektora. Zauwa my, e funkcja RQR usuwa element ze szczytu stosu, ale go nie zwraca. Operacji tej odpowiada funkcja RQRADCEM wektora. Powodem takiego zachowania obu funkcji jest niebezpieczeństwo związane z mo liwością wyrzucenia wyjątku (patrz podrozdział 4.7.10). Implementacja funkcji RQR , która zwraca usunięty element i charakteryzuje się wysokim poziomem bezpieczeństwa, nie jest mo liwa. Przeanalizujmy działanie wersji funkcji RQR zwracającej element usunięty ze szczytu stosu: VGORNCVG V[RGPCOG 6 6 5VCEM6 RQR ] KH GNGOUGORV[ ] VJTQY UVFQWVAQHATCPIG 5VCEM RQR RWUV[ UVQU _ 6 GNGO GNGOUDCEM VYQT[ MQRKú GNGOGPVW PC UE[EKG GNGOURQRADCEM WUWYC GNGOGPV G UE[VW TGVWTP GNGO YTCEC MQRKú GNGOGPVW MVÎT[ PCLFQYC UKú PC UE[EKG _ Niebezpieczeństwo polega na mo liwości wyrzucenia wyjątku przez konstruktor ko- piujący tworzący wartość zwracaną przez funkcję. Poniewa wcześniej element został ju usunięty ze stosu, nie ma mo liwości przywrócenie wyjściowego stanu stosu, gdy 3 Standard języka C++ definiuje pewne zasady, które pozwalają określić kiedy u ycie typu 5VCEM zamiast typu 5VCEM6 jest wystarczające wewnątrz deklaracji klasy. W praktyce łatwiej jednak jest u ywać zawsze typu 5VCEM6 , gdy wymagany jest typ klasy.
  • 123. 406 C++. Programowanie zorientowane obiektowo. Vademecum profesjonalisty pojawi się wyjątek. Nale y podjąć decyzję, czy bardziej interesuje nas bezpieczne wy- konanie funkcji, czy mo liwość uzyskania zwróconego obiektu4. Zwróćmy tak e uwagę, e funkcje składowe RQRADCEM i DCEM (ta druga zwraca ostatni element wektora) zachowują się w nieokreślony sposób, gdy wektor jest pusty (patrz strony 479 i 481). Dlatego te funkcje szablonu klasy 5VCEM sprawdzają najpierw, czy stos jest pusty, i wyrzucają wyjątek UVFQWVAQHATCPIG (patrz podrozdział 4.7.9): VGORNCVGV[RGPCOG 6 6 5VCEM6 VQR EQPUV ] KH GNGOUGORV[ ] VJTQY UVFQWVAQHATCPIG 5VCEM VQR RWUV[ UVQU _ TGVWTP GNGOUDCEM YTCEC MQRKú UE[VW UVQUW _ Funkcje składowe szablonu klasy mogą być te implementowane wewnątrz deklaracji szablonu: VGORNCVG V[RGPCOG 6 ENCUU 5VCEM ] XQKF RWUJ EQPUV 6 GNGO ] GNGOURWUJADCEM GNGO WOKGUEC PC UVQUKG MQRKú QDKGMVW _ _ CUVQUQYCPKG UCDNQPW MNCU[ 5VCEM Deklarując obiekt szablonu klasy musimy zawsze określić typ, który będzie parametrem szablonu: VORNUVGUVERR KPENWFG KQUVTGCO KPENWFG UVTKPI KPENWFG EUVFNKD KPENWFG UVCEMJRR KPV OCKP ] VT[ ] %22$QQM5VCEMKPV KPV5VCEM UVQU NKED EC MQYKV[EJ %22$QQM5VCEMUVFUVTKPI UVTKPI5VCEM UVQU C EWEJÎY QRGTCELG PC UVQUKG NKED EC MQYKV[EJ KPV5VCEMRWUJ UVFEQWV KPV5VCEMVQR UVFGPFN KPV5VCEMRQR QRGTCELG PC UVQUKG C EWEJÎY 4 Zagadnienie to zostało omówione po raz pierwszy przez Toma Cargilla w CargillExceptionSafety oraz przedstawione zostało w SutterExceptional.
  • 124. Rozdział 7. Szablony 407 UVFUVTKPI U JGNNQ UVTKPI5VCEMRWUJ U UVFEQWV UVTKPI5VCEMVQR UVFGPFN UVTKPI5VCEMRQR UVFEQWV UVTKPI5VCEMVQR UVFGPFN UVTKPI5VCEMRQR _ ECVEJ EQPUV EJCT
  • 125. OUI ] UVFEGTT 9[LæVGM OUI UVFGPFN TGVWTP ':+6A(#+.74' _ _ Instancja szablonu klasy tworzona jest dla podanego typu. Deklaracja stosu UVTKPI5VCEM powoduje wygenerowanie kodu klasy 5VCEM dla typu UVFUVTKPI oraz dla wszystkich funkcji składowych wywoływanych w programie. Zwróćmy uwagę, e w przypadku tworzenia instancji szablonów klas generowany jest kod jedynie dla tych funkcji składowych, które rzeczywiście są wywoływane. Jest to istotne nie tylko z punktu widzenia efektywności. Umo liwia tak e stosowanie szablonu klasy dla typów, które nie dysponują operacjami wymaganymi przez wszystkie funkcje składowe szablonu pod warunkiem, e wywoływane są tylko te funkcje, dla których do- stępne są odpowiednie operacje. Przykładem mo e być szablon klasy, którego niektóre funkcje składowe u ywają operatora porównania (). Dopóty, dopóki funkcje te nie są wywoływane, szablon mo e być wykorzystywany dla typu, który nie posiada zdefinio- wanego operatora . W naszym przykładzie kod został wygenerowany na podstawie szablonu dla dwóch klas, KPV oraz UVFUVTKPI. Jeśli szablon klasy posiada składowe statyczne, zostaną utworzone dwa ich zestawy. Dla ka dego u ytego typu szablon klasy określa typ, który mo e być u ywany w pro- gramie jak ka dy zwykły typ: XQKF HQQ EQPUV %22$QQM5VCEMKPV U RCTCOGVT U LGUV UVQUGO NKED EC MQYKV[EJ ] %22$QQM5VCEMKPV KUVCEM=? KUVCEM LGUV VCDNKEæ FKGUKúEKW UVQUÎY NKED EC MQYKV[EJ _ W praktyce często wykorzystuje się polecenie V[RGFGH, aby łatwiej posługiwać się sza- blonami klas w programie: V[RGFGH %22$QQM5VCEMKPV +PV5VCEM XQKF HQQ EQPUV +PV5VCEM U RCTCOGVT U LGUV UVQUGO NKED EC MQYKV[EJ ] +PV5VCEM KUVCEM=? KUVCEM LGUV VCDNKEæ FKGUKúEKW UVQUÎY NKED EC MQYKV[EJ _ Parametry szablonów mogą być dowolnymi typami. Na przykład wskaźnikami do war- tości typu HNQCV lub nawet stosami liczb całkowitych:
  • 126. 408 C++. Programowanie zorientowane obiektowo. Vademecum profesjonalisty %22$QQM5VCEMHNQCV
  • 127. HNQCV2VT5VCEM UVQU YUMC PKMÎY FQ YCTVQ EK V[RW HNQCV %22$QQM5VCEM%22$QQM5VCEMKPV KPV5VCEM5VCEM UVQU UVQUÎY NKED EC MQYKV[EJ Istotne jest jedynie, by typy dysponowały odpowiednimi operacjami. Zauwa my, e dwa następujące po sobie znaki zamykające szablonu muszą być od- dzielone odstępem. W przeciwnym razie kompilator zinterpretuje je jako operator i zasygnalizuje błąd składni: $ ä PKGFQYQNQPG W [EKG QRGTCVQTC %22$QQM5VCEM%22$QQM5VCEMKPV KPV5VCEM5VCEM 5RGELCNKCELC UCDNQPÎY MNCU Przez specjalizację szablonów klas rozumiemy ich osobną implementację dla ró nych typów. Podobnie, jak w przypadku przecią ania szablonów klas (patrz podrozdział 7.2.5), umo liwia to optymalizację implementacji dla pewnych typów lub uniknięcie niepo ą- danego zachowania na skutek utworzenia instancji szablonu dla pewnego typu. Tworząc specjalizację szablonu klasy musimy pamiętać o utworzeniu specjalizacji wszystkich jego funkcji składowych. Mo liwe jest stworzenie specjalizacji pojedynczej funkcji składowej, ale uniemo liwia ono stworzenie specjalizacji całej klasy. Jawna specjalizacja wymaga dodania słowa VGORNCVG przed deklaracją klasy oraz ty- pu szablonu po nazwie klasy: VGORNCVG ENCUU 5VCEMUVFUVTKPI ] _ Definicja ka dej funkcji składowej musi rozpoczynać się słowem VGORNCVG , a typ 6 musi zostać zastąpiony określonym typem szablonu: VGORNCVG XQKF 5VCEMUVFUVTKPI RWUJ EQPUV UVFUVTKPI GNGO ] GNGOURWUJADCEM GNGO WOKGUEC MQRKú PC UVQUKG _ A oto kompletny przykład specjalizacji szablonu klasy 5VCEM dla typu UVFUVTKPI: VORNUVCEMJRR KPENWFG FGSWG KPENWFG UVTKPI KPENWFG UVFGZEGRV
  • 128.
  • 129.
  • 130.
  • 132.
  • 133.
  • 134.
  • 135.
  • 136.
  • 137.
  • 138.
  • 139.
  • 140.
  • 141.
  • 142.
  • 143.
  • 144.
  • 145.
  • 146.
  • 147.
  • 148.
  • 149.
  • 150.
  • 151.
  • 152.
  • 153.
  • 154.
  • 155.
  • 156.
  • 157.
  • 158.
  • 159.
  • 160.
  • 161.
  • 162.
  • 163. PCOGURCEG %22$QQM ] VGORNCVG ENCUU 5VCEMUVFUVTKPI ] RTKXCVG UVFFGSWGUVFUVTKPI GNGOU GNGOGPV[ RWDNKE
  • 164. Rozdział 7. Szablony 409 5VCEM ] MQPUVTWMVQT _ XQKF RWUJ EQPUV UVFUVTKPI WOKGUEC PQY[ GNGOGPV PC UE[EKG XQKF RQR WUWYC GNGOGPV G UE[VW UVFUVTKPI VQR EQPUV YTCEC GNGOGPV PCLFWLæE[ UKú PC UE[EKG _ XQKF 5VCEMUVFUVTKPI RWUJ EQPUV UVFUVTKPI GNGO ] GNGOURWUJADCEM GNGO WOKGUEC GNGOGPV PC UE[EKG _ XQKF 5VCEMUVFUVTKPI RQR ] KH GNGOUGORV[ ] VJTQY UVFQWVAQHATCPIG 5VCEMUVFUVTKPI RQR RWUV[ UVQU _ GNGOURQRADCEM WUWYC GNGOGPV G UE[VW _ UVFUVTKPI 5VCEMUVFUVTKPI VQR EQPUV ] KH GNGOUGORV[ ] VJTQY UVFQWVAQHATCPIG 5VCEMUVFUVTKPI VQR RWUV[ UVQU _ TGVWTP GNGOUDCEM YTCEC MQRKú GNGOGPVW PCLFWLæEGIQ UKú PC UE[EKG _ _
  • 165.
  • 166.
  • 167.
  • 169.
  • 170.
  • 171.
  • 172.
  • 173.
  • 174.
  • 175.
  • 176.
  • 177.
  • 178.
  • 179.
  • 180.
  • 181.
  • 182.
  • 183.
  • 184.
  • 185.
  • 186.
  • 187.
  • 188.
  • 189.
  • 190.
  • 191.
  • 192.
  • 193.
  • 194.
  • 195.
  • 196.
  • 197.
  • 198.
  • 199.
  • 200. Specjalizacja szablonu dla łańcuchów zastąpiła u ywany wewnętrznie wektor kolejką. Nie jest to jakaś przełomowa zmiana, ale ilustruje ona mo liwość zupełnie innej imple- mentacji szablonu klasy dla określonego typu. Zakresy wartości numerycznych zdefiniowane w bibliotece standardowej stanowią ko- lejny przykład zastosowania specjalizacji szablonów (patrz podrozdział 9.1.4). %ú EKQYC URGELCNKCELC Mo liwe jest te tworzenie częściowych specjalizacji szablonów. Na przykład dla sza- blonu klasy: VGORNCVG V[RGPCOG 6 V[RGPCOG 6 ENCUU /[%NCUU ] _ mo emy utworzyć następującą specjalizację częściową: URGELCNKCELC Eú EKQYC VCMKG UCOG RCTCOGVT[ V[RW VGORNCVG V[RGPCOG 6 ENCUU /[%NCUU66 ] _
  • 201. 410 C++. Programowanie zorientowane obiektowo. Vademecum profesjonalisty URGELCNKCELC Eú EKQYC FTWIKO RCTCOGVTGO LGUV V[R KPV VGORNCVG V[RGPCOG 6 ENCUU /[%NCUU6KPV ] _ URGELCNKCELC Eú EKQYC QDC RCTCOGVT[ Uæ YUMC PKMCOK VGORNCVG V[RGPCOG 6 V[RGPCOG 6 ENCUU /[%NCUU6
  • 202. 6
  • 203. ] _ Powy szych szablonów u ywamy w następujący sposób: /[%NCUUKPV HNQCV OKH /[%NCUU66 /[%NCUUHNQCV HNQCV OHH /[%NCUU66 /[%NCUUHNQCV KPV OHK /[%NCUU6KPV /[%NCUUKPV
  • 204. HNQCV
  • 206. 6
  • 207. Jeśli do deklaracji pasuje kilka specjalizacji częściowych, nie jest ona jednoznaczna: /[%NCUUKPVKPV O $ ä RCUWLæ /[%NCUU66 K /[%NCUU6KPV /[%NCUUKPV
  • 208. KPV
  • 209. O $ ä RCUWLæ /[%NCUU66 K /[%NCUU6
  • 210. 6
  • 211. Druga z powy szych deklaracji mo e zostać rozstrzygnięta, jeśli zdefiniowana zostanie specjalizacja dla wskaźników tego samego typu: VGORNCVG V[RGPCOG 6 ENCUU /[%NCUU6
  • 212. 6
  • 213. ] _ QO[ NPG RCTCOGVT[ UCDNQPW W przypadku szablonów klas mo emy zdefiniować domyślne wartości parametrów (nie jest to mo liwe dla szablonów funkcji). Domyślne wartości parametrów szablonu mogą odnosić się do pozostałych jego parametrów. Na przykład mo emy sparametryzować kontener u ywany do zarządzania elementami stosu i zdefiniować wektor jako domyślny typ kontenera: VORNUVCEMJRR KPENWFG XGEVQT KPENWFG UVFGZEGRV
  • 214.
  • 215.
  • 216.
  • 218.
  • 219.
  • 220.
  • 221.
  • 222.
  • 223.
  • 224.
  • 225.
  • 226.
  • 227.
  • 228.
  • 229.
  • 230.
  • 231.
  • 232.
  • 233.
  • 234.
  • 235.
  • 236.
  • 237.
  • 238.
  • 239.
  • 240.
  • 241.
  • 242.
  • 243.
  • 244.
  • 245.
  • 246.
  • 247.
  • 248.
  • 249. PCOGURCEG %22$QQM ] VGORNCVG V[RGPCOG 6 V[RGPCOG %106 UVFXGEVQT6 ENCUU 5VCEM ] RTKXCVG %106 GNGOU GNGOGPV[ RWDNKE
  • 250. Rozdział 7. Szablony 411 5VCEM MQPUVTWMVQT XQKF RWUJ EQPUV 6 WOKGUEC PQY[ GNGOGPV PC UE[EKG XQKF RQR WUWYC GNGOGPV G UE[VW 6 VQR EQPUV YTCEC GNGOGPV PCLFWLæE[ UKú PC UE[EKG _ MQPUVTWMVQT VGORNCVG V[RGPCOG 6 V[RGPCOG %106 5VCEM6%106 5VCEM ] PKG Y[MQPWLG CFP[EJ KPUVTWMELK _ VGORNCVG V[RGPCOG 6 V[RGPCOG %106 XQKF 5VCEM6%106 RWUJ EQPUV 6 GNGO ] GNGOURWUJADCEM GNGO WOKGUEC MQRKú PC UE[EKG UVQUW _ VGORNCVG V[RGPCOG 6 V[RGPCOG %106 XQKF 5VCEM6%106 RQR ] KH GNGOUGORV[ ] VJTQY UVFQWVAQHATCPIG 5VCEM RQR RWUV[ UVQU _ GNGOURQRADCEM WUWYC GNGOGPV G UE[VW UVQUW _ VGORNCVG V[RGPCOG 6 V[RGPCOG %106 6 5VCEM6%106 VQR EQPUV ] KH GNGOUGORV[ ] VJTQY UVFQWVAQHATCPIG 5VCEM VQR RWUV[ UVQU _ TGVWTP GNGOUDCEM YTCEC MQRKú GNGOGPVW PCLFWLæEGIQ UKú PC UE[EKG _ _
  • 251.
  • 252.
  • 253.
  • 255.
  • 256.
  • 257.
  • 258.
  • 259.
  • 260.
  • 261.
  • 262.
  • 263.
  • 264.
  • 265.
  • 266.
  • 267.
  • 268.
  • 269.
  • 270.
  • 271.
  • 272.
  • 273.
  • 274.
  • 275.
  • 276.
  • 277.
  • 278.
  • 279.
  • 280.
  • 281.
  • 282.
  • 283.
  • 284.
  • 285.
  • 286. Tak zdefiniowanego stosu mo emy u ywać w ten sam sposób, co poprzednich wersji szablonu, ale z dodatkową mo liwością określenia innego typu kontenera elementów: VORNUVGUVERR KPENWFG KQUVTGCO KPENWFG FGSWG KPENWFG EUVFNKD KPENWFG UVCEMJRR KPV OCKP ] VT[ ] UVQU NKED EC MQYKV[EJ %22$QQM5VCEMKPV KPV5VCEM UVQU NKED OKGPPQRTGEKPMQY[EJ %22$QQM5VCEMFQWDNGUVFFGSWGFQWDNG FDN5VCEM QRGTCELG PC UVQUKG NKED EC MQYKV[EJ
  • 287. 412 C++. Programowanie zorientowane obiektowo. Vademecum profesjonalisty KPV5VCEMRWUJ UVFEQWV KPV5VCEMVQR UVFGPFN KPV5VCEMRQR QRGTCELG PC UVQUKG NKED OKGPPQRTGEKPMQY[EJ FDN5VCEMRWUJ UVFEQWV FDN5VCEMVQR UVFGPFN FDN5VCEMRQR UVFEQWV FDN5VCEMVQR UVFGPFN FDN5VCEMRQR _ ECVEJ EQPUV EJCT
  • 288. OUI ] UVFEGTT 9[LæVGM OUI UVFGPFN TGVWTP ':+6A(#+.74' _ _ Za pomocą deklaracji: %22$QQM5VCEMFQWDNGUVFFGSWGFQWDNG utworzony został stos wartości zmiennoprzecinkowych, wykorzystujący kolejkę jako wewnętrzny kontener elementów. 2QFUWOQYCPKG Za pomocą szablonów klasy mogą być implementowane dla typów, które nie zostały jeszcze zdefiniowane. Zastosowanie szablonów klas umo liwia parametryzację kontenerów ze względu na typ ich elementów. W przypadku u ycia szablonu klasy generowany jest kod tylko dla tych funkcji składowych, które rzeczywiście są wywoływane. Implementacja szablonów klas mo e być wyspecjalizowana dla pewnych typów. Mo liwa jest tak e częściowa specjalizacja szablonu klasy. Parametry szablonów klas mogą posiadać wartości domyślne. +PPG RCTCOGVT[ UCDNQPÎY Parametry szablonów nie muszą być typami. Mogą być elementarnymi wartościami, podobnie jak parametry funkcji. W ten sposób mo emy zdefiniować grupę funkcji lub klas sparametryzowaną względem pewnych wartości. 2T[M CF CUVQUQYCPKC KPP[EJ RCTCOGVTÎY UCDNQPÎY W poni szym przykładzie zdefiniujemy kolejną wersję szablonu stosu, która będzie za- rządzać elementami stosu za pomocą zwykłej tablicy o stałym rozmiarze. Unikniemy w ten sposób kosztów związanych z dynamicznym zarządzaniem pamięcią.
  • 289. Rozdział 7. Szablony 413 Deklaracja tej wersji szablonu przedstawia się następująco: VORNUVCEMJRR KPENWFG UVFGZEGRV
  • 290.
  • 291.
  • 292.
  • 294.
  • 295.
  • 296.
  • 297.
  • 298.
  • 299.
  • 300.
  • 301.
  • 302.
  • 303.
  • 304.
  • 305.
  • 306.
  • 307.
  • 308.
  • 309.
  • 310.
  • 311.
  • 312.
  • 313.
  • 314.
  • 315.
  • 316.
  • 317.
  • 318.
  • 319.
  • 320.
  • 321.
  • 322.
  • 323.
  • 324.
  • 325. PCOGURCEG %22$QQM ] VGORNCVG V[RGPCOG 6 KPV /#:5+' ENCUU 5VCEM ] RTKXCVG 6 GNGOU=/#:5+'? GNGOGPV[ KPV PWO'NGOU DKG æEC NKEDC GNGOGPVÎY PC UVQUKG RWDNKE 5VCEM MQPUVTWMVQT XQKF RWUJ EQPUV 6 WOKGUEC PQY[ GNGOGPV PC UE[EKG XQKF RQR WUWYC GNGOGPV G UE[VW 6 VQR EQPUV YTCEC GNGOGPV PCLFWLæE[ UKú PC UE[EKG _ MQPUVTWMVQT VGORNCVG V[RGPCOG 6 KPV /#:5+' 5VCEM6/#:5+' 5VCEM PWO'NGOU DTCM GNGOGPVÎY ] PKG Y[MQPWLG CFP[EJ KPUVTWMELK _ VGORNCVG V[RGPCOG 6 KPV /#:5+' XQKF 5VCEM6/#:5+' RWUJ EQPUV 6 GNGO ] KH PWO'NGOU /#:5+' ] VJTQY UVFQWVAQHATCPIG 5VCEM RWUJ RG GP UVQU _ GNGOU=PWO'NGOU? GNGO WOKGUEC GNGOGPV Y VCDNKE[ PWO'NGOU YKúMUC NKEDú GNGOGPVÎY PC UVQUKG _ VGORNCVGV[RGPCOG 6 KPV /#:5+' XQKF 5VCEM6/#:5+' RQR ] KH PWO'NGOU ] VJTQY UVFQWVAQHATCPIG 5VCEM RQR RWUV[ UVQU _ PWO'NGOU OPKGLUC NKEDú GNGOGPVÎY _ VGORNCVG V[RGPCOG 6 KPV /#:5+' 6 5VCEM6/#:5+' VQR EQPUV ] KH PWO'NGOU ] VJTQY UVFQWVAQHATCPIG 5VCEM VQR RWUV[ UVQU _ TGVWTP GNGOU=PWO'NGOU? YTCEC MQRKú GNGOGPVW PCLFWLæEGIQ UKú PC UE[EKG _ _
  • 326.
  • 327.
  • 328.
  • 330.
  • 331.
  • 332.
  • 333.
  • 334.
  • 335.
  • 336.
  • 337.
  • 338.
  • 339.
  • 340.
  • 341.
  • 342.
  • 343.
  • 344.
  • 345.
  • 346.
  • 347.
  • 348.
  • 349.
  • 350.
  • 351.
  • 352.
  • 353.
  • 354.
  • 355.
  • 356.
  • 357.
  • 358.
  • 359.
  • 360.
  • 361.
  • 362. 414 C++. Programowanie zorientowane obiektowo. Vademecum profesjonalisty Drugi z parametrów szablonu stosu, /#:5+', określa rozmiar stosu. U ywany jest nie tylko w celu zadeklarowania odpowiedniej wielkości tablicy, ale tak e przez funkcję RWUJ w celu sprawdzenia, czy stos jest pełen. Korzystając z tej wersji szablonu stosu musimy wyspecyfikować typ elementów stosu oraz jego wielkość: VORNUVGUVERR KPENWFG KQUVTGCO KPENWFG UVTKPI KPENWFG EUVFNKD KPENWFG UVCEMJRR KPV OCKP ] VT[ ] %22$QQM5VCEMKPV KPV5VCEM UVQU YCTVQ EK EC MQYKV[EJ %22$QQM5VCEMKPV KPV5VCEM UVQU YCTVQ EK EC MQYKV[EJ %22$QQM5VCEMUVFUVTKPI UVTKPI5VCEM UVQU C EWEJÎY QRGTCELG PC UVQUKG NKED EC MQYKV[EJ KPV5VCEMRWUJ UVFEQWV KPV5VCEMVQR UVFGPFN KPV5VCEMRQR QRGTCELG PC UVQUKG C EWEJÎY UVFUVTKPI U JGNNQ UVTKPI5VCEMRWUJ U UVFEQWV UVTKPI5VCEMVQR UVFGPFN UVTKPI5VCEMRQR UVFEQWV UVTKPI5VCEMVQR UVFGPFN UVTKPI5VCEMRQR _ ECVEJ EQPUV EJCT
  • 363. OUI ] UVFEGTT 9[LæVGM OUI UVFGPFN TGVWTP ':+6A(#+.74' _ _ Warto zauwa yć, e w powy szym przykładzie stosy KPV5VCEM i KPV5VCEM posiadają ró ne typy i nie mogą być przypisywane bądź u ywane jeden zamiast drugiego. Parametry szablonu mogą posiadać wartości domyślne: VGORNCVG V[RGPCOG 6 KPV KPV /#:5+' ENCUU 5VCEM ] _ Powy szy przykład nie jest zbyt u yteczny, Domyślne wartości powinny być zgodne z intuicyjnym oczekiwaniem u ytkownika. Ani typ KPV, ani wielkość stosu równa 100 nie są intuicyjne. W takim przypadku lepiej pozostawić specyfikacje wartości parame- trów programiście aplikacji.
  • 364. Rozdział 7. Szablony 415 1ITCPKEGPKC RCTCOGVTÎY UCDNQPÎY Z u yciem innych parametrów szablonów związane są pewne ograniczenia. Parametry szablonów mogą być, oprócz typów, stałymi wyra eniami całkowitymi, adresami obiek- tów lub funkcji, które są globalnie dostępne w programie. Liczby zmiennoprzecinkowe i obiekty, których typem są klasy, nie mogą być parame- trami szablonów klas: VGORNCVG FQWDNG 8#6 $ ä YCTVQ EK OKGPPQRTGEKPMQYG FQWDNG RTQEGUU FQWDNG X PKG Uæ FQYQNQPG LCMQ RCTCOGVT[ UCDNQPÎY ] TGVWTP X
  • 365. 8#6 _ VGORNCVG UVFUVTKPI PCOG $ ä QDKGMV[ MNCU ENCUU /[%NCUU ] PKG Uæ FQYQNQPG LCMQ RCTCOGVT[ UCDNQPÎY _ Literały znakowe w roli parametrów szablonów równie mogą być przyczyną proble- mów: VGORNCVG V[RGPCOG 6 EQPUV EJCT
  • 366. PCOG ENCUU /[%NCUU ] _ /[%NCUUKPV JGNNQ Z $ ä NKVGTC JGNNQ PKG LGUV FQYQNQP[ Literały znakowe nie są bowiem globalnymi obiektami dostępnymi w dowolnym punk- cie programu. Jeśli literał JGNNQ zostanie zdefiniowany w dwóch ró nych modułach, to powstaną dwa ró ne łańcuchy. W takiej sytuacji nie pomo e nawet u ycie globalnego wskaźnika: VGORNCVG V[RGPCOG 6 EQPUV EJCT
  • 367. PCOG ENCUU /[%NCUU ] _ EQPUV EJCT
  • 368. U JGNNQ /[%NCUUKPVU Z $ ä JGNNQ LGUV CYUG UVCV[EPG Chocia wskaźnik U jest globalnie dostępny, to wskazywany przez niego łańcuch nadal nie jest globalnie dostępny. Rozwiązanie tego problemu jest następujące: VGORNCVG V[RGPCOG 6 EQPUV EJCT
  • 369. PCOG ENCUU /[%NCUU ] _ GZVGTP EQPUV EJCT U=? JGNNQ
  • 370. 416 C++. Programowanie zorientowane obiektowo. Vademecum profesjonalisty XQKF HQQ ] /[%NCUUKPVU Z RQRTCYPG _ Globalna tablica U została zainicjowana łańcuchem JGNNQ i dlatego U reprezentuje globalnie dostępny łańcuch JGNNQ . 2QFUWOQYCPKG Szablony mogą posiadać parametry, które nie są typami. Parametry te nie mogą być wartościami zmiennoprzecinkowymi lub obiektami. Nie mogą być te lokalne. Zastosowanie literałów znakowych jako parametrów szablonów mo liwe jest w ograniczonym zakresie. +PPG CICFPKGPKC YKæCPG UCDNQPCOK W podrozdziale tym przedstawione zostaną inne aspekty szablonów, które wymagają omówienia. Przedstawione zostanie zastosowanie słowa kluczowego V[RGPCOG oraz mo - liwość definiowania składowych jako szablonów. Następnie przyjrzymy się sposobom implementacji polimorfizmu za pomocą szablonów. 5 QYQ MNWEQYG V[RGPCOG Słowo kluczowe V[RGPCOG zostało wprowadzone podczas standaryzacji języka C++, aby umo liwić określenie, e dany symbol jest typem szablonu klasy. Demonstruje to po- ni szy przykład: VGORNCVG V[RGPCOG 6 ENCUU /[%NCUU ] V[RGPCOG 65WD6[RG
  • 371. RVT _ W powy szym przypadku słowo kluczowe V[RGPCOG zostało zastosowane w celu okre- ślenia, e 5WD6[RG jest typem zdefiniowanym w klasie 6. W ten sposób RVT został zade- klarowany jako wskaźnik do typu 5WD6[RG. Gdyby pominąć słowo kluczowe V[RGPCOG, kompilator przyjąłby, e symbol 5WD6[RG re- prezentuje statyczną wartość (zmienną lub obiekt) klasy 6. Wtedy wyra enie: 65WD6[RG
  • 372. RVT zostałoby zinterpretowane jako operacja mno enia tej wartości przez wartość RVT. Typowym przykładem zastosowania słowa kluczowego V[RGPCOG jest szablon funkcji, która u ywa iteratorów w celu dostępu do elementów kontenera STL (patrz podrozdział 3.5.4):
  • 373. Rozdział 7. Szablony 417 VORNRTKPVEQNNJRR KPENWFG KQUVTGCO Y[ YKGVNC GNGOGPV[ MQPVGPGTC 56. VGORNCVG V[RGPCOG 6 XQKF RTKPVEQNN EQPUV 6 EQNN ] Y[ YKGVNC NKEDú GNGOGPVÎY MQPVGPGTC UVFEQWV NKEDC GNGOGPVÎY EQNNUKG UVFGPFN Y[ YKGVNC GNGOGPV[ UVFEQWV GNGOGPV[ V[RGPCOG 6EQPUVAKVGTCVQT RQU HQT RQUEQNNDGIKP RQU EQNNGPF RQU ] UVFEQWV