Opus magnum C++. Programowanie w języku C++. Wydanie 3 poprawione. Komplet - ebook
Opus magnum C++. Programowanie w języku C++. Wydanie 3 poprawione. Komplet - ebook
Jedno C i same plusy!
Dawno, dawno temu, w głębokich latach osiemdziesiątych ubiegłego wieku pewien duński informatyk zainspirowany językiem C opracował jeden z najważniejszych, najbardziej elastycznych i do dziś niezastąpionych języków programowania — C++. Dziś ten język jest wykorzystywany do tworzenia gier komputerowych, obliczeń naukowych, technicznych, w medycynie, przemyśle i bankowości. NASA posługuje się nim w naziemnej kontroli lotów. Duża część oprogramowania Międzynarodowej Stacji Kosmicznej została napisana w tym języku. Nawet w marsjańskim łaziku Curiosity pracuje program w C++, który analizuje obraz z kamer i planuje dalszą trasę.
Autor tej książki — wybitny specjalista pracujący nad wieloma znaczącymi projektami we francuskich, niemieckich i włoskich instytutach fizyki jądrowej, znany czytelnikom m.in. z genialnej Symfonii C++ — postawił sobie za cel napisanie nowej, przekrojowej książki o tym języku, która w prostym, wręcz przyjacielskim stylu wprowadza czytelnika w fascynujący świat programowania zorientowanego obiektowo. Zobacz, jak potężny jest dzisiaj C++ 11.
Jeżeli chcesz nauczyć się tego języka w łatwy, pogodny, przyjazny sposób, ta książka jest właśnie dla Ciebie.
Dzięki tej książce poznasz:
- Proste i złożone typy danych
- Instrukcje sterujące
- Funkcje i operatory
- Wskaźniki
- Klasy i dziedziczenie
- Obsługę wyjątków
- Wyrażenia lambda
- Operacje wejścia-wyjścia
- Projektowanie orientowane obiektowo
- Szablony
Spis treści
0 Proszę tego nie czytać! 1
- 0.1 Zaprzyjaźnijmy się! 1
1 Startujemy! 8
- 1.1 Pierwszy program 8
- 1.2 Drugi program 13
- 1.3 Ćwiczenia 18
2 Instrukcje sterujące 20
- 2.1 Prawda - fałsz, czyli o warunkach 20
- 2.1.1 Wyrażenie logiczne 20
- 2.1.2 Zmienna logiczna bool w roli warunku 21
- 2.1.3 Stare dobre sposoby z dawnego C++ 21
- 2.2 Instrukcja warunkowa if 22
- 2.3 Pętla while 26
- 2.4 Pętla do...while... 27
- 2.5 Pętla for 28
- 2.6 Instrukcja switch 31
- 2.7 Co wybrać: switch czy if...else? 33
- 2.8 Instrukcja break 36
- 2.9 Instrukcja goto 37
- 2.10 Instrukcja continue 39
- 2.11 Klamry w instrukcjach sterujących 40
- 2.12 Ćwiczenia 41
3 Typy 44
- 3.1 Deklaracje typu 44
- 3.2 Systematyka typów z języka C++ 45
- 3.3 Typy fundamentalne 46
- 3.3.1 Typy przeznaczone do pracy z liczbami całkowitymi 46
- 3.3.2 Typy do przechowywania znaków alfanumerycznych 47
- 3.3.3 Typy reprezentujące liczby zmiennoprzecinkowe 47
- 3.3.4 bool - typ do reprezentacji obiektów logicznych 48
- 3.3.5 Kwestia dokładności 49
- 3.3.6 Jak poznać limity (ograniczenia) typów wbudowanych 51
- 3.4 Typy o precyzyjnie żądanej szerokości 55
- 3.5 InicjaLIZAcja, czyli nadanie wartości w momencie narodzin 59
- 3.6 Definiowanie obiektów "w biegu" 60
- 3.7 Stałe dosłowne 62
- 3.7.1 Stałe dosłowne typu bool 63
- 3.7.2 Stałe będące liczbami całkowitymi 63
- 3.7.3 Stałe reprezentujące liczby zmiennoprzecinkowe 66
- 3.7.4 Stała dosłowna nullptr - dla wskaźników 67
- 3.7.5 Stałe znakowe 68
- 3.7.6 Stałe tekstowe, napisy, albo po prostu stringi 71
- 3.7.7 Surowe stałe tekstowe (napisy, stringi) 73
- 3.8 Typy złożone 76
- 3.9 Typ void 77
- 3.10 Zakres ważności nazwy obiektu a czas życia obiektu 78
- 3.10.1 Zakres: lokalny 78
- 3.10.2 Zakres: instrukcja 79
- 3.10.3 Zakres: blok funkcji 79
- 3.10.4 Zakres: obszar pliku 80
- 3.10.5 Zakres: obszar klasy 80
- 3.10.6 Zakres określony przez przestrzeń nazw 80
- 3.11 Zasłanianie nazw 85
- 3.12 Specyfikator (przydomek) const 87
- 3.13 Specyfikator (przydomek) constexpr 88
- 3.14 Obiekty register 92
- 3.15 Specyfikator volatile 93
- 3.16 using oraz typedef - tworzenie dodatkowej nazwy typu 94
- 3.17 Typy wyliczeniowe enum 97
- 3.17.1 Dawne zwykłe enum a nowe zakresowe enum class 103
- 3.17.2 Kilka uwag dla wtajemniczonych 106
- 3.18 auto, czyli automatyczne rozpoznawanie typu definiowanego obiektu 106
- 3.19 decltype - operator do określania typu zadanego wyrażenia 110
- 3.20 Inicjalizacja z pustą klamą { }, czyli wartością domniemaną 111
- 3.21 Przydomek alignas - adresy równe i równiejsze 114
- 3.22 Ćwiczenia 115
4 Operatory 120
- 4.1 Operatory arytmetyczne 120
- 4.1.1 Operator %, czyli reszta z dzielenia (modulo) 121
- 4.1.2 Jednoargumentowe operatory + i - 122
- 4.1.3 Operatory inkrementacji i dekrementacji 122
- 4.1.4 Operator przypisania = 124
- 4.2 Operatory logiczne 125
- 4.2.1 Operatory relacji 125
- 4.2.2 Operatory sumy logicznej || oraz iloczynu logicznego && 126
- 4.2.3 Wykrzyknik !, czyli operator negacji 128
- 4.3 Operatory bitowe 128
- 4.3.1 Przesuniecie w lewo << 129
- 4.3.2 Przesunięcie w prawo >> 130
- 4.3.3 Bitowe operatory sumy, iloczynu, negacji, różnicy symetrycznej 131
- 4.4 Różnica między operatorami logicznymi a operatorami bitowymi 131
- 4.5 Pozostałe operatory przypisania 133
- 4.6 Operator uzyskiwania adresu (operator &) 135
- 4.7 Wyrażenie warunkowe 135
- 4.8 Operator sizeof 137
- 4.9 Operator noexcept 138
- 4.10 Deklaracja static_assert 138
- 4.11 Operator alignof informujący o najkorzystniejszym wyrównaniu adresu 141
- 4.12 Operatory rzutowania 142
- 4.12.1 Rzutowanie według tradycyjnych (niezalecanych) sposobów 142
- 4.12.2 Rzutowanie za pomoca nowych operatorów rzutowania 144
- 4.12.3 Operator static_cast 144
- 4.12.4 Operator const_cast 147
- 4.12.5 Operator dynamic_cast 148
- 4.12.6 Operator reinterpret_cast 148
- 4.13 Operator: przecinek 149
- 4.14 Priorytety operatorów 150
- 4.15 Łączność operatorów 152
- 4.16 Ćwiczenia 153
5 Typ string i typ vector - pierwsza wzmianka 157
- 5.1 Typ std::string do pracy z tekstami 157
- 5.2 Typ vector - długi rząd obiektów 162
- 5.3 Zakresowe for 170
- 5.4 Ćwiczenia 173
6 Funkcje 175
- 6.1 Definicja funkcji i jej wywołanie 175
- 6.2 Deklaracja funkcji 176
- 6.3 Funkcja czesto wywołuje inna funkcję 178
- 6.4 Zwracanie przez funkcję rezultatu 178
- 6.4.1 Obiekt tworzony za pomocą auto, a inicjalizowany rezultatem funkcji 180
- 6.4.2 O zwracaniu (lub niezwracaniu) rezultatu przez funkcję main 181
- 6.5 Nowy, alternatywny sposób deklaracji funkcji 182
- 6.6 Stos 184
- 6.7 Przesyłanie argumentów do funkcji przez wartość 185
- 6.8 Przesyłanie argumentów przez referencję 186
- 6.9 Pożyteczne określenia: l-wartość i r-wartość 189
- 6.10 Referencje do l-wartości i referencje do r-wartości jako argumenty funkcji 191
- 6.10.1 Który sposób przesyłania argumentu do funkcji wybrać? 198
- 6.11 Kiedy deklaracja funkcji nie jest konieczna? 199
- 6.12 Argumenty domniemane 200
- 6.12.1 Ciekawostki na temat argumentów domniemanych 203
- 6.13 Nienazwany argument 208
- 6.14 Funkcje inline (w linii) 209
- 6.15 Przypomnienie o zakresie ważności nazw deklarowanych wewnatrz funkcji 213
- 6.16 Wybór zakresu ważności nazwy i czasu życia obiektu 213
- 6.16.1 Obiekty globalne 213
- 6.16.2 Obiekty automatyczne 214
- 6.16.3 Obiekty lokalne statyczne 215
- 6.17 Funkcje w programie składającym się z kilku plików 219
- 6.17.1 Nazwy statyczne globalne 223
- 6.18 Funkcja zwracająca rezultat będący referencją l-wartości 224
- 6.19 Funkcje rekurencyjne 229
- 6.20 Funkcje biblioteczne 238
- 6.21 Funkcje constexpr 241
- 6.21.1 Wymogi, które musi spełniać funkcja constexpr (w standardzie C++11) 243
- 6.21.2 Przykład pokazujący aspekty funkcji constexpr 244
- 6.21.3 Argumenty funkcji constexpr będące referencjami 253
- 6.22 Definiowanie referencji przy użyciu słowa auto 254
- 6.22.1 Gdy inicjalizatorem jest wywołanie funkcji zwracającej referencję 261
- 6.23 Ćwiczenia 264
7 Preprocesor 270
- 7.1 Dyrektywa pusta # 270
- 7.2 Dyrektywa #define 270
- 7.3 Dyrektywa #undef 272
- 7.4 Makrodefinicje 273
- 7.5 Sklejacz nazw argumentów, czyli operator ## 275
- 7.6 Parametr aktualny makrodefinicji - w postaci tekstu 276
- 7.7 Dyrektywy kompilacji warunkowej 276
- 7.8 Dyrektywa #error 280
- 7.9 Dyrektywa #line 281
- 7.10 Wstawianie treści innych plików do tekstu kompilowanego właśnie pliku 281
- 7.11 Dyrektywy zależne od implementacji 283
- 7.12 Nazwy predefiniowane 283
- 7.13 Ćwiczenia 286
8 Tablice 289
- 8.1 Co to jest tablica 289
- 8.2 Elementy tablicy 290
- 8.3 Inicjalizacja tablic 292
- 8.4 Przekazywanie tablicy do funkcji 293
- 8.5 Przykład z tablicą elementów typu enum 297
- 8.6 Tablice znakowe 299
- 8.7 Ćwiczenia 307
9 Tablice wielowymiarowe 312
- 9.1 Tablica tablic 312
- 9.2 Przykład programu pracującego z tablicą dwuwymiarową 314
- 9.3 Gdzie w pamięci jest dany element tablicy 316
- 9.4 Typ wyrażeń związanych z tablicą wielowymiarową 316
- 9.5 Przesyłanie tablic wielowymiarowych do funkcji 318
- 9.6 Ćwiczenia 320
10 Wektory wielowymiarowe 322
- 10.1 Najpierw przypomnienie istotnych tu cech klasy vector 322
- 10.2 Jak za pomoca klasy vector budować tablice wielowymiarowe 323
- 10.3 Funkcja pokazująca zawartość wektora dwuwymiarowego 324
- 10.4 Definicja dwuwymiarowego wektora - pustego 326
- 10.5 Definicja wektora dwuwymiarowego z listą inicjalizatorów 327
- 10.6 Wektor dwuwymiarowy o żądanych rozmiarach, choć bez inicjalizacji 328
- 10.7 Zmiana rozmiaru wektora 2D funkcją resize 329
- 10.8 Zmiany rozmiaru wektora 2D funkcjami push_back, pop_back 330
- 10.9 Zmniejszanie rozmiaru wektora dwuwymiarowego funkcją pop_back 333
- 10.10 Funkcje mogące modyfikować treść wektora 2D 333
- 10.11 Wysłanie rzędu wektora 2D do funkcji pracującej z wektorem 1D 335
- 10.12 Całośc przykładu definiującego wektory dwuwymiarowe 336
- 10.13 Po co są dwuwymiarowe wektory nieprostokątne 336
- 10.14 Wektory trójwymiarowe 338
- 10.15 Sposoby definicji wektora 3D o ustalonych rozmiarach 341
- 10.16 Nadawanie pustemu wektorowi 3D wymaganych rozmiarów 345
- 10.16.1 Zmiana rozmiarów wektora 3D funkcjami resize 345
- 10.16.2 Zmiana rozmiarów wektora 3D funkcjami push_back 347
- 10.17 Trójwymiarowe wektory 3D - nieprostopadłościenne 348
- 10.18 Ćwiczenia 352
11 Wskaźniki - wiadomości wstępne 354
- 11.1 Wskaźniki mogą bardzo ułatwić życie 354
- 11.2 Definiowanie wskaźników 356
- 11.3 Praca ze wskaźnikiem 357
- 11.4 Definiowanie wskaźnika z użyciem auto 360
- 11.5 Wyrażenie *wskaźnik jest l-wartością 361
- 11.6 Operator rzutowania reinterpret_cast a wskaźniki 361
- 11.7 Wskaźniki typu void* 364
- 11.8 Strzał na oślep - wskaźnik zawsze na coś wskazuje 366
- 11.8.1 Wskaźnik wolno porównać z adresem zero - nullptr 368
- 11.9 Ćwiczenia 368
12 Cztery domeny zastosowania wskaźników 370
- 12.1 Zastosowanie wskaźników wobec tablic 370
- 12.1.1 Ćwiczenia z mechaniki ruchu wskaźnika 370
- 12.1.2 Użycie wskaźnika w pracy z tablicą 374
- 12.1.3 Arytmetyka wskaźników 378
- 12.1.4 Porównywanie wskaźników 380
- 12.2 Zastosowanie wskaźników w argumentach funkcji 381
- 12.2.1 Jeszcze raz o przesyłaniu tablic do funkcji 385
- 12.2.2 Odbieranie tablicy jako wskaźnika 385
- 12.2.3 Argument formalny będący wskaźnikiem do obiektu const 387
- 12.3 Zastosowanie wskaźników przy dostępie do konkretnych komórek pamięci 390
- 12.4 Rezerwacja obszarów pamięci 391
- 12.4.1 Operatory new i delete albo Oratorium Stworzenie Świata 392
- 12.4.2 Operator new a słowo kluczowe auto 396
- 12.4.3 Inicjalizacja obiektu tworzonego operatorem new 396
- 12.4.4 Operatorem new możemy także tworzyć obiekty stałe 397
- 12.4.5 Dynamiczna alokacja tablicy 398
- 12.4.6 Tablice wielowymiarowe tworzone operatorem new 399
- 12.4.7 Umiejscawiający operator new 402
- 12.4.8 "Przychodzimy, odchodzimy - cichuteńko, na..." 407
- 12.4.9 Zapas pamięci to nie studnia bez dna 409
- 12.4.10 Nowy sposób powiadomienia: rzucenie wyjątku std::bad_alloc 410
- 12.4.11 Funkcja set_new_handler 412
- 12.5 Ćwiczenia 414
13 Wskaźniki - runda trzecia 418
- 13.1 Stałe wskaźniki 418
- 13.2 Stałe wskaźniki a wskaźniki do stałych 419
- 13.2.1 Wierzch i głębia 420
- 13.3 Definiowanie wskaźnika z użyciem auto 421
- 13.3.1 Symbol zastępczy auto a opuszczanie gwiazdki przy definiowaniu wskaźnika 424
- 13.4 Sposoby ustawiania wskaźników 426
- 13.5 Parada kłamców, czyli o rzutowaniu const_cast 428
- 13.6 Tablice wskaźników 432
- 13.7 Wariacje na temat C-stringów 434
- 13.8 Argumenty z linii wywołania programu 441
- 13.9 Ćwiczenia 444
14 Wskaźniki do funkcji 446
- 14.1 Wskaźnik, który może wskazywać na funkcję 446
- 14.2 Ćwiczenia z definiowania wskaźników do funkcji 449
- 14.3 Wskaźnik do funkcji jako argument innej funkcji 455
- 14.4 Tablica wskaźników do funkcji 459
- 14.5 Użycie deklaracji using i typedef w świecie wskaźników 464
- 14.5.1 Alias przydatny w argumencie funkcji 464
- 14.5.2 Alias przydatny w definicji tablicy wskaźników do funkcji 465
- 14.6 Użycie auto lub decltype do automatycznego rozpoznania potrzebnego typu 466
- 14.7 Ćwiczenia 468
15 Przeładowanie nazwy funkcji 470
- 15.1 Co oznacza przeładowanie 470
- 15.2 Przeładowanie od kuchni 473
- 15.3 Jak możemy przeładowywać, a jak się nie da? 473
- 15.4 Czy przeładowanie nazw funkcji jest techniką orientowaną obiektowo? 476
- 15.5 Linkowanie z modułami z innych języków 477
- 15.6 Przeładowanie a zakres ważności deklaracji funkcji 478
- 15.7 Rozważania o identyczności lub odmienności typów argumentów 480
- 15.7.1 Przeładowanie a typy tworzone z using lub typedef oraz typy enum 481
- 15.7.2 Tablica a wskaźnik 481
- 15.7.3 Pewne szczegóły o tablicach wielowymiarowych 482
- 15.7.4 Przeładowanie a referencja 484
- 15.7.5 Identyczność typów: T, const T, volatile T 485
- 15.7.6 Przeładowanie a typy: T*, volatile T*, const T* 486
- 15.7.7 Przeładowanie a typy: T&, volatile T&, const T& 487
- 15.8 Adres funkcji przeładowanej 488
- 15.8.1 Zwrot rezultatu będącego adresem funkcji przeładowanej 490
- 15.9 Kulisy dopasowywania argumentów do funkcji przeładowanych 492
- 15.10 Etapy dopasowania 493
- 15.10.1 Etap 1. Dopasowanie dokładne, bo konwersja niepotrzebna 493
- 15.10.2 Etap 1a. Dopasowanie dokładne, bo z tzw. trywialną konwersją 494
- 15.10.3 Etap 2. Dopasowanie z awansem (z promocją) 495
- 15.10.4 Etap 3. Próba dopasowania za pomocą konwersji standardowych 497
- 15.10.5 Etap 4. Dopasowanie z użyciem konwersji zdefiniowanych przez użytkownika 499
- 15.10.6 Etap 5. Dopasowanie do funkcji z wielokropkiem 499
- 15.11 Wskaźników nie dopasowuje się inaczej niż dosłownie 499
- 15.12 Dopasowywanie wywołań z kilkoma argumentami 500
- 15.13 Ćwiczenia 501
16 Klasy 504
- 16.1 Typy definiowane przez użytkownika 504
- 16.2 Składniki klasy 506
- 16.3 Składnik będący obiektem 507
- 16.4 Kapsułowanie 508
- 16.5 Ukrywanie informacji 509
- 16.6 Klasa a obiekt 512
- 16.7 Wartości wstępne w składnikach nowych obiektów. Inicjalizacja "w klasie" 514
- 16.8 Funkcje składowe 517
- 16.8.1 Posługiwanie się funkcjami składowymi 517
- 16.8.2 Definiowanie funkcji składowych 518
- 16.9 Jak to właściwie jest? (this) 523
- 16.10 Odwołanie się do publicznych danych składowych obiektu 525
- 16.11 Zasłanianie nazw 526
- 16.11.1 Nie sięgaj z klasy do obiektów globalnych 529
- 16.12 Przeładowanie i zasłonięcie równocześnie 530
- 16.13 Nowa klasa? Osobny plik! 530
- 16.13.1 Poznajmy praktyczną realizację wieloplikowego programu 533
- 16.13.2 Zasada umieszczania dyrektywy using namespace w plikach 545
- 16.14 Przesyłanie do funkcji argumentów będących obiektami 545
- 16.14.1 Przesyłanie obiektu przez wartość 545
- 16.14.2 Przesyłanie przez referencję 547
- 16.15 Konstruktor - pierwsza wzmianka 548
- 16.16 Destruktor - pierwsza wzmianka 553
- 16.17 Składnik statyczny 557
- 16.17.1 Do czego może się przydać składnik statyczny w klasie? 566
- 16.18 Statyczna funkcja składowa 566
- 16.18.1 Deklaracja składnika statycznego mająca inicjalizację "w klasie" 571
- 16.19 Funkcje składowe typu const oraz volatile 577
- 16.19.1 Przeładowanie a funkcje składowe const i volatile 581
- 16.20 Struktura 581
- 16.21 Klasa będąca agregatem. Klasa bez konstruktora 582
- 16.22 Funkcje składowe z przydomkiem constexpr 584
- 16.23 Specyfikator mutable 591
- 16.24 Bardziej rozbudowany przykład zastosowania klasy 592
- 16.25 Ćwiczenia 603
17 Biblioteczna klasa std::string 609
- 17.1 Rozwiązanie przechowywania tekstów musiało się znaleźć 609
- 17.2 Klasa std::string to przecież nasz stary znajomy 611
- 17.3 Definiowanie obiektów klasy string 612
- 17.4 Użycie operatorów =, +, += w pracy ze stringami 617
- 17.5 Pojemność, rozmiar i długość stringu 618
- 17.5.1 Bliźniacze funkcje size() i length() 618
- 17.5.2 Funkcja składowa empty 619
- 17.5.3 Funkcja składowa max_size 619
- 17.5.4 Funkcja składowa capacity 619
- 17.5.5 Funkcje składowe reserve i shrink_to_fit 621
- 17.5.6 resize - zmiana długości stringu "na siłę" 622
- 17.5.7 Funkcja składowa clear 624
- 17.6 Użycie operatora [ \ oraz funkcji at 624
- 17.6.1 Działanie operatora [ \ 625
- 17.6.2 Działanie funkcji składowej at 626
- 17.6.3 Przebieganie po wszystkich literach stringu zakresowym for 629
- 17.7 Funkcje składowe front i back 629
- 17.8 Jak umieścić w tekście liczbę? 630
- 17.9 Jak wczytać liczbę ze stringu? 632
- 17.10 Praca z fragmentem stringu, czyli z substringiem 635
- 17.11 Funkcja składowa substr 636
- 17.12 Szukanie zadanego substringu w obiekcie klasy string - funkcje find 637
- 17.13 Szukanie rozpoczynane od końca stringu 640
- 17.14 Szukanie w stringu jednego ze znaków z zadanego zestawu 641
- 17.15 Usuwanie znaków ze stringu - erase i pop_back 643
- 17.16 Wstawianie znaków do istniejącego stringu - funkcje insert 644
- 17.17 Zamiana części znaków na inne znaki - replace 646
- 17.18 Zaglądanie do wnętrza obiektu klasy string funkcją data 649
- 17.19 Zawartość obiektu klasy string a C-string 650
- 17.20 W porządku alfabetycznym, czyli porównywanie stringów 653
- 17.20.1 Porównywanie stringów za pomocą funkcji compare 654
- 17.20.2 Porównywanie stringów przy użyciu operatorów ==, !=, <, >, <=, >= 658
- 17.21 Zamiana treści stringu na małe lub wielkie litery 659
- 17.22 Kopiowanie treści obiektu klasy string do tablicy znakowej - funkcja copy 661
- 17.23 Wzajemna zamiana treści dwóch obiektów klasy string - funkcja swap 662
- 17.24 Wczytywanie z klawiatury stringu o nieznanej wcześniej długości - getline 663
- 17.24.1 Pułapka, czyli jak getline może Cię zaskoczyć 666
- 17.25 Iteratory stringu 670
- 17.25.1 Iterator do obiektu stałego 674
- 17.25.2 Funkcje składowe klasy string pracujące z iteratorami 675
- 17.26 Klasa string korzysta z techniki przenoszenia 680
- 17.27 Bryk, czyli "pamięć zewnętrzna" programisty 681
- 17.28 Ćwiczenia 689
18 Deklaracje przyjaźni 696
- 18.1 Przyjaciele w życiu i w C++ 696
- 18.2 Przykład: dwie klasy deklarują przyjaźń z tą samą funkcją 698
- 18.3 W przyjaźni trzeba pamiętać o kilku sprawach 700
- 18.4 Obdarzenie przyjaźnią funkcji składowej innej klasy 703
- 18.5 Klasy zaprzyjaźnione 705
- 18.6 Konwencja umieszczania deklaracji przyjaźni w klasie 707
- 18.7 Kilka otrzeźwiających słów na zakończenie 707
- 18.8 Ćwiczenia 708
19 Obsługa sytuacji wyjątkowych 710
- 19.1 Jak dać znać, że coś się nie udało? 710
- 19.2 Pierwszy prosty przykład 712
- 19.3 Kolejność bloków catch ma znaczenie 714
- 19.4 Który blok catch nadaje się do złapania lecącego wyjątku? 715
- 19.5 Bloki try mogą być zagnieżdżane 717
- 19.6 Obsługa wyjątków w praktycznym programie 720
- 19.7 Specyfikator noexcept i operator noexcept 731
- 19.8 Ćwiczenia 734
20 Klasa-składnik oraz klasa lokalna 736
- 20.1 Klasa-składnik, czyli gdy w klasie jest zagnieżdżona definicja innej klasy 736
- 20.2 Prawdziwy przykład zagnieżdżenia definicji klasy 743
- 20.3 Lokalna definicja klasy 754
- 20.4 Lokalne nazwy typów 757
- 20.5 Ćwiczenia 758
21 Konstruktory i destruktory 760
- 21.1 Konstruktor 760
- 21.1.1 Przykład programu zawierającego klasę z konstruktorami 761
- 21.2 Specyfikator (przydomek) explicit 772
- 21.3 Kiedy i jak wywoływany jest konstruktor 773
- 21.3.1 Konstruowanie obiektów lokalnych 773
- 21.3.2 Konstruowanie obiektów globalnych 774
- 21.3.3 Konstrukcja obiektów tworzonych operatorem new 774
- 21.3.4 Jawne wywołanie konstruktora 775
- 21.3.5 Dalsze sytuacje, gdy pracuje konstruktor 778
- 21.4 Destruktor 778
- 21.4.1 Jawne wywołanie destruktora (ogromnie rzadka sytuacja) 780
- 21.5 Nie rzucajcie wyjątków z destruktorów 780
- 21.6 Konstruktor domniemany 782
- 21.7 Funkcje składowe z przypiskami = default i = delete 783
- 21.8 Konstruktorowa lista inicjalizacyjna składników klasy 785
- 21.8.1 Dla wtajemniczonych: wyjątki rzucane z konstruktorowej listy inicjalizacyjnej 792
- 21.9 Konstruktor delegujący 796
- 21.10 Pomocnicza klasa std::initializer_list - lista inicjalizatorów 803
- 21.10.1 Zastosowania niekonstruktorowe 803
- 21.10.2 Konfuzja: lista inicjalizatorów a lista inicjalizacyjna 812
- 21.10.3 Konstruktor z argumentem będącym klamrową listą inicjalizatorów 813
- 21.11 Konstrukcja obiektu, którego składnikiem jest obiekt innej klasy 818
- 21.12 Konstruktory niepubliczne? 825
- 21.13 Konstruktory constexpr mogą wytwarzać obiekty constexpr 827
- 21.14 Ćwiczenia 837
22 Konstruktory: kopiujący i przenoszący 840
- 22.1 Konstruktor kopiujący (albo inicjalizator kopiujący) 840
- 22.2 Przykład klasy z konstruktorem kopiującym 841
- 22.3 Kompilatorowi wolno pominąć niepotrzebne kopiowanie 846
- 22.4 Dlaczego przez referencję? 848
- 22.5 Konstruktor kopiujący gwarantujący nietykalność 849
- 22.6 Współodpowiedzialność 850
- 22.7 Konstruktor kopiujący generowany automatycznie 850
- 22.8 Kiedy powinniśmy sami zdefiniować konstruktor kopiujący? 851
- 22.9 Referencja do r-wartości daje zezwolenie na recykling 858
- 22.10 Funkcja std::move, która nie przenosi, a tylko rzutuje 861
- 22.11 Odebrana r-wartość staje się w ciele funkcji l-wartością 863
- 22.12 Konstruktor przenoszący (inicjalizator przenoszący) 865
- 22.12.1 Konstruktor przenoszący generowany przez kompilator 870
- 22.12.2 Inne konstruktory generowane automatycznie 870
- 22.12.3 Zwrot obiektu lokalnego przez wartość? Nie używamy przenoszenia! 871
- 22.13 Tak zwana "semantyka przenoszenia" 872
- 22.14 Nowe pojęcia dla ambitnych: gl-wartość, x-wartość i pr-wartość 872
- 22.15 decltype - operator rozpoznawania typu bardzo wyszukanych wyrażeń 875
- 22.16 Ćwiczenia 880
23 Tablice obiektów 882
- 23.1 Definiowanie tablic obiektów i praca z nimi 882
- 23.2 Tablica obiektów definiowana operatorem new 883
- 23.3 Inicjalizacja tablic obiektów 885
- 23.3.1 Inicjalizacja tablicy, której obiekty są agregatami 885
- 23.3.2 Inicjalizacja tablic, których elementy nie są agregatami 888
- 23.4 Wektory obiektów 892
- 23.4.1 Wektor, którego elementami są obiekty klasy bedącej agregatem 894
- 23.4.2 Wektor, którego elementami są obiekty klasy niebędącej agregatem 896
- 23.5 Ćwiczenia 897
24 Wskaźnik do składników klasy 898
- 24.1 Wskaźniki zwykłe - repetytorium 898
- 24.2 Wskaźnik do pokazywania na składnik-daną 899
- 24.2.1 Przykład zastosowania wskaźników do składników klasy 903
- 24.3 Wskaźnik do funkcji składowej 910
- 24.3.1 Przykład zastosowania wskaźników do funkcji składowych 912
- 24.4 Tablica wskaźników do danych składowych klasy 919
- 24.5 Tablica wskaźników do funkcji składowych klasy 920
- 24.5.1 Przykład tablicy/wektora wskaźników do funkcji składowych 921
- 24.6 Wskaźniki do składników statycznych są zwykłe 924
- 24.7 Ćwiczenia 925
25 Konwersje definiowane przez użytkownika 927
- 25.1 Sformułowanie problemu 927
- 25.2 Konstruktory konwertujące 929
- 25.2.1 Kiedy jawnie, kiedy niejawnie 930
- 25.2.2 Przykład konwersji konstruktorem 935
- 25.3 Funkcja konwertująca - operator konwersji 937
- 25.3.1 Na co funkcja konwertująca zamieniać nie może 943
- 25.4 Który wariant konwersji wybrać? 944
- 25.5 Sytuacje, w których zachodzi konwersja 946
- 25.6 Zapis jawnego wywołania konwersji typów 947
- 25.6.1 Advocatus zapisu przypominającego: "wywołanie funkcji" 947
- 25.6.2 Advocatus zapisu: "rzutowanie" 948
- 25.7 Nie całkiem pasujące argumenty, czyli konwersje kompilatora przy dopasowaniu 948
- 25.8 Kilka rad dotyczących konwersji 953
- 25.9 Ćwiczenia 954
26 Przeładowanie operatorów 956
- 26.1 Co to znaczy przeładować operator? 956
- 26.2 Przeładowanie operatorów - definicja i trochę teorii 958
- 26.3 Moje zabawki 962
- 26.4 Funkcja operatorowa jako funkcja składowa 963
- 26.5 Funkcja operatorowa nie musi być przyjacielem klasy 966
- 26.6 Operatory predefiniowane 966
- 26.7 Ile operandów ma mieć ten operator? 967
- 26.8 Operatory jednooperandowe 967
- 26.9 Operatory dwuoperandowe 970
- 26.9.1 Przykład na przeładowanie operatora dwuoperandowego 970
- 26.9.2 Przemienność 972
- 26.9.3 Choć operatory inne, to nazwę mają tę samą 973
- 26.10 Przykład zupełnie niematematyczny 973
- 26.11 Operatory postinkrementacji i postdekrementacji - koniec z niesprawiedliwością...
Kategoria: | Programowanie |
Zabezpieczenie: |
Watermark
|
ISBN: | 978-83-289-1813-9 |
Rozmiar pliku: | 44 MB |