• Nie Znaleziono Wyników

K. Kuczmarski, Kurs C++ Od zera do gier kodera

N/A
N/A
Protected

Academic year: 2021

Share "K. Kuczmarski, Kurs C++ Od zera do gier kodera"

Copied!
558
0
0

Pełen tekst

(1)

Od zera do gier kodera megatutorial

(2)

konstruowania jego pierwszych programów. Po nauce podstaw przychodzi czas na programowanie obiektowe, a potem zaawansowane aspekty języka - z wyjątkami i szablonami włącznie.

Kurs jest częścią megatutoriala Od zera do gier kodera.

Copyright © 2004 Karol Kuczmarski

Udziela się zezwolenia do kopiowania, rozpowszechniania i/lub modyfikacji tego dokumentu zgodnie z zasadami Licencji GNU Wolnej Dokumentacji w wersji 1.1 lub dowolnej późniejszej, opublikowanej przez Free Software Foundation; bez Sekcji Niezmiennych, bez Tekstu na Przedniej Okładce, bez Tekstu na Tylniej Okładce. Kopia licencji załączona jest w sekcji Licencja GNU Wolnej Dokumentacji.

Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi lub towarowymi ich właścicieli.

Autorzy dołożyli wszelkich starań, aby zawarte w tej publikacji informacje były kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych i autorskich. Autorzy nie

ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w tej publikacji.

Avocado Software

http://avocado.risp.pl Game Design PL

http://warsztat.pac.pl

(3)

PODSTAWY PROGRAMOWANIA __________________________ 17

Krótko o programowaniu _________________________________________ 19 Krok za krokiem _____________________________________________________________ 19 Jak rozmawiamy z komputerem? ________________________________________________ 21 Języki programowania ________________________________________________________ 23 Przegląd najważniejszych języków programowania ________________________________ 23 Brzemienna w skutkach decyzja ______________________________________________ 26 Kwestia kompilatora ________________________________________________________ 27 Podsumowanie ______________________________________________________________ 28 Pytania i zadania __________________________________________________________ 28 Pytania ________________________________________________________________ 28 Ćwiczenia ______________________________________________________________ 28 Z czego składa się program? ______________________________________ 29 C++, pierwsze starcie ________________________________________________________ 29 Bliskie spotkanie z kompilatorem______________________________________________ 29 Rodzaje aplikacji___________________________________________________________ 31 Pierwszy program__________________________________________________________ 32 Kod programu_______________________________________________________________ 33 Komentarze ______________________________________________________________ 33 Funkcja main() ___________________________________________________________ 33 Pisanie tekstu w konsoli _____________________________________________________ 34 Dołączanie plików nagłówkowych______________________________________________ 35 Procedury i funkcje___________________________________________________________ 36 Własne funkcje ____________________________________________________________ 36 Tryb śledzenia ____________________________________________________________ 37 Przebieg programu _________________________________________________________ 38 Zmienne i stałe ______________________________________________________________ 39 Zmienne i ich typy _________________________________________________________ 39 Strumień wejścia __________________________________________________________ 40 Stałe ____________________________________________________________________ 41 Operatory arytmetyczne_______________________________________________________ 42 Umiemy liczyć! ____________________________________________________________ 42 Rodzaje operatorów arytmetycznych ___________________________________________ 43 Priorytety operatorów_______________________________________________________ 44 Tajemnicze znaki __________________________________________________________ 44 Podsumowanie ______________________________________________________________ 45 Pytania i zadania __________________________________________________________ 45 Pytania ________________________________________________________________ 46 Ćwiczenia ______________________________________________________________ 46 Działanie programu _____________________________________________ 47 Funkcje nieco bliżej __________________________________________________________ 47 Parametry funkcji __________________________________________________________ 47 Wartość zwracana przez funkcję ______________________________________________ 49 Składnia funkcji ___________________________________________________________ 50 Sterowanie warunkowe _______________________________________________________ 51 Instrukcja warunkowa if ____________________________________________________ 51 Fraza else _____________________________________________________________ 53 Bardziej złożony przykład__________________________________________________ 54 Instrukcja wyboru switch ___________________________________________________ 56 Pętle ______________________________________________________________________ 58 Pętle warunkowe do i while__________________________________________________ 58 Pętla do _______________________________________________________________ 58 Pętla while_____________________________________________________________ 60

(4)

Pętla krokowa for _________________________________________________________ 62 Instrukcje break i continue _________________________________________________ 65 Podsumowanie ______________________________________________________________ 66 Pytania i zadania __________________________________________________________ 67 Pytania ________________________________________________________________ 67 Ćwiczenia ______________________________________________________________ 67 Operacje na zmiennych __________________________________________ 69 Wnikliwy rzut oka na zmienne __________________________________________________ 69 Zasięg zmiennych__________________________________________________________ 69 Zasięg lokalny __________________________________________________________ 70 Zasięg modułowy ________________________________________________________ 72 Przesłanianie nazw _______________________________________________________ 73 Modyfikatory zmiennych_____________________________________________________ 74 Zmienne statyczne _______________________________________________________ 75 Stałe __________________________________________________________________ 76 Typy zmiennych _____________________________________________________________ 76 Modyfikatory typów liczbowych _______________________________________________ 77 Typy ze znakiem i bez znaku _______________________________________________ 77 Rozmiar typu całkowitego _________________________________________________ 78 Precyzja typu rzeczywistego _______________________________________________ 79 Skrócone nazwy _________________________________________________________ 80 Pomocne konstrukcje _______________________________________________________ 80 Instrukcja typedef_______________________________________________________ 80 Operator sizeof ________________________________________________________ 81 Rzutowanie _______________________________________________________________ 83 Proste rzutowanie________________________________________________________ 84 Operator static_cast ____________________________________________________ 86 Kalkulacje na liczbach_________________________________________________________ 88 Przydatne funkcje__________________________________________________________ 88 Funkcje potęgowe _______________________________________________________ 88 Funkcje wykładnicze i logarytmiczne _________________________________________ 89 Funkcje trygonometryczne_________________________________________________ 90 Liczby pseudolosowe _____________________________________________________ 91 Zaokrąglanie liczb rzeczywistych ____________________________________________ 93 Inne funkcje ____________________________________________________________ 94 Znane i nieznane operatory __________________________________________________ 95 Dwa rodzaje ____________________________________________________________ 95 Sekrety inkrementacji i dekrementacji _______________________________________ 96 Słówko o dzieleniu _______________________________________________________ 97 Łańcuchy znaków ____________________________________________________________ 98 Napisy według C++ ________________________________________________________ 99 Typy zmiennych tekstowych ______________________________________________ 100 Manipulowanie łańcuchami znaków ___________________________________________ 100 Inicjalizacja ___________________________________________________________ 100 Łączenie napisów _______________________________________________________ 102 Pobieranie pojedynczych znaków___________________________________________ 103 Wyrażenia logiczne __________________________________________________________ 105 Porównywanie wartości zmiennych ___________________________________________ 105 Operatory logiczne ________________________________________________________ 105 Koniunkcja ____________________________________________________________ 106 Alternatywa ___________________________________________________________ 106 Negacja ______________________________________________________________ 106 Zestawienie operatorów logicznych _________________________________________ 107 Typ bool________________________________________________________________ 108 Operator warunkowy ______________________________________________________ 109 Podsumowanie _____________________________________________________________ 110 Pytania i zadania _________________________________________________________ 111 Pytania _______________________________________________________________ 111 Ćwiczenia _____________________________________________________________ 111 Złożone zmienne ______________________________________________ 113 Tablice ___________________________________________________________________ 113

