C++. Intensywny kurs - ebook
C++. Intensywny kurs - ebook
Książka „Intensywny kurs języka C++” jest przeznaczona dla średnio zaawansowanych i zaawansowanych programistów. Po krótkim wprowadzeniu od razu wprowadzi Cię w świat języka C++17 będącego najnowszą wersją standardu ISO. Część I obejmuje podstawowy język C++, poczynając od typów i funkcji, a kończąc na cyklu życia obiektu i wyrażeniach. W części II przedstawiono bibliotekę standardową i biblioteki Boost. Zapoznasz się ze specjalnymi klasami użytkowymi, strukturami danych i algorytmami, a także ze sposobami obsługi systemów plików i tworzeniem programów o wysokiej wydajności wykorzystujących sieć.
Kategoria: | Programowanie |
Zabezpieczenie: |
Watermark
|
ISBN: | 978-83-01-21740-2 |
Rozmiar pliku: | 2,6 MB |
FRAGMENT KSIĄŻKI
Doktor Josh Lospinoso jest przedsiębiorcą, który przez 15 lat służył w armii amerykańskiej. Jako specjalista do spraw bezpieczeństwa stworzył wiele narzędzi związanych z zabezpieczeniami informatycznymi, a także uczył początkujących programistów języka C++. Występował na wielu konferencjach, opublikował ponad 20 recenzowanych artykułów, jest stypendystą Rhodes oraz twórcą patentu. W 2012 roku założył agencję ochrony, która osiągnęła sukces. Prowadzi blog i jest aktywnym współtwórcą oprogramowania o otwartych źródłach.
O RECENZENCIE TECHNICZNYM
Kyle Willmon jest programistą i ma 12-letnie doświadczenie w programowaniu w języku C++. Od 7 lat jest członkiem społeczności związanej z bezpieczeństwem informacji, tworzy projekty z wykorzystaniem języków C++, Python i Go. Kyle pracuje obecnie jako programista w firmie Sony, w zespole symulowania globalnych zagrożeń.PRZEDMOWA
„C++ to skomplikowany język” – taką reputację po wielu latach istnienia na rynku zdobył język C++, jednak nie zawsze była ona uzasadniona. To stwierdzenie jest często wykorzystywane jako argument, by odradzić danej osobie naukę języka C++ lub zachęcić do zainteresowania się innym językiem programowania. Trudno uzasadnić podawanie takich argumentów, ponieważ błędna jest podstawowa zasada, na której się one opierają: C++ nie jest skomplikowanym językiem. Największym problemem języka C++ jest jego reputacja, a innym, równie poważnym, brak wysokiej jakości materiałów edukacyjnych pozwalających na jego naukę.
W ciągu ostatnich czterech dekad C++ przeszedł ewolucję od języka C. Na początku był boczną gałęzią języka C (z niewielkimi dodatkami) wykorzystującą prekompilator o nazwie Cfront, który zamieniał kod C++ na C. Uzyskany program był następnie przetwarzany w standardowym kompilatorze C. Stąd nazwa Cfront – „przed C”. Po kilku latach rozwoju okazało się, że to rozwiązanie zbyt mocno ogranicza język, dlatego podjęto prace nad stworzeniem rzeczywistego kompilatora. Taki program został napisany przez Bjarne'a Stroustrupa (pierwotnego twórcę języka) i mógł samodzielnie kompilować programy C++. Inne firmy były również zainteresowane rozszerzeniem możliwości języka C i stworzyły własne kompilatory C++, w większości kompatybilne z programem Cfront lub nowszym rozwiązaniem.
Zakończyło się to niepowodzeniem, ponieważ w wyniku tego pojawiły się różne wersje języka, które były niekompatybilne ze sobą. Warto także wspomnieć o tym, że podejmowanie przez jedną osobę wszystkich decyzji i tworzenie planów rozwoju nie jest dobrym sposobem na ustanowienie międzynarodowego standardu obejmującego wiele firm. W tym celu utworzono standardowe procedury i organizacje, które nimi zarządzają. Język C++ został zatem sformalizowany i stał się normą ISO należącą do Międzynarodowej Organizacji Normalizacyjnej. Pierwszy oficjalny standard C++ pojawił się po wielu latach w 1998 roku, co zostało pozytywnie odebrane przez społeczność programistów.
Jednak radość nie trwała zbyt długo. Mimo że wersja C++98 była poprawnym opracowaniem, zawierała kilka nowych elementów rozwojowych, które nie były znane programistom, a także funkcje, które działały w dziwny sposób. Czasem rzeczywiście same funkcje były dobrze zdefiniowane, ale nie istniała współpraca między nimi. Przykładem takiego zachowania była możliwość zdefiniowania nazwy pliku z użyciem typu std::string. Pliku z tak utworzoną nazwą nie można było jednak otworzyć.
Kolejnym dodatkiem było umożliwienie korzystania z szablonów, które stały się głównym elementem standardowej biblioteki szablonów będącej obecnie jednym z najważniejszych składników języka C++. Dopiero po wydaniu tej biblioteki odkryto, że jest ona kompletna w sensie Turinga, dzięki czemu za jej pomocą można stworzyć wiele zaawansowanych konstrukcji językowych, wykonując obliczenia w czasie kompilacji. To znacznie zwiększyło możliwości twórców bibliotek związane z tworzeniem kodu generycznego, który był w stanie obsłużyć dowolnie złożone dedukcje, co w tamtych czasach było ewenementem w porównaniu z innymi językami programowania.
Pojawiło się jednak utrudnienie: mimo że język C++98 był niewątpliwie dobrym rozwiązaniem, wiele jego kompilatorów nie zawierało poprawnej implementacji szablonów. Dwa podstawowe kompilatory z tamtych czasów, czyli GNU GCC 2.7 i Microsoft Visual C++ 6.0, nie były w stanie wykonać dwustopniowego wyszukiwania nazwy wymaganego przez szablony. Jedynym sposobem na usunięcie tego problemu było napisanie nowego kompilatora…
W przypadku kompilatora GNU starano się najpierw zachować istniejący kod źródłowy, ale w końcu w chwili pojawienia się wersji 2.95 zdecydowano się na stworzenie produktu od nowa. Oznaczało to, że przez wiele lat nie ukazały się żadne nowe funkcje ani wersje, i dlatego wielu programistów było z tego niezadowolonych. Niektóre firmy przejęły pierwotny kod źródłowy i próbowały kontynuować jego rozwój, tworząc wersje 2.95.2, 2.95.3 i 2.96. Niestety, okazało się, że były one niestabilne. Wreszcie pojawiła się nowa, stworzona całkowicie od podstaw, wersja GCC 3.0. Początkowo nie była zbyt udana. Mimo że kompilowała szablony i kod C++ znacznie lepiej niż starsze wersje, nie potrafiła skompilować jądra Linuksa do wykonywalnego pliku binarnego. Społeczność linuksowa wyraźnie sprzeciwiła się modyfikacji kodów w celu dostosowania ich do nowego kompilatora i zaczęła twierdzić, że kompilator jest uszkodzony. Ostatecznie problem zakończył się w momencie pojawienia się wersji 3.2 i świat Linuksa zaczął wykorzystywać kompilator GCC 3.2 i jego nowsze wydania.
Firma Microsoft starała się bardzo długo unikać ponownego tworzenia kompilatora. Wymyślała niestandardowe funkcje oraz metody heurystyczne w celu ustalenia, czy wyszukiwanie nazwy szablonu powinno zostać rozwiązane w pierwszym lub drugim przejściu. Rozwiązanie działało w zasadzie poprawnie, jednak biblioteki zostały napisane na początku 2010 roku i okazało się, że niemożliwe stało się doprowadzenie do tego, by ze sobą współpracowały – nawet po modyfikacjach ich kodów źródłowych. Firma Microsoft w końcu zabrała się za tworzenie nowego parsera i wydała jego zaktualizowaną wersję w 2018 roku, mimo to wielu programistów nie wzięło go pod uwagę. Ostatecznie, w 2019 roku nowy parser zaczął być domyślnie dołączany do nowych projektów.
Jeszcze przed 2019 rokiem miało jednak miejsce ważne wydarzenie, a mianowicie w 2011 roku pojawiło się wydanie C++11. Po opublikowaniu wersji C++98 język zaczęto uzupełniać o nowe funkcje. Ze względu na to, że jedna z tych funkcji nie działała zgodnie z oczekiwaniami, inauguracja nowej wersji C++ opóźniła się o trzy lata aż do 2009 roku. W międzyczasie podejmowano próby, aby kompilator zadziałał z nową funkcją. W 2009 roku problem został ostatecznie usunięty, pozostała część funkcji została przystosowana do nowego wydania, a wersja C++ z 1998 roku została ostatecznie zaktualizowana. Pojawiło się więc mnóstwo nowych funkcji i ulepszeń biblioteki. Kompilatory znów nie mogły nadrobić zaległości i dlatego większość z nich potrafiła skompilować program w wersji C++11 dopiero pod koniec 2013 roku.
Komitet języka C++ wyciągnął wnioski ze swojej wcześniejszej porażki i postanowił dokładnie zaplanować każde nowe wydanie, które miało się pojawiać co trzy lata. W pierwszym roku planowano stworzyć i przetestować nowe funkcje, w drugim dobrze je zintegrować, a także uzyskać ich stabilne wersje, a wreszcie oficjalnie udostępnić w trzecim roku. Ten proces miał być powtarzany co trzy lata. Wersja C++11 była pierwszą instancją, a w 2014 roku powinna się pojawić druga. Okazało się, że komitet zrobił dokładnie tak jak obiecał, zdecydowanie zaktualizował wersję C++11 i umożliwił korzystanie z istniejących funkcji w znacznie większym stopniu, niż było to do tej pory możliwe. Pewne wcześniej istniejące ograniczenia zostały złagodzone i zaczęły obowiązywać jedynie w przypadkach, które uznano za dopuszczalne – w szczególności dotyczyły one specyfikatora constexpr.
Twórcy kompilatorów, którzy wciąż próbowali sprawić, by wszystkie funkcje C++11 działały poprawnie, zdali sobie sprawę, że muszą przyspieszyć swoje prace, ponieważ w przeciwnym razie znikną z rynku. Do 2015 roku wszystkie kompilatory obsługiwały prawie pełen standard C++14. Było to niezwykłe osiągnięcie, biorąc pod uwagę to, co wcześniej działo się z wersjami C++98 i C++11. Dzięki temu w pracach komitetu języka C++ zaczęli ponownie uczestniczyć wszyscy główni twórcy kompilatorów. Było to ważne, ponieważ wiedza o planowanych, ale jeszcze niewdrożonych funkcjach powodowała, że dana organizacja stawała się automatycznie najważniejszym twórcą kompilatorów. Jeśli nawet okazałoby się, że pewna funkcja nie pasuje do projektu kompilatora, zawsze można było wpłynąć na komitet języka C++ i dostosować ją w taki sposób, który znacznie ułatwiłby jej obsługę i umożliwił innym programistom wcześniejsze skorzystanie z niej.
Język C++ przeżywa obecnie odrodzenie. Okres ten rozpoczął się około 2011 roku, gdy wprowadzono standard C++11 i przyjęto styl programowania zwany „nowoczesnym językiem C++”. Od tamtej pory był on udoskonalany i wszystkie funkcje wprowadzone w wersji C++11 zostały ulepszone w standardach C++14 i C++17. Są one w pełni obsługiwane przez najważniejsze kompilatory liczące się na rynku. Co więcej, wkrótce zostanie wydany nowy standard C++20, a wszystkie najnowsze wersje kompilatorów już wspierają jego podstawowe elementy.
Nauka nowoczesnego języka C++ jest uproszczona. Programiści nie muszą już poznawać języka C, następnie C++98 i C++11, a potem zapominać o tych składnikach C i C++98, które zostały zmienione i stały się przestarzałe. Większość poprzednich szkoleń rozpoczynała się od wprowadzenia na temat historii C++, ponieważ trzeba było zrozumieć, dlaczego niektóre rzeczy zostały zdefiniowane w dziwny sposób. W przypadku tej książki Josh słusznie pominął informacje o historii języka C++ i pojawiają się one tylko w przedmowie.
Nie musisz już znać tej całej historii, aby nauczyć się programować w języku C++. Nowoczesny styl C++ pozwala na jej całkowite pominięcie. Obecnie możesz tworzyć dobrze zaprojektowane programy, znając tylko podstawowe zasady języka C++. To najlepszy czas na jego naukę.
Wróćmy jednak do wcześniejszego zastrzeżenia, czyli braku materiałów edukacyjnych o wysokiej jakości, pozwalających na naukę języka C++. Wysoki poziom nauczania jest obecnie zapewniany w ramach samego komitetu C++. Istnieje grupa analityczna zajmująca się wyłącznie jakością przekazywania wiedzy o języku C++! Moim zdaniem to zastrzeżenie, o którym wspominaliśmy wcześniej, zostało całkowicie wyeliminowane przez obecnie czytaną książkę.
W przeciwieństwie do pozostałych pozycji poświęconych językowi C++, które do tej pory przeczytałem, ta książka uczy podstaw i zasad. Dzięki niej dowiesz się, w jaki sposób należy analizować zagadnienia. To spowoduje, że będziesz mógł samodzielnie przeanalizować funkcje oferowane przez standardową bibliotekę szablonów. Korzyści z nauki mogą się pojawić nieco później, ale będziesz bardzo zadowolony, gdy zobaczysz, że Twoje pierwsze programy w języku C++ poprawnie się kompilują, a Ty w pełni rozumiesz ich działanie. W tej książce zawarto nawet zagadnienia, które są nieobecne w większości innych książek o języku C++: chodzi o konfigurowanie środowiska i testowanie kodu przed uruchamianiem gotowego programu.
Życzę miłej lektury i przetestowania wszystkich ćwiczeń, które są zawarte w książce, a także powodzenia w podróży po świecie języka C++!
_Peter Bindels_
Główny inżynier oprogramowania firmy TomTomPODZIĘKOWANIA
Przede wszystkim dziękuję mojej rodzinie za umożliwienie mi stworzenia tej książki. Napisanie połowy tego, co wcześniej zaplanowałem, zajęło mi dwa razy więcej czasu, niż przypuszczałem. Bardzo dziękuję za okazanie mi aż tak wielkiej cierpliwości.
Moje podziękowania otrzymują: Kyle Willmon i Aaron Bray, którzy nauczyli mnie języka C++; Tyler Ortman, który od samego początku wspierał tę książkę; Bill Pollock, który poprawił mój styl opisowy; Chria Cleveland, Patrick De Justo, Anne Marie Walker, Annie Choi, Meg Sneeringer i Riley Hoffman, których znakomita edycja przyniosła wielkie korzyści tej książce; a także wielu początkowych czytelników, którzy przesłali mi bezcenne opinie po przeczytaniu rozdziałów w ich pierwotnej formie.
Wreszcie dziękuję Jeffowi Lospinoso, który pozostawił swojemu dziesięcioletniemu siostrzeńcowi o wielkich oczach zniszczoną z powodu używania i poplamioną kawą książkę o programowaniu w języku Perl, która była iskrą wzniecającą płomień.WSTĘP
_Chwyć stary pędzel i zacznij malować razem z nami._
Bob Ross
Zapotrzebowanie na tworzenie oprogramowania systemowego jest ogromne. Dzięki wszechobecności przeglądarek internetowych, urządzeń mobilnych i internetowi rzeczy (IoT) być może nastały najlepsze czasy na to, by stać się programistą. Wydajny, łatwy w utrzymaniu i poprawny kod jest zawsze pożądany, a ja jestem osobiście głęboko przekonany, że język C++ jest właściwym językiem do _wszystkich_ zastosowań.
Język C++, używany przez doświadczonego programistę, może wyprodukować mniejszy, wydajniejszy i bardziej czytelny kod niż jakikolwiek inny znany język programowania systemowego. Jest to język oparty na zasadzie darmowej abstrakcji1 (_zero-overhead abstraction_), dzięki czemu Twoje aplikacje mają wysoką wydajność i można je szybko zaprogramować. Oprócz tego jest on w prosty i bezpośredni sposób powiązany ze sprzętem, co sprawia, że możesz użyć niskopoziomowych funkcji, gdy ich będziesz potrzebować. Kiedy programujesz w C++, stajesz na barkach gigantów, którzy poświęcili dziesięciolecia na tworzenie tego niezwykle potężnego i uniwersalnego języka.
Ogromną zaletą języka C++ jest to, że dzięki niemu uzyskujesz zupełnie darmowy dostęp do standardowej biblioteki C++, czyli _stdlib_. Biblioteka stdlib składa się z trzech połączonych ze sobą składników: kontenerów, iteratorów i algorytmów. Jeśli kiedykolwiek stworzyłeś własny algorytm szybkiego sortowania lub zajmowałeś się programowaniem systemowym i napotkałeś problemy związane z przepełnieniem bufora, wskaźnikami zawieszonymi, użyciem pamięci dynamicznej po jej zwolnieniu lub jej wielokrotnym zwolnieniem, z przyjemnością zapoznasz się z biblioteką stdlib. Umożliwia ona uzyskanie wysokiego poziomu bezpieczeństwa typologicznego, poprawności kodu i jego dużej wydajności. Będziesz także zadowolony z niewielkiego rozmiaru kodu i jego czytelności.
Podstawą modelu programowania w języku C++ jest _cykl życia obiektu_, który gwarantuje, że zasoby używane przez program, takie jak pliki, pamięć i gniazda sieciowe, są poprawnie zwalniane, nawet w przypadku wystąpienia błędów. Wyjątki, używane rozsądnie, mogą zlikwidować w kodzie znaczne ilości bałaganu odpowiedzialnego za sprawdzanie warunków wystąpienia błędów. Ponadto semantyka przenoszenia i kopiowania zapewnia wysoki poziom bezpieczeństwa, wydajności i uniwersalności związany z uprawieniami własności zasobów, czego nie posiadają starsze języki programowania systemowego, takie jak C.
C++ jest żywym językiem. Komitet Międzynarodowej Organizacji Normalizacyjnej (ISO) odpowiedzialny za rozwój języka C++ od ponad 30 lat regularnie wprowadza w nim ulepszenia. W ostatniej dekadzie wydano kilka aktualizacji standardu C++11, C++14 i C++17, które pojawiły się odpowiednio w 2011, 2014 i 2017 roku. Nowej wersji C++20 można się spodziewać w 2020 roku.
Gdy używam terminu _nowoczesny C++_, mam na myśli najnowszą wersję języka C++, która obsługuje dodane do niego nowe funkcje i paradygmaty. Dokonano poważnych udoskonaleń języka, które poprawiają jego wyrazistość, wydajność, bezpieczeństwo i ogólną użyteczność. Język ten poniekąd przeżywa obecnie największą popularność i na pewno nie zamierza zniknąć z rynku. Jeśli zdecydujesz się zainwestować w naukę języka C++, przez wiele lat będziesz odnosił z tego korzyści.
O KSIĄŻCE
Programiści, chcący nauczyć się języka C++, mają dostęp do wielu książek na bardzo wysokim poziomie merytorycznym, takich jak _Skuteczny nowoczesny C++_ Scotta Meyersa czy też _Język C++_ Bjarne'a Stroustrupa, ale są one na ogół skierowane do dość zaawansowanego odbiorcy. Istnieją również prostsze pozycje, jednak one często pomijają kluczowe szczegóły, ponieważ są przeznaczone dla zupełnie początkujących programistów. Doświadczony programista ma więc problem, od czego powinien zacząć naukę języka C++.
Skomplikowane zagadnienia wolę prezentować rozważnie, niespiesznie budując koncepcje z użyciem podstawowych elementów. Język C++ ma zniechęcającą reputację, ponieważ jego podstawowe składniki są tak ściśle ze sobą połączone, że utrudnia to ukazanie pełnego obrazu całości. Podczas jego nauki starałem się go zrozumieć, dlatego korzystałem z wielu książek, samouczków wideo i zniechęconych kolegów. Napisałem więc taką książkę, którą sam chciałbym mieć pięć lat temu.
DLA KOGO JEST PRZEZNACZONA TA KSIĄŻKA?
Książka ta jest przeznaczona dla średnio zaawansowanych i zaawansowanych programistów, którzy znają już podstawowe koncepcje programowania, nawet jeśli nie mają żadnego doświadczenia w programowaniu systemowym. Do przestudiowania książki zapraszam także doświadczonych programistów aplikacji.
Uwaga _Jeśli jesteś doświadczonym programistą języka C lub początkującym programistą systemowym i zastanawiasz się, czy warto zainwestować w naukę języka C++, koniecznie przeczytaj podrozdział „Wstęp dla programistów C”, aby uzyskać szczegółowe informacje._
CO ZNAJDUJE SIĘ W TEJ KSIĄŻCE?
Książka została podzielona na dwie części. Część I zawiera informacje o samym języku C++. Zamiast zapoznawać się z tym językiem w sposób chronologiczny (zaczynając od starego C++98, a kończąc na współczesnym C++11/14/17), od razu poznasz idiomatyczny, nowoczesny C++. Część II wprowadzi Cię w świat biblioteki standardowej C++ (stdlib), dzięki czemu będziesz mógł poznać najważniejsze pojęcia, które są z nią związane.
Część I: Język C_++_
ROZDZIAŁ 1. GOTOWI DO PRACY. W tym wprowadzającym rozdziale dowiesz się, jak należy skonfigurować środowisko programistyczne C++. Skompilujesz i uruchomisz swój pierwszy program, a także nauczysz się go debugować.
ROZDZIAŁ 2. TYPY. Zapoznasz się z systemem typów C++. Przyjrzysz się typom podstawowym będących fundamentem, na którym zostały zbudowane wszystkie inne typy. Następnie poznasz tradycyjne struktury danych oraz klasy w pełni funkcjonalne. Dowiesz się, jaka jest rola konstruktorów, inicjalizacji i destruktorów.
ROZDZIAŁ 3. TYPY REFERENCYJNE. W tym rozdziale zapoznasz się z obiektami przechowującymi adresy pamięci innych obiektów. Te typy są podstawą wielu ważnych wzorców programistycznych i umożliwiają tworzenie uniwersalnego, wydajnego kodu.
ROZDZIAŁ 4. CYKL ŻYCIA OBIEKTU. Kontynuujemy w tym rozdziale analizę niezmienników klas i konstruktorów w kontekście okresu przechowywania. Wraz z wprowadzeniem paradygmatu inicjalizacji w przypadku pozyskiwania zasobu (RAII) zostaną omówione destruktory. Poznasz wyjątki i dowiesz się, jak wymuszają one niezmienniki klas i uzupełniają wzorzec RAII. Po omówieniu semantyki przenoszenia i kopiowania nauczysz się, jak można ją zaimplementować dzięki użyciu konstruktorów i operatorów przypisania.
ROZDZIAŁ 5. POLIMORFIZM CZASU WYKONANIA. W tym rozdziale zapoznasz się z interfejsami, czyli koncepcją programowania, która umożliwia tworzenie kodu polimorficznego w czasie wykonania. Poznasz podstawy dziedziczenia i kompozycji obiektów, co pozwoli na wykorzystanie interfejsów w języku C++.
ROZDZIAŁ 6. POLIMORFIZM CZASU KOMPILACJI. Ten rozdział omawia szablony, czyli funkcję języka, która umożliwia tworzenie kodu polimorficznego. Zapoznasz się również z konceptami, które pojawią się w następnej wersji języka C++, a także jawnymi konwersjami umożliwiającymi zmianę typów obiektów.
ROZDZIAŁ 7. WYRAŻENIA. Dzięki temu rozdziałowi zgłębisz działanie operandów i operatorów. Jeżeli dokładnie zrozumiesz typy, cykle życia obiektu i szablonów, będziesz gotowy zająć się podstawowymi komponentami języka C++, wśród których najważniejszą rolę spełniają wyrażenia.
ROZDZIAŁ 8. INSTRUKCJE. W tym rozdziale poznasz elementy będące składowymi funkcji. Dowiesz się o instrukcjach wyrażeniowych, instrukcjach złożonych, deklaracjach, instrukcjach iteracyjnych i instrukcjach skoku.
ROZDZIAŁ 9. FUNKCJE. Ostatni rozdział części I stanowi rozszerzenie analizy, w jaki sposób należy umieszczać instrukcje w jednostce pracy. Poznasz szczegóły definicji funkcji, typy zwracane, rozwiązywanie przeciążenia, funkcje wariadyczne, szablony wariadyczne i wskaźniki do funkcji. Dowiesz się również, jak za pomocą operatora wywołania funkcji i wyrażeń lambda tworzyć typy wywoływalne zdefiniowane przez użytkownika. Poznasz klasę std::function, która udostępnia jednolity kontener służący do przechowywania obiektów wywoływalnych.
Część II: Biblioteki i platformy
ROZDZIAŁ 10. TESTOWANIE. W tym rozdziale omawiamy wspaniały świat testów jednostkowych i platform imitacyjnych. W trakcie tworzenia oprogramowania dla systemu autonomicznej jazdy zapoznasz się projektowaniem opartym na testach. Przy okazji poznasz platformy, takie jak Boost Test, Google Test, Google Mock i inne.
ROZDZIAŁ 11. WSKAŹNIKI INTELIGENTNE. Prezentujemy specjalne klasy narzędziowe, które są dostępne w bibliotece stdlib w celu obsługi praw własności obiektów dynamicznych.
ROZDZIAŁ 12. NARZĘDZIA. W tym rozdziale zapoznasz się z typami, klasami i funkcjami dostępnymi w bibliotekach stdlib i Boost, służącymi do rozwiązywania typowych problemów programistycznych. Dowiesz się o strukturach danych, funkcjach numerycznych i generatorach liczb losowych.
ROZDZIAŁ 13. KONTENERY. Analizujemy wiele specjalnych struktur danych dostępnych w bibliotekach Boost i stdlib, które pomagają uporządkować dane. Dowiesz się o kontenerach sekwencyjnych, kontenerach asocjacyjnych i nieuporządkowanych kontenerach asocjacyjnych.
ROZDZIAŁ 14. ITERATORY. Poznasz połączenie między kontenerami, o których dowiedziałeś się w poprzednim rozdziale, a łańcuchami, które pojawią się w następnym. Dowiesz się o różnych rodzajach iteratorów, a także o tym, dlaczego ich konstrukcja zapewnia niesamowitą elastyczność.
ROZDZIAŁ 15. ŁAŃCUCHY. W tym rozdziale nauczysz się, jak z użyciem określonej rodziny kontenerów można przetwarzać teksty występujące w języku naturalnym. Dowiesz się także o specjalnych funkcjach wbudowanych w łańcuchy, które pozwalają na wykonywanie typowych zadań.
ROZDZIAŁ 16. STRUMIENIE. Zapoznasz się z podstawową koncepcją leżącą u podstaw operacji wejścia i wyjścia. Dowiesz się, jak obsługiwać strumienie wejściowe i wyjściowe za pomocą funkcji formatujących i nieformatujących, a także w jaki sposób należy używać manipulatorów. Nauczysz się również zapisywania danych oraz odczytywania ich z plików.
ROZDZIAŁ 17. SYSTEMY PLIKÓW. W tym miejscu poznasz narzędzia biblioteki stdlib służące do zarządzania systemami plików. Dowiesz się, jak konstruować i modyfikować ścieżki, badać pliki i katalogi oraz wyświetlać struktury katalogów.
ROZDZIAŁ 18. ALGORYTMY. W tym rozdziale pokażemy, w jaki sposób można łatwo rozwiązywać problemy za pomocą biblioteki stdlib. Poznasz imponującą liczbę algorytmów o wysokiej jakości.
ROZDZIAŁ 19. WSPÓŁBIEŻNOŚĆ I RÓWNOLEGŁOŚĆ. Przedstawiamy tu kilka prostych metod pozwalających na programowanie wielowątkowe, które są częścią biblioteki stdlib. Dowiesz się o typach future, muteksach, a także o zmiennych warunkowych i operacjach atomowych.
ROZDZIAŁ 20. PROGRAMOWANIE SIECIOWE Z UŻYCIEM BIBLIOTEKI BOOST ASIO. W tym rozdziale dowiesz się, jak tworzyć programy o wysokiej wydajności, które potrafią komunikować się ze sobą za pośrednictwem sieci. Zobaczysz, jak należy używać biblioteki Boost Asio z blokującymi i nieblokującymi operacjami wejścia i wyjścia.
ROZDZIAŁ 21. TWORZENIE APLIKACJI. W ostatnim rozdziale tej książki przeanalizujemy kilka ważnych zagadnień. Dowiesz się o funkcjach obsługi technicznej, które pozwalają zarządzać cyklem życia aplikacji. Poznasz również bibliotekę Boost ProgramOptions, która ułatwia tworzenie aplikacji konsolowych odczytujących dane wejściowe wprowadzane przez użytkownika.
Uwaga _Odwiedź stronę_ https://ccc.codes/_, aby uzyskać dostęp do kodów źródłowych wykorzystanych w tej książce._CZĘŚĆ I.
JĘZYK C++
_Najpierw się czołgamy. Później pełzamy po stłuczonym szkle._
Scott Meyers, Effective STL
W części I książki przeanalizujemy najważniejsze pojęcia występujące w języku C++. W rozdziale 1 skonfigurujesz swoje środowisko pracy i poznasz niektóre konstrukcje językowe, w tym podstawowe zasady programowania obiektowego będącego główną abstrakcją używaną w języku C++.
W kolejnych pięciu rozdziałach zostaną dokładnie zaprezentowane obiekty i typy, czyli serce i dusza języka C++. W przeciwieństwie do innych książek o programowaniu nie będziesz musiał budować serwerów internetowych ani uruchamiać statków kosmicznych. Wszystkie programy zawarte w części I będą po prostu używać zwykłej konsoli. Zamiast gwarantować natychmiastową satysfakcję, postaramy się przede wszystkim, abyś mógł sobie stworzyć mentalny model języka.
Rozdział 2 zawiera obszerną analizę typów, które są konstrukcją językową definiującą Twoje obiekty.
Rozdział 3 uwzględnia zagadnienia omówione w rozdziale 2 i prezentuje typy referencyjne, które opisują obiekty odnoszące się do innych obiektów.
Rozdział 4 opisuje cykl życia obiektu, czyli jeden z najpotężniejszych aspektów języka C++.
W rozdziałach 5 i 6 zostaje przeanalizowany polimorfizm czasu kompilacji wykorzystujący szablony oraz polimorfizm czasu wykonania związany z interfejsami. Te dwie cechy pozwalają na tworzenie kodu o luźnych powiązaniach, który to kod nadaje się do wielokrotnego użytku.
Znając podstawy działania modelu obiektowego C++, będziesz gotowy do przestudiowania rozdziałów od 7 do 9. Dowiesz się w nich o wyrażeniach, instrukcjach i funkcjach, których będziesz używać do tworzenia kodu. Może się to wydawać trochę dziwne, że omówienie tych konstrukcji językowych pojawia się dopiero pod koniec części I, ale bez dobrej znajomości obiektów i ich cykli życia niemożliwe stałoby się zrozumienie niczego poza najbardziej podstawowymi cechami języka.
Język C++ jest wszechstronny, ambitny i potężny. Może to zniechęcić osoby, które dopiero zaczynają się go uczyć. Aby tego uniknąć, część I została napisana w taki sposób, który sprawia, że jest sekwencyjna i spójna, a dzięki temu może być czytana jak opowieść.
Część I to niejako opłata za wstęp. Ciężką pracę, którą wykonasz, ucząc się pojęć języka C++, będziesz mógł potraktować jako zezwolenie na skorzystanie ze „szwedzkiego bufetu” bibliotek i platform omawianych w części II.PRZYPISY
¹ Więcej na temat zasady darmowej abstrakcji można się dowiedzieć w artykule dostępnym pod adresem https://cpp-polska.pl/post/czy-c-jest-wolniejszy-od-cij-kilka-slow-o-zero-cost-abstraction .
² Nie ma w języku angielskim słowa „frabjous”. Jest to przekręcenie (świadome) słowa „fabulous” – fantastyczny, radosny itp. Autor użył takiego zmodyfikowanego słowa, wzorując się zapewne na wierszu _Jabberwocky_ Lewisa Carrolla, uważanym za jeden z najznakomitszych przykładów angielskiego wiersza absurdalnego, pochodzącym z jego książki _Po drugiej stronie lustra_ i zawierającym mnóstwo neologizmów. Można by użyć w tym przypadku „normalnego” słowa „fantastycznej” czy też „radosnej”. Sformułowanie „bardosny” zostało użyte w przekładzie wiersza przez Juliusza W. Gomulickiego: https://home.agh.edu.pl/~szymon/jabberwocky.shtml) .
³ Bardzo dobry do tych celów będzie również Notepad++. Można go znaleźć pod adresem: https://notepad-plus-plus.org/ .
⁴ Obecnie jest już dostępna wersja Visual Studio 2019 pod adresem https://visualstudio.microsoft.com/pl/vs/ .
⁵ Wersje te uległy zmianie i w trakcie tłumaczenia książki były następujące: GCC 9.2 i Clang 9.0.0 .