Facebook - konwersja
Darmowy fragment

Opus magnum C++. Programowanie w języku C++. Wydanie 3 poprawione. Komplet - ebook

Wydawnictwo:
Format:
PDF
Data wydania:
5 czerwca 2024
249,00
24900 pkt
punktów Virtualo

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
Watermark
Watermarkowanie polega na znakowaniu plików wewnątrz treści, dzięki czemu możliwe jest rozpoznanie unikatowej licencji transakcyjnej Użytkownika. E-książki zabezpieczone watermarkiem można odczytywać na wszystkich urządzeniach odtwarzających wybrany format (czytniki, tablety, smartfony). Nie ma również ograniczeń liczby licencji oraz istnieje możliwość swobodnego przenoszenia plików między urządzeniami. Pliki z watermarkiem są kompatybilne z popularnymi programami do odczytywania ebooków, jak np. Calibre oraz aplikacjami na urządzenia mobilne na takie platformy jak iOS oraz Android.
ISBN: 978-83-289-1813-9
Rozmiar pliku: 44 MB

BESTSELLERY

Menu

Zamknij