(5)

Proste tablice ____________________________________________________________ 113 Inicjalizacja tablicy______________________________________________________ 115 Przykład wykorzystania tablicy ____________________________________________ 116 Więcej wymiarów _________________________________________________________ 119 Deklaracja i inicjalizacja__________________________________________________ 120 Tablice w tablicy________________________________________________________ 121 Nowe typy danych __________________________________________________________ 123 Wyliczania nadszedł czas ___________________________________________________ 123 Przydatność praktyczna __________________________________________________ 123 Definiowanie typu wyliczeniowego __________________________________________ 125 Użycie typu wyliczeniowego _______________________________________________ 126 Zastosowania __________________________________________________________ 126 Kompleksowe typy ________________________________________________________ 128 Typy strukturalne i ich definiowanie ________________________________________ 128 Struktury w akcji _______________________________________________________ 129 Odrobina formalizmu - nie zaszkodzi! _______________________________________ 131 Przykład wykorzystania struktury __________________________________________ 131 Unie _________________________________________________________________ 136 Większy projekt ____________________________________________________________ 137 Projektowanie____________________________________________________________ 138 Struktury danych w aplikacji ______________________________________________ 138 Działanie programu _____________________________________________________ 139 Interfejs użytkownika____________________________________________________ 141 Kodowanie ______________________________________________________________ 142 Kilka modułów i własne nagłówki___________________________________________ 142 Treść pliku nagłówkowego ________________________________________________ 144 Właściwy kod gry _______________________________________________________ 145 Zaczynamy __________________________________________________________________ 146 Deklarujemy zmienne __________________________________________________________ 147 Funkcja StartGry() ___________________________________________________________ 147 Funkcja Ruch() _______________________________________________________________ 147 Funkcja RysujPlansze() _______________________________________________________ 152 Funkcja main(), czyli składamy program ____________________________________ 155 Uroki kompilacji ________________________________________________________ 156 Uruchamiamy aplikację __________________________________________________ 158 Wnioski _________________________________________________________________ 158 Dziwaczne projektowanie_________________________________________________ 158 Dość skomplikowane algorytmy____________________________________________ 159 Organizacja kodu _______________________________________________________ 159 Podsumowanie _____________________________________________________________ 159 Pytania i zadania _________________________________________________________ 160 Pytania _______________________________________________________________ 160 Ćwiczenia _____________________________________________________________ 160 Obiekty______________________________________________________ 161 Przedstawiamy klasy i obiekty _________________________________________________ 161 Skrawek historii __________________________________________________________ 161 Mało zachęcające początki ________________________________________________ 161 Wyższy poziom_________________________________________________________ 162 Skostniałe standardy ____________________________________________________ 163 Obiektów czar__________________________________________________________ 163 Co dalej? _____________________________________________________________ 163 Pierwszy kontakt _________________________________________________________ 164 Obiektowy świat ________________________________________________________ 164 Wszystko jest obiektem ________________________________________________________ 164 Określenie obiektu_____________________________________________________________ 165 Obiekt obiektowi nierówny ______________________________________________________ 166 Co na to C++? _________________________________________________________ 167 Definiowanie klas _____________________________________________________________ 167 Implementacja metod __________________________________________________________ 168 Tworzenie obiektów____________________________________________________________ 168 Obiekty i klasy w C++ _______________________________________________________ 169 Klasa jako typ obiektowy ___________________________________________________ 169 Dwa etapy określania klasy _______________________________________________ 170

(6)

Definicja klasy _________________________________________________________ 170 Kontrola dostępu do składowych klasy _____________________________________________ 171 Deklaracje pól ________________________________________________________________ 174 Metody i ich prototypy__________________________________________________________ 175 Konstruktory i destruktory ______________________________________________________ 176 Coś jeszcze? _________________________________________________________________ 178 Implementacja metod ___________________________________________________ 178 Wskaźnik this _______________________________________________________________ 179 Praca z obiektami _________________________________________________________ 179 Zmienne obiektowe _____________________________________________________ 180 Deklarowanie zmiennych i tworzenie obiektów _______________________________________ 180 Żonglerka obiektami ___________________________________________________________ 180 Dostęp do składników __________________________________________________________ 182 Niszczenie obiektów ___________________________________________________________ 182 Podsumowanie _______________________________________________________________ 183 Wskaźniki na obiekty ____________________________________________________ 183 Deklarowanie wskaźników i tworzenie obiektów ______________________________________ 184 Jeden dla wszystkich, wszystkie do jednego _________________________________________ 184 Dostęp do składników __________________________________________________________ 185 Niszczenie obiektów ___________________________________________________________ 186 Stosowanie wskaźników na obiekty _______________________________________________ 187 Podsumowanie _____________________________________________________________ 188 Pytania i zadania _________________________________________________________ 188 Pytania _______________________________________________________________ 188 Ćwiczenia _____________________________________________________________ 189 Programowanie obiektowe ______________________________________ 191 Dziedziczenie ______________________________________________________________ 191 O powstawaniu klas drogą doboru naturalnego __________________________________ 192 Od prostoty do komplikacji, czyli ewolucja ___________________________________ 193 Z klasy bazowej do pochodnej, czyli dziedzictwo przodków ______________________ 194 Obiekt o kilku klasach, czyli zmienność gatunkowa_____________________________ 195 Dziedziczenie w C++ ______________________________________________________ 195 Podstawy _____________________________________________________________ 195 Definicja klasy bazowej i specyfikator protected_____________________________________ 195 Definicja klasy pochodnej _______________________________________________________ 197 Dziedziczenie pojedyncze_________________________________________________ 198 Proste przypadki ______________________________________________________________ 198 Sztafeta pokoleń ______________________________________________________________ 199 Płaskie hierarchie _____________________________________________________________ 201 Podsumowanie _______________________________________________________________ 202 Dziedziczenie wielokrotne ________________________________________________ 202 Pułapki dziedziczenia ____________________________________________________ 202 Co nie jest dziedziczone? _______________________________________________________ 202 Obiekty kompozytowe __________________________________________________________ 203 Metody wirtualne i polimorfizm ________________________________________________ 204 Wirtualne funkcje składowe _________________________________________________ 204 To samo, ale inaczej ____________________________________________________ 204 Deklaracja metody wirtualnej ____________________________________________________ 205 Przedefiniowanie metody wirtualnej _______________________________________________ 206 Pojedynek: metody wirtualne przeciwko zwykłym ____________________________________ 206 Wirtualny destruktor ___________________________________________________________ 207 Zaczynamy od zera… dosłownie____________________________________________ 209 Czysto wirtualne metody________________________________________________________ 210 Abstrakcyjne klasy bazowe ______________________________________________________ 210 Polimorfizm______________________________________________________________ 211 Ogólny kod do szczególnych zastosowań_____________________________________ 212 Sprowadzanie do bazy _________________________________________________________ 212 Klasy wiedzą same, co należy robić _______________________________________________ 215 Typy pod kontrolą ______________________________________________________ 217 Operator dynamic_cast ________________________________________________________ 217 typeid i informacje o typie podczas działania programu _______________________________ 219 Alternatywne rozwiązania _______________________________________________________ 221 Projektowanie zorientowane obiektowo __________________________________________ 223 Rodzaje obiektów _________________________________________________________ 223 Singletony ____________________________________________________________ 224 Przykłady wykorzystania ________________________________________________________ 224

(7)

Praktyczna implementacja z użyciem składowych statycznych___________________________ 225 Obiekty zasadnicze______________________________________________________ 228 Obiekty narzędziowe ____________________________________________________ 228 Definiowanie odpowiednich klas______________________________________________ 231 Abstrakcja ____________________________________________________________ 231 Identyfikacja klas _____________________________________________________________ 232 Abstrakcja klasy ______________________________________________________________ 233 Składowe interfejsu klasy _______________________________________________________ 234 Implementacja _________________________________________________________ 234 Związki między klasami ____________________________________________________ 235 Dziedziczenie i zawieranie się _____________________________________________ 235 Związek generalizacji-specjalizacji ________________________________________________ 235 Związek agregacji _____________________________________________________________ 236 Odwieczny problem: być czy mieć?________________________________________________ 237 Związek asocjacji _______________________________________________________ 237 Krotność związku______________________________________________________________ 238 Tam i (być może) z powrotem ___________________________________________________ 239 Podsumowanie _____________________________________________________________ 240 Pytania i zadania _________________________________________________________ 240 Pytania _______________________________________________________________ 241 Ćwiczenia _____________________________________________________________ 241 Wskaźniki____________________________________________________ 243 Ku pamięci ________________________________________________________________ 244 Rodzaje pamięci __________________________________________________________ 244 Rejestry procesora ______________________________________________________ 244 Zmienne przechowywane w rejestrach _____________________________________________ 245 Dostęp do rejestrów ___________________________________________________________ 246 Pamięć operacyjna ______________________________________________________ 246 Skąd się bierze pamięć operacyjna? _______________________________________________ 246 Pamięć wirtualna ______________________________________________________________ 247 Pamięć trwała__________________________________________________________ 247 Organizacja pamięci operacyjnej _____________________________________________ 247 Adresowanie pamięci ____________________________________________________ 248 Epoka niewygodnych segmentów _________________________________________________ 248 Płaski model pamięci ___________________________________________________________ 249 Stos i sterta ___________________________________________________________ 249 Czym jest stos? _______________________________________________________________ 249 O stercie ____________________________________________________________________ 250 Wskaźniki na zmienne _______________________________________________________ 250 Używanie wskaźników na zmienne____________________________________________ 250 Deklaracje wskaźników __________________________________________________ 252 Nieodżałowany spór o gwiazdkę __________________________________________________ 252 Wskaźniki do stałych ___________________________________________________________ 253 Stałe wskaźniki _______________________________________________________________ 254 Podsumowanie deklaracji wskaźników _____________________________________________ 255 Niezbędne operatory ____________________________________________________ 256 Pobieranie adresu i dereferencja__________________________________________________ 256 Wyłuskiwanie składników _______________________________________________________ 257 Konwersje typów wskaźnikowych __________________________________________ 258 Matka wszystkich wskaźników____________________________________________________ 259 Przywracanie do stanu używalności _______________________________________________ 260 Między palcami kompilatora _____________________________________________________ 260 Wskaźniki i tablice ______________________________________________________ 261 Tablice jednowymiarowe w pamięci _______________________________________________ 261 Wskaźnik w ruchu _____________________________________________________________ 262 Tablice wielowymiarowe w pamięci ________________________________________________ 263 Łańcuchy znaków w stylu C______________________________________________________ 263 Przekazywanie wskaźników do funkcji _______________________________________ 265 Dane otrzymywane poprzez parametry_____________________________________________ 265 Zapobiegamy niepotrzebnemu kopiowaniu __________________________________________ 266 Dynamiczna alokacja pamięci _______________________________________________ 268 Przydzielanie pamięci dla zmiennych ________________________________________ 268 Alokacja przy pomocy new_______________________________________________________ 268 Zwalnianie pamięci przy pomocy delete ___________________________________________ 269 Nowe jest lepsze ______________________________________________________________ 270 Dynamiczne tablice _____________________________________________________ 270

(8)

Tablice jednowymiarowe ________________________________________________________ 271 Opakowanie w klasę ___________________________________________________________ 272 Tablice wielowymiarowe ________________________________________________________ 274 Referencje ______________________________________________________________ 277 Typy referencyjne ______________________________________________________ 278 Deklarowanie referencji_________________________________________________________ 278 Prawo stałości referencji ________________________________________________________ 278 Referencje i funkcje _____________________________________________________ 279 Parametry przekazywane przez referencje __________________________________________ 279 Zwracanie referencji ___________________________________________________________ 280 Wskaźniki do funkcji _________________________________________________________ 281 Cechy charakterystyczne funkcji _____________________________________________ 282 Typ wartości zwracanej przez funkcję _______________________________________ 282 Instrukcja czy wyrażenie________________________________________________________ 283 Konwencja wywołania ___________________________________________________ 283 O czym mówi konwencja wywołania? ______________________________________________ 284 Typowe konwencje wywołania ___________________________________________________ 285 Nazwa funkcji __________________________________________________________ 286 Rozterki kompilatora i linkera ____________________________________________________ 286 Parametry funkcji_______________________________________________________ 286 Używanie wskaźników do funkcji _____________________________________________ 287 Typy wskaźników do funkcji_______________________________________________ 287 Własności wyróżniające funkcję __________________________________________________ 287 Typ wskaźnika do funkcji _______________________________________________________ 287 Wskaźniki do funkcji w C++ ______________________________________________ 288 Od funkcji do wskaźnika na nią___________________________________________________ 288 Specjalna konwencja___________________________________________________________ 289 Składnia deklaracji wskaźnika do funkcji ___________________________________________ 290 Wskaźniki do funkcji w akcji _____________________________________________________ 290 Przykład wykorzystania wskaźników do funkcji_______________________________________ 291 Zastosowania __________________________________________________________ 295 Podsumowanie _____________________________________________________________ 295 Pytania i zadania _________________________________________________________ 296 Pytania _______________________________________________________________ 296 Ćwiczenia _____________________________________________________________ 296

ZAAWANSOWANE C++ _______________________________ 299

Preprocesor __________________________________________________ 301 Pomocnik kompilatora _______________________________________________________ 301 Gdzie on jest…? __________________________________________________________ 302 Zwyczajowy przebieg budowania programu __________________________________ 302 Dodajemy preprocesor ___________________________________________________ 303 Działanie preprocesora _____________________________________________________ 304 Dyrektywy ____________________________________________________________ 304 Bez średnika _________________________________________________________________ 304 Ciekawostka: sekwencje trójznakowe ______________________________________________ 305 Preprocesor a reszta kodu ________________________________________________ 306 Makra ____________________________________________________________________ 307 Proste makra ____________________________________________________________ 307 Definiowianie prostych makr ______________________________________________ 307 Zastępowanie większych fragmentów kodu _________________________________________ 308 W kilku linijkach ____________________________________________________________ 309 Makra korzystające z innych makr ________________________________________________ 309 Pojedynek: makra kontra stałe ____________________________________________ 310 Makra nie są zmiennymi ________________________________________________________ 310 Zasięg____________________________________________________________________ 310 Miejsce w pamięci i adres _____________________________________________________ 310 Typ ______________________________________________________________________ 311 Efekty składniowe _____________________________________________________________ 311 Średnik ___________________________________________________________________ 311 Nawiasy i priorytety operatorów________________________________________________ 312 Dygresja: odpowiedź na pytanie o sens życia _____________________________________ 313 Predefiniowane makra kompilatora _________________________________________ 314 Numer linii i nazwa pliku ________________________________________________________ 314 Numer wiersza _____________________________________________________________ 314

(9)

Nazwa pliku z kodem ________________________________________________________ 315 Dyrektywa #line ___________________________________________________________ 315 Data i czas___________________________________________________________________ 315 Czas kompilacji_____________________________________________________________ 315 Czas modyfikacji pliku _______________________________________________________ 316 Typ kompilatora ______________________________________________________________ 316 Inne nazwy __________________________________________________________________ 316 Makra parametryzowane ___________________________________________________ 316 Definiowanie parametrycznych makr ________________________________________ 317 Kilka przykładów ______________________________________________________________ 318 Wzory matematyczne ________________________________________________________ 318 Skracanie zapisu____________________________________________________________ 318 Operatory preprocesora ________________________________________________________ 319 Sklejacz __________________________________________________________________ 319 Operator łańcuchujący _______________________________________________________ 319 Niebezpieczeństwa makr _________________________________________________ 320 Brak kontroli typów ____________________________________________________________ 320 Parokrotne obliczanie argumentów ________________________________________________ 321 Priorytety operatorów __________________________________________________________ 321 Zalety makrodefinicji ____________________________________________________ 322 Efektywność _________________________________________________________________ 322 Funkcje inline ______________________________________________________________ 322 Makra kontra funkcje inline ___________________________________________________ 323 Brak kontroli typów ____________________________________________________________ 323 Ciekawostka: funkcje szablonowe ______________________________________________ 323 Zastosowania makr _____________________________________________________ 324 Nie korzystajmy z makr, lecz z obiektów const____________________________________ 324 Nie korzystajmy z makr, lecz z (szablonowych) funkcji inline _________________________ 324 Korzystajmy z makr, by zastępować powtarzające się fragmenty kodu__________________ 324 Korzystajmy z makr, by skracać sobie zapis ______________________________________ 324 Korzystajmy z makr zgodnie z ich przeznaczeniem _________________________________ 325 Kontrola procesu kompilacji ___________________________________________________ 325 Dyrektywy #ifdef i #ifndef ________________________________________________ 326 Puste makra ___________________________________________________________ 326 Dyrektywa #ifdef ______________________________________________________ 326 Dyrektywa #ifndef _____________________________________________________ 327 Dyrektywa #else _______________________________________________________ 327 Dyrektywa warunkowa #if _________________________________________________ 328 Konstruowanie warunków ________________________________________________ 328 Operator defined _____________________________________________________________ 328 Złożone warunki ______________________________________________________________ 329 Skomplikowane warunki kompilacji _________________________________________ 329 Zagnieżdżanie dyrektyw ________________________________________________________ 329 Dyrektywa #elif______________________________________________________________ 330 Dyrektywa #error ______________________________________________________ 330 Reszta dobroci _____________________________________________________________ 331 Dołączanie plików _________________________________________________________ 331 Dwa warianty #include __________________________________________________ 331 Z nawiasami ostrymi ___________________________________________________________ 331 Z cudzysłowami_______________________________________________________________ 332 Który wybrać? ________________________________________________________________ 332 Nasz czy biblioteczny ________________________________________________________ 332 Ścieżki względne____________________________________________________________ 333 Zabezpieczenie przed wielokrotnym dołączaniem ______________________________ 333 Tradycyjne rozwiązanie _________________________________________________________ 333 Pomaga kompilator ____________________________________________________________ 334 Polecenia zależne od kompilatora ____________________________________________ 334 Dyrektywa #pragma _____________________________________________________ 334 Ważniejsze parametry #pragma w Visual C++ .NET ____________________________ 334 Komunikaty kompilacji _________________________________________________________ 335 message __________________________________________________________________ 335 deprecated _______________________________________________________________ 336 warning __________________________________________________________________ 336 Funkcje inline ________________________________________________________________ 337 auto_inline ______________________________________________________________ 337 inline_recursion __________________________________________________________ 338 inline_depth______________________________________________________________ 338

(10)

Inne________________________________________________________________________ 339 comment __________________________________________________________________ 339 once _____________________________________________________________________ 339 Podsumowanie _____________________________________________________________ 340 Pytania i zadania _________________________________________________________ 340 Pytania _______________________________________________________________ 340 Ćwiczenia _____________________________________________________________ 341 Zaawansowana obiektowość _____________________________________ 343 O przyjaźni ________________________________________________________________ 343 Funkcje zaprzyjaźnione ____________________________________________________ 345 Deklaracja przyjaźni z funkcją _____________________________________________ 345 Na co jeszcze trzeba zwrócić uwagę ________________________________________ 346 Funkcja zaprzyjaźniona nie jest metodą ____________________________________________ 346 Deklaracja przyjaźni jest też deklaracją funkcji ______________________________________ 347 Deklaracja przyjaźni jako prototyp funkcji ________________________________________ 347 Dodajemy definicję__________________________________________________________ 347 Klasy zaprzyjaźnione ______________________________________________________ 348 Przyjaźń z pojedynczymi metodami _________________________________________ 348 Przyjaźń z całą klasą ____________________________________________________ 349 Jeszcze kilka uwag ________________________________________________________ 351 Cechy przyjaźni klas w C++ ______________________________________________ 351 Przyjaźń nie jest automatycznie wzajemna__________________________________________ 351 Przyjaźń nie jest przechodnia ____________________________________________________ 351 Przyjaźń nie jest dziedziczna_____________________________________________________ 351 Zastosowania __________________________________________________________ 352 Wykorzystanie przyjaźni z funkcją ________________________________________________ 352 Korzyści czerpane z przyjaźni klas ________________________________________________ 352 Konstruktory w szczegółach ___________________________________________________ 352 Mała powtórka ___________________________________________________________ 352 Konstruktory __________________________________________________________ 353 Cechy konstruktorów___________________________________________________________ 353 Definiowanie _________________________________________________________________ 353 Przeciążanie _______________________________________________________________ 353 Konstruktor domyślny _______________________________________________________ 354 Kiedy wywoływany jest konstruktor _______________________________________________ 355 Niejawne wywołanie _________________________________________________________ 355 Jawne wywołanie ___________________________________________________________ 355 Inicjalizacja ___________________________________________________________ 355 Kiedy się odbywa _____________________________________________________________ 355 Jak wygląda__________________________________________________________________ 355 Inicjalizacja typów podstawowych ______________________________________________ 356 Agregaty __________________________________________________________________ 356 Inicjalizacja konstruktorem ___________________________________________________ 356 Listy inicjalizacyjne________________________________________________________ 357 Inicjalizacja składowych__________________________________________________ 357 Wywołanie konstruktora klasy bazowej ______________________________________ 358 Konstruktory kopiujące ____________________________________________________ 359 O kopiowaniu obiektów __________________________________________________ 359 Pole po polu__________________________________________________________________ 360 Gdy to nie wystarcza… _________________________________________________________ 360 Konstruktor kopiujący ___________________________________________________ 361 Do czego służy konstruktor kopiujący ______________________________________________ 361 Konstruktor kopiujący a przypisanie - różnica mała lecz ważna________________________ 362 Dlaczego konstruktor kopiujący ________________________________________________ 362 Definiowanie konstruktora kopiującego ____________________________________________ 362 Inicjalizator klasy CIntArray __________________________________________________ 363 Konwersje_______________________________________________________________ 363 Sposoby dokonywania konwersji ___________________________________________ 364 Konstruktory konwertujące ______________________________________________________ 365 Konstruktor z jednym obowiązkowym parametrem _________________________________ 365 Słówko explicit ___________________________________________________________ 367 Operatory konwersji ___________________________________________________________ 367 Stwarzamy sobie problem ____________________________________________________ 368 Definiowanie operatora konwersji ______________________________________________ 368 Wybór odpowiedniego sposobu ____________________________________________ 369 Przeciążanie operatorów______________________________________________________ 370

(11)

Cechy operatorów ________________________________________________________ 371 Liczba argumentów _____________________________________________________ 371 Operatory jednoargumentowe____________________________________________________ 372 Operatory dwuargumentowe_____________________________________________________ 372 Priorytet ______________________________________________________________ 372 Łączność______________________________________________________________ 373 Operatory w C++ _________________________________________________________ 373 Operatory arytmetyczne _________________________________________________ 374 Unarne operatory arytmetyczne __________________________________________________ 374 Inkrementacja i dekrementacja ________________________________________________ 374 Binarne operatory arytmetyczne__________________________________________________ 375 Operatory bitowe _______________________________________________________ 375 Operacje logiczno-bitowe _______________________________________________________ 375 Przesunięcie bitowe ____________________________________________________________ 376 Operatory strumieniowe ______________________________________________________ 376 Operatory porównania ___________________________________________________ 376 Operatory logiczne ______________________________________________________ 377 Operatory przypisania ___________________________________________________ 377 Zwykły operator przypisania _____________________________________________________ 378 L-wartość i r-wartość ________________________________________________________ 378 Rezultat przypisania _________________________________________________________ 379 Uwaga na przypisanie w miejscu równości________________________________________ 379 Złożone operatory przypisania ___________________________________________________ 380 Operatory wskaźnikowe __________________________________________________ 380 Pobranie adresu ______________________________________________________________ 380 Dostęp do pamięci poprzez wskaźnik ______________________________________________ 381 Dereferencja _______________________________________________________________ 381 Indeksowanie ______________________________________________________________ 381 Operatory pamięci ______________________________________________________ 382 Alokacja pamięci ______________________________________________________________ 382 new ______________________________________________________________________ 382 new[] ____________________________________________________________________ 382 Zwalnianie pamięci ____________________________________________________________ 383 delete ___________________________________________________________________ 383 delete[] _________________________________________________________________ 383 Operator sizeof ______________________________________________________________ 383 Ciekawostka: operator __alignof ______________________________________________ 384 Operatory typów _______________________________________________________ 384 Operatory rzutowania __________________________________________________________ 384 static_cast ______________________________________________________________ 384 dynamic_cast______________________________________________________________ 385 reinterpret_cast __________________________________________________________ 385 const_cast _______________________________________________________________ 386 Rzutowanie w stylu C ________________________________________________________ 386 Rzutowanie funkcyjne________________________________________________________ 386 Operator typeid ______________________________________________________________ 387 Operatory dostępu do składowych __________________________________________ 387 Wyłuskanie z obiektu __________________________________________________________ 387 Wyłuskanie ze wskaźnika _______________________________________________________ 388 Operator zasięgu ______________________________________________________________ 388 Pozostałe operatory _____________________________________________________ 388 Nawiasy okrągłe ______________________________________________________________ 388 Operator warunkowy___________________________________________________________ 389 Przecinek ____________________________________________________________________ 389 Nowe znaczenia dla operatorów ______________________________________________ 389 Funkcje operatorowe ____________________________________________________ 389 Kilka uwag wstępnych __________________________________________________________ 390 Ogólna składnia funkcji operatorowej____________________________________________ 390 Operatory, które możemy przeciążać ____________________________________________ 390 Czego nie możemy zmienić ___________________________________________________ 391 Pozostałe sprawy ___________________________________________________________ 391 Definiowanie przeciążonych wersji operatorów _______________________________________ 391 Operator jako funkcja składowa klasy ___________________________________________ 392 Problem przemienności_______________________________________________________ 393 Operator jako zwykła funkcja globalna___________________________________________ 393 Operator jako zaprzyjaźniona funkcja globalna ____________________________________ 394 Sposoby przeciążania operatorów __________________________________________ 394 Najczęściej stosowane przeciążenia _______________________________________________ 394

(12)

Typowe operatory jednoargumentowe ___________________________________________ 395 Inkrementacja i dekrementacja ________________________________________________ 396 Typowe operatory dwuargumentowe ____________________________________________ 397 Operatory przypisania _______________________________________________________ 399 Operator indeksowania _________________________________________________________ 402 Operatory wyłuskania __________________________________________________________ 404 Operator -> _______________________________________________________________ 404 Ciekawostka: operator ->*____________________________________________________ 406 Operator wywołania funkcji______________________________________________________ 407 Operatory zarządzania pamięcią __________________________________________________ 409 Lokalne wersje operatorów____________________________________________________ 410 Globalna redefinicja _________________________________________________________ 411 Operatory konwersji ___________________________________________________________ 412 Wskazówki dla początkującego przeciążacza __________________________________ 412 Zachowujmy sens, logikę i konwencję _____________________________________________ 412 Symbole operatorów powinny odpowiadać ich znaczeniom ___________________________ 412 Zapewnijmy analogiczne zachowania jak dla typów wbudowanych _____________________ 413 Nie przeciążajmy wszystkiego ____________________________________________________ 413 Wskaźniki do składowych klasy ________________________________________________ 414 Wskaźnik na pole klasy ____________________________________________________ 414 Wskaźnik do pola wewnątrz obiektu ________________________________________ 414 Wskaźnik na obiekt ____________________________________________________________ 414 Pokazujemy na składnik obiektu __________________________________________________ 415 Wskaźnik do pola wewnątrz klasy __________________________________________ 415 Miejsce pola w definicji klasy ____________________________________________________ 416 Pobieranie wskaźnika __________________________________________________________ 417 Deklaracja wskaźnika na pole klasy _______________________________________________ 418 Użycie wskaźnika _____________________________________________________________ 419 Wskaźnik na metodę klasy __________________________________________________ 420 Wskaźnik do statycznej metody klasy _______________________________________ 420 Wskaźnik do niestatycznej metody klasy_____________________________________ 421 Wykorzystanie wskaźników na metody _____________________________________________ 421 Deklaracja wskaźnika ________________________________________________________ 421 Pobranie wskaźnika na metodę klasy ____________________________________________ 423 Użycie wskaźnika ___________________________________________________________ 423 Ciekawostka: wskaźnik do metody obiektu__________________________________________ 423 Wskaźnik na metodę obiektu konkretnej klasy ____________________________________ 425 Wskaźnik na metodę obiektu dowolnej klasy ______________________________________ 427 Podsumowanie _____________________________________________________________ 430 Pytania i zadania _________________________________________________________ 430 Pytania _______________________________________________________________ 430 Ćwiczenia _____________________________________________________________ 431 Wyjątki______________________________________________________ 433 Mechanizm wyjątków w C++ __________________________________________________ 433 Tradycyjne metody obsługi błędów ___________________________________________ 434 Dopuszczalne sposoby ___________________________________________________ 434 Zwracanie nietypowego wyniku __________________________________________________ 434 Specjalny rezultat___________________________________________________________ 435 Wady tego rozwiązania_______________________________________________________ 435 Oddzielenie rezultatu od informacji o błędzie ________________________________________ 436 Wykorzystanie wskaźników ___________________________________________________ 436 Użycie struktury ____________________________________________________________ 437 Niezbyt dobre wyjścia ___________________________________________________ 438 Wywołanie zwrotne ____________________________________________________________ 438 Uwaga o wygodnictwie _______________________________________________________ 438 Uwaga o logice _____________________________________________________________ 439 Uwaga o niedostatku mechanizmów_____________________________________________ 439 Zakończenie programu _________________________________________________________ 439 Wyjątki _________________________________________________________________ 439 Rzucanie i łapanie wyjątków ______________________________________________ 440 Blok try-catch _______________________________________________________________ 440 Instrukcja throw ______________________________________________________________ 441 Wędrówka wyjątku __________________________________________________________ 441 throw a return ____________________________________________________________ 441 Właściwy chwyt ________________________________________________________ 442 Kolejność bloków catch ________________________________________________________ 443 Dopasowywanie typu obiektu wyjątku ___________________________________________ 444

(13)

Szczegóły przodem__________________________________________________________ 445 Zagnieżdżone bloki try-catch ___________________________________________________ 446 Złapanie i odrzucenie ________________________________________________________ 448 Blok catch(...), czyli chwytanie wszystkiego ____________________________________ 448 Odwijanie stosu ____________________________________________________________ 449 Między rzuceniem a złapaniem_______________________________________________ 449 Wychodzenie na wierzch _________________________________________________ 449 Porównanie throw z break i return _______________________________________________ 450 Wyjątek opuszcza funkcję _______________________________________________________ 450 Specyfikacja wyjątków _______________________________________________________ 451 Kłamstwo nie popłaca________________________________________________________ 451 Niezłapany wyjątek ____________________________________________________________ 453 Porządki ______________________________________________________________ 454 Niszczenie obiektów lokalnych ___________________________________________________ 454 Wypadki przy transporcie _______________________________________________________ 454 Niedozwolone rzucenie wyjątku ________________________________________________ 454 Strefy bezwyjątkowe ________________________________________________________ 455 Skutki wypadku ____________________________________________________________ 456 Zarządzanie zasobami w obliczu wyjątków _____________________________________ 456 Opakowywanie _________________________________________________________ 458 Destruktor wskaźnika?… ________________________________________________________ 459 Sprytny wskaźnik _____________________________________________________________ 459 Nieco uwag __________________________________________________________________ 461 Różne typy wskaźników ______________________________________________________ 461 Używajmy tylko tam, gdzie to konieczne _________________________________________ 461 Co już zrobiono za nas ___________________________________________________ 461 Klasa std::auto_ptr __________________________________________________________ 461 Pliki w Bibliotece Standardowej___________________________________________________ 462 Wykorzystanie wyjątków _____________________________________________________ 463 Wyjątki w praktyce________________________________________________________ 463 Projektowanie klas wyjątków ______________________________________________ 464 Definiujemy klasę _____________________________________________________________ 464 Hierarchia wyjątków ___________________________________________________________ 465 Organizacja obsługi wyjątków _____________________________________________ 466 Umiejscowienie bloków try i catch _______________________________________________ 466 Kod warstwowy_____________________________________________________________ 466 Podawanie błędów wyżej _____________________________________________________ 467 Dobre wypośrodkowanie______________________________________________________ 467 Chwytanie wyjątków w blokach catch _____________________________________________ 468 Szczegóły przodem - druga odsłona_____________________________________________ 468 Lepiej referencją____________________________________________________________ 469 Uwagi ogólne ____________________________________________________________ 469 Korzyści ze stosowania wyjątków __________________________________________ 469 Informacja o błędzie w każdej sytuacji _____________________________________________ 469 Uproszczenie kodu ____________________________________________________________ 470 Wzrost niezawodności kodu _____________________________________________________ 470 Nadużywanie wyjątków __________________________________________________ 471 Nie używajmy ich tam, gdzie wystarczą inne konstrukcje ______________________________ 471 Nie używajmy wyjątków na siłę __________________________________________________ 471 Podsumowanie _____________________________________________________________ 472 Pytania i zadania _________________________________________________________ 472 Pytania _______________________________________________________________ 472 Ćwiczenia _____________________________________________________________ 472 Szablony ____________________________________________________ 473 Podstawy _________________________________________________________________ 474 Idea szablonów___________________________________________________________ 474 Ścisłość C++ powodem bólu głowy _________________________________________ 474 Dwa typowe problemy__________________________________________________________ 474 Problem 1: te same funkcje dla różnych typów ____________________________________ 474 Problem 2: klasy operujące na dowolnych typach danych ____________________________ 475 Możliwe rozwiązania ___________________________________________________________ 475 Wykorzystanie preprocesora __________________________________________________ 475 Używanie ogólnych typów ____________________________________________________ 475 Szablony jako rozwiązanie ________________________________________________ 476 Kod niezależny od typu _________________________________________________________ 476 Kompilator to potrafi ___________________________________________________________ 476 Składnia szablonu___________________________________________________________ 476

(14)

Co może być szablonem ______________________________________________________ 477 Szablony funkcji __________________________________________________________ 478 Definiowanie szablonu funkcji _____________________________________________ 478 Podstawowa definicja szablonu funkcji _____________________________________________ 478 Stosowalność definicji________________________________________________________ 479 Parametr szablonu użyty w ciele funkcji__________________________________________ 479 Parametr szablonu i parametr funkcji____________________________________________ 480 Kilka parametrów szablonu ___________________________________________________ 480 Specjalizacja szablonu funkcji ____________________________________________________ 481 Wyjątkowy przypadek _______________________________________________________ 482 Ciekawostka: specjalizacja częściowa szablonu funkcji ______________________________ 482 Wywoływanie funkcji szablonowej __________________________________________ 483 Jawne określenie typu __________________________________________________________ 484 Wywoływanie konkretnej wersji funkcji szablonowej ________________________________ 484 Użycie wskaźnika na funkcję szablonową_________________________________________ 484 Dedukcja typu na podstawie argumentów funkcji_____________________________________ 485 Jak to działa _______________________________________________________________ 485 Dedukcja przy wykorzystaniu kilku parametrów szablonu ____________________________ 486 Szablony klas ____________________________________________________________ 487 Definicja szablonu klas___________________________________________________ 487 Prosty przykład tablicy _________________________________________________________ 488 Definiujemy szablon _________________________________________________________ 489 Implementacja metod poza definicją ____________________________________________ 490 Korzystanie z tablicy_________________________________________________________ 491 Dziedziczenie i szablony klas_____________________________________________________ 492 Dziedziczenie klas szablonowych _______________________________________________ 492 Dziedziczenie szablonów klas __________________________________________________ 493 Deklaracje w szablonach klas ____________________________________________________ 494 Aliasy typedef _____________________________________________________________ 494 Deklaracje przyjaźni _________________________________________________________ 495 Szablony funkcji składowych __________________________________________________ 495 Korzystanie z klas szablonowych ___________________________________________ 497 Tworzenie obiektów____________________________________________________________ 497 Stwarzamy obiekt klasy szablonowej ____________________________________________ 497 Co się dzieje, gdy tworzymy obiekt szablonu klasy _________________________________ 498 Funkcje operujące na obiektach klas szablonowych ___________________________________ 500 Specjalizacje szablonów klas ______________________________________________ 501 Specjalizowanie szablonu klasy___________________________________________________ 501 Własna klasa specjalizowana __________________________________________________ 501 Specjalizacja metody klasy____________________________________________________ 503 Częściowa specjalizacja szablonu klasy_____________________________________________ 504 Problem natury tablicowej ____________________________________________________ 504 Rozwiązanie: przypadek szczególniejszy, ale nie za bardzo___________________________ 504 Domyślne parametry szablonu klasy_______________________________________________ 506 Typowy typ ________________________________________________________________ 506 Skorzystanie z poprzedniego parametru _________________________________________ 508 Więcej informacji ___________________________________________________________ 508 Parametry szablonów ______________________________________________________ 508 Typy _________________________________________________________________ 509 Przypominamy banalny przykład__________________________________________________ 509 class zamiast typename ________________________________________________________ 510 Stałe _________________________________________________________________ 510 Użycie parametrów pozatypowych ________________________________________________ 510 Przykład szablonu klasy ______________________________________________________ 511 Przykład szablonu funkcji _____________________________________________________ 512 Dwie wartości, dwa różne typy_________________________________________________ 512 Ograniczenia dla parametrów pozatypowych ________________________________________ 513 Wskaźniki jako parametry szablonu _____________________________________________ 513 Inne restrykcje _____________________________________________________________ 514 Szablony parametrów ___________________________________________________ 514 Idąc za potrzebą ______________________________________________________________ 514 Dodatkowy parametr: typ wewnętrznej tablicy ____________________________________ 515 Drobna niedogodność ________________________________________________________ 516 Deklarowanie szablonowych parametrów szablonów __________________________________ 516 Problemy z szablonami_____________________________________________________ 517 Ułatwienia dla kompilatora________________________________________________ 517 Nawiasy ostre ________________________________________________________________ 518 Nieoczywisty przykład _______________________________________________________ 518 Ciekawostka: dlaczego tak się dzieje ____________________________________________ 518 Nazwy zależne________________________________________________________________ 519

Cytaty

Powiązane dokumenty

„Nie umiał!” a dyrektor tego szpitala abramowickiego, wiadomo że to jest psychiatryczny szpital, Brennenstuhl, był absolwentem liceum Staszica, zadzwonił do pani

wodzących, że proces fundacyjny jest już w toku. Rzadko natomiast udaje się uchwycić źródłowo moment, w którym podjęta została przez fundatora sama myśl

nie duszy — zazwyczaj przyjmuje się bowiem, że dusza jest tym składnikiem człowieka, który po śmierci ciała nie ginie, lecz przebywa w jakiejś rzeczywis­.. tości

3p – poprawne metody, obliczenia i odpowiedź z jednostką 2p – poprawna metoda obliczenia wymiarów obszaru, na którym może stać namiot (9m x 19m) i poprawna metoda obliczenia

Poprawną metodę uznajemy, gdy uczeń wykorzysta odpowiednie dane z zadania, a np. popełni błąd rachunkowy, przestawi cyfry. Za poprawne obliczenia przyznajemy punkt pod warunkiem,

Wszystkie poprawne odpowiedzi - 3p Trzy lub cztery poprawne odpowiedzi – 2p Tylko dwie poprawne odpowiedzi – 1p Jedna odpowiedź poprawna lub żadna –

1 UoZL „bada- nie lub udzielenie pacjentowi innego świadczenia zdrowotnego bez jego zgody jest dopuszczalne, jeżeli wy- maga on niezwłocznej pomocy lekar- skiej,

Zespół powołany przez ministra zdrowia zaproponował jeden organ tworzący i podział szpitali na cztery grupy w zależności od ich kondycji finansowej?. Z ujednolicenia szybko