Ostateczny przewodnik i lista książek o C++

To pytanie jest próbą zebrania kilku perełek spośród dziesiątek złych książek o C++, które ukazują się każdego roku.

W przeciwieństwie do wielu innych języków programowania, które często poznaje się w biegu z tutoriali znalezionych w Internecie, mało kto jest w stanie szybko opanować C++ bez przestudiowania dobrze napisanej książki o C++. Jest on zbyt duży i skomplikowany, aby to zrobić. W rzeczywistości, jest on tak duży i złożony, że istnieje bardzo wiele bardzo złych książek o C++. I nie mówimy tu o złym stylu, ale o rzeczach takich jak rażąco oczywiste błędy merytoryczne i promowanie okropnie złych stylów programowania.

Proszę edytować zaakceptowaną odpowiedź, aby podać jakościowe książki i przybliżony poziom umiejętności - najlepiej po dyskusji na temat twojego dodatku na czacie C++. (Stali bywalcy mogą bezlitośnie cofnąć twoją pracę, jeśli nie zgadzają się z rekomendacją). Dodaj krótką informację/opis o każdej książce, którą osobiście przeczytałeś/skorzystałeś z niej. Nie krępuj się dyskutować o jakości, nagłówkach, itp. Książki, które spełniają kryteria zostaną dodane do listy. Książki, które mają recenzje Stowarzyszenia Użytkowników C i C++ (ACCU) mają odnośniki do recenzji.

*Uwaga: FAQ i inne zasoby można znaleźć w C++ tag info i pod [tag:c++-faq].

Początkujący

Wprowadzenie, bez wcześniejszego doświadczenia w programowaniu

  • C++ Primer * (Stanley Lippman, Josée Lajoie, and Barbara E. Moo) (updated for C++11) Mając 1k stron, jest to bardzo dokładne wprowadzenie do C++, które obejmuje prawie wszystko w tym języku w bardzo przystępnej formie i bardzo szczegółowo. Piąte wydanie (wydane 16 sierpnia 2012) obejmuje C++11. [Recenzja]
  • Programming: Principles and Practice Using C++](http://www.amazon.com/dp/0321992784/) (Bjarne Stroustrup, 2nd Edition - May 25, 2014) (updated for C++11/C++14) Wprowadzenie do programowania w C++ autorstwa twórcy tego języka. Dobra lektura, która nie zakłada wcześniejszego doświadczenia w programowaniu, ale nie jest przeznaczona tylko dla początkujących.

Wprowadzenie, z wcześniejszym doświadczeniem w programowaniu

  • A Tour of C++](https://www.amazon.com/Tour-C-Depth-ebook/dp/B00F8CWGOS) (Bjarne Stroustrup) (2nd edition for C++17) Wycieczka" jest szybkim (około 180 stron i 14 rozdziałów) tutorialnym przeglądem całego standardowego C++ (języka i biblioteki standardowej, oraz użycia C++11) na umiarkowanie wysokim poziomie dla osób, które już znają C++ lub przynajmniej są doświadczonymi programistami. Książka ta jest rozszerzoną wersją materiału, który stanowi rozdziały 2-5 książki The C++ Programming Language, 4th edition.

  • Accelerated C++_](http://www.amazon.com/dp/020170353X/) (Andrew Koenig i Barbara Moo, wydanie pierwsze - 24 sierpnia 2000 r.) Książka ta obejmuje w zasadzie to samo, coC++ Primer, ale zajmuje jedną czwartą jego powierzchni. Wynika to głównie z tego, że nie jest to wprowadzenie do programowania, ale wprowadzenie do C++ dla osób, które'wcześniej programowały w jakimś innym języku. Ma bardziej stromą krzywą uczenia się, ale dla tych, którzy mogą sobie z tym poradzić, jest to bardzo kompaktowe wprowadzenie do języka. (Z historycznego punktu widzenia, książka ta była pierwszym podręcznikiem dla początkujących, w którym zastosowano nowoczesne podejście do nauczania języka). Pomimo tego, C++ którego uczy, jest czysto C++98. [Recenzja]

    Najlepsze praktyki

  • Effective C++](http://www.amazon.com/dp/0321334876/) (Scott Meyers, 3rd Edition - May 22, 2005) Ta książka została napisana z myślą o tym, by być najlepszą drugą książką, jaką programiści C++ powinni przeczytać, i udało się. Wcześniejsze edycje były skierowane do programistów wywodzących się z C, trzecia edycja zmienia to i jest skierowana do programistów wywodzących się z języków takich jak Java. Przedstawia ~50 łatwych do zapamiętania reguł wraz z ich uzasadnieniem w bardzo przystępnym (i przyjemnym) stylu. Dla C++11 i C++14 przykłady i kilka zagadnień jest przestarzałych i Effective Modern C++ powinien być preferowany. [Recenzja]

  • Effective Modern C++ (Scott Meyers) Jest to w zasadzie nowa wersja Effective C++, przeznaczona dla programistów C++ dokonujących przejścia z C++03 na C++11 i C++14.

  • Effective STL (Scott Meyers) Celem tej książki jest zrobienie tego samego dla części biblioteki standardowej pochodzącej z STL, co Effective C++ zrobił dla języka jako całości: Przedstawia zasady postępowania wraz z ich uzasadnieniem. [Review]

    Pośrednik

  • Jeszcze więcej zasad niż w Efektywnym C++](http://www.amazon.com/dp/020163371X/) (Scott Meyers) Jeszcze więcej zasad niż w Efektywnym C++. Nie tak ważne jak te w pierwszej książce, ale wciąż dobrze wiedzieć.

  • Wyjątkowe C++](http://www.amazon.com/dp/0201615622/) (Herb Sutter) Przedstawiona jako zbiór łamigłówek, zawiera jedną z najlepszych i najbardziej dokładnych dyskusji na temat właściwego zarządzania zasobami i bezpieczeństwa wyjątków w C++ poprzez Resource Acquisition is Initialization (RAII), a także dogłębne omówienie wielu innych tematów, w tym idiomu pimpl, wyszukiwania nazw, dobrego projektowania klas i modelu pamięci C++. [Recenzja]

  • Więcej wyjątków w C++](http://www.amazon.com/dp/020170434X/) (Herb Sutter) Obejmuje dodatkowe tematy związane z bezpieczeństwem wyjątków, które nie zostały omówione w Exceptional C++, oprócz omówienia efektywnego programowania obiektowego w C++ i poprawnego korzystania z STL. [Recenzja]

  • Wyjątkowy styl C++](http://www.amazon.com/dp/0201760428/) (Herb Sutter) Omawia programowanie generyczne, optymalizację i zarządzanie zasobami; książka ta zawiera również doskonałą ekspozycję sposobu pisania modularnego kodu w C++ przy użyciu funkcji nieczłonkowskich i zasady pojedynczej odpowiedzialności. [Recenzja]

  • Standardy kodowania w C++](http://www.amazon.com/dp/0321113586/) (Herb Sutter i Andrei Alexandrescu) "Standardy kodowania" nie oznaczają tutaj "ile spacji powinienem wciskać w mój kod?". Ta książka zawiera 101 najlepszych praktyk, idiomów i najczęstszych pułapek, które mogą pomóc w pisaniu poprawnego, zrozumiałego i wydajnego kodu C++. [Recenzja]

  • C++ Templates: The Complete Guide (David Vandevoorde i Nicolai M. Josuttis) Jest to najlepsza książka o szablonach, jakie istniały przed C++11. Obejmuje wszystko, od podstaw do najbardziej zaawansowanych metaprogramowań szablonowych i wyjaśnia każdy szczegół działania szablonów (zarówno koncepcyjnie, jak i w sposobie ich implementacji) oraz omawia wiele typowych pułapek. Ma doskonałe podsumowania Reguły Jednej Definicji (ODR) i rozdzielczości przeciążeniowej w dodatkach. Drugie wydanie](http://amzn.com/0321714121) obejmujące C++11, C++14 i C++17 zostało już opublikowane. [Recenzja]

  • _C++ 17 - Kompletny przewodnik (Nicolai M. Josuttis) Książka ta opisuje wszystkie nowe funkcje wprowadzone w standardzie C++17 obejmując wszystko od prostych jak 'Inline Variables', 'constexpr if' aż do 'Polimorficznych zasobów pamięci' oraz 'New and Delete with overaligned Data'.

    Zaawansowane

  • Nowoczesne projektowanie w C++](http://www.amazon.com/dp/0201704315/) (Andrei Alexandrescu) Przełomowa książka o zaawansowanych technikach programowania ogólnego. Przedstawia projektowanie oparte na zasadach, listy typów i podstawowe idiomy programowania ogólnego, a następnie wyjaśnia, jak wiele użytecznych wzorców projektowych (w tym małe alokatory obiektów, funktory, fabryki, odwiedzających i metody wielokrotne) można zaimplementować wydajnie, modułowo i czysto za pomocą programowania ogólnego. [Recenzja]

  • C++ Template Metaprogramming (David Abrahams i Aleksey Gurtovoy)

  • C++ Concurrency In Action (Anthony Williams) Książka omawiająca obsługę współbieżności w C++11, w tym bibliotekę wątków, bibliotekę atomics, model pamięci C++, blokady i muteksy, a także zagadnienia projektowania i debugowania aplikacji wielowątkowych. Ukazało się już drugie wydanie obejmujące C++14 i C++17.

  • Advanced C++ Metaprogramming](http://www.amazon.com/dp/1460966163) (Davide Di Gennaro) Podręcznik technik TMP sprzed C++11, skupiający się bardziej na praktyce niż teorii. W tej książce jest mnóstwo snippetów, z których niektóre są przestarzałe przez cechy typów, ale techniki, mimo to, są przydatne do poznania. Jeśli możesz znieść dziwaczne formatowanie/edycję, jest to łatwiejsze do przeczytania niż Alexandrescu, i prawdopodobnie bardziej satysfakcjonujące. Dla bardziej doświadczonych programistów istnieje duża szansa, że dowiedzą się czegoś o ciemnym zakątku C++ (a quirk), który zazwyczaj pojawia się dopiero po zdobyciu dużego doświadczenia.

    Styl odniesienia - wszystkie poziomy

  • Język programowania C++](http://www.amazon.com/dp/0321958322/) (Bjarne Stroustrup) (aktualizacja dla C++11) Klasyczne wprowadzenie do języka C++ autorstwa jego twórcy. Napisany równolegle do klasycznego K&R, ten rzeczywiście jest bardzo podobny i obejmuje wszystko, od podstaw języka, przez bibliotekę standardową, paradygmaty programowania, aż po filozofię języka'. [Recenzja] Uwaga: Wszystkie wydania standardu C++ są śledzone w tym pytaniu: Gdzie znajdę aktualny standard C++.

  • C++ Standard Library Tutorial and Reference (Nicolai Josuttis) (aktualizacja dla C++11) _Wprowadzenie i odniesienie do biblioteki standardowej C++. Druga edycja (wydana 9 kwietnia 2012) obejmuje C++11. [Recenzja]

  • The C++ IO Streams and Locales (Angelika Langer i Klaus Kreft) Niewiele można powiedzieć o tej książce poza tym, że jeśli chcesz wiedzieć cokolwiek o strumieniach i locales, to jest to jedyne miejsce, w którym znajdziesz ostateczne odpowiedzi. [Recenzja] C++11/14/17/... Referencje:

  • The C++11/14/17 Standard (INCITS/ISO/IEC 14882:2011/2014/2017) Jest to, oczywiście, ostateczny arbiter wszystkiego, co jest lub nie jest'C++. Należy jednak pamiętać, że jest on przeznaczony wyłącznie jako odniesienie dla doświadczonych użytkowników, którzy są gotowi poświęcić sporo czasu i wysiłku na jego zrozumienie. Standard C++17 został wydany w formie elektronicznej w cenie 198 franków szwajcarskich.

  • Standard C++17 jest dostępny, ale najwyraźniej nie w ekonomicznej formie - bezpośrednio ze strony ISO kosztuje 198 franków szwajcarskich (około 200 dolarów amerykańskich). Dla większości ludzi, ostateczny projekt przed standaryzacją jest więcej niż wystarczający (i darmowy). Wiele osób będzie wolało jeszcze nowszy szkic, dokumentujący nowe cechy, które prawdopodobnie znajdą się w C++20.

  • Overview of the New C++ (C++11/14) (PDF only) (Scott Meyers) (updated for C++14) Są to materiały prezentacyjne (slajdy i notatki z wykładów) z trzydniowego kursu szkoleniowego prowadzonego przez Scotta Meyersa, który jest bardzo szanowanym autorem w dziedzinie C++. Mimo że lista pozycji jest krótka, jakość jest wysoka.

  • The C++ Core Guidelines (C++11/14/17/...) (pod redakcją Bjarne Stroustrupa i Herba Suttera) jest ewoluującym dokumentem online, składającym się z zestawu wskazówek dotyczących dobrego używania nowoczesnego języka C++. Wytyczne koncentrują się na względnie wyższym poziomie zagadnień, takich jak interfejsy, zarządzanie zasobami, zarządzanie pamięcią i współbieżność, wpływających na architekturę aplikacji i projektowanie bibliotek. Projekt został ogłoszony na CppCon'15 przez Bjarne Stroustrupa i innych i oczekuje wkładu od społeczności. Większość wytycznych jest uzupełniona o uzasadnienie i przykłady, a także dyskusje na temat możliwego wsparcia narzędziowego. Wiele reguł zostało zaprojektowanych specjalnie po to, by były automatycznie sprawdzane przez narzędzia do analizy statycznej.

  • The C++ Super-FAQ (Marshall Cline, Bjarne Stroustrup i inni) jest wysiłkiem Fundacji Standard C++ w celu ujednolicenia FAQ utrzymywanych wcześniej indywidualnie przez Marshalla Cline'a i Bjarne'a Stroustrupa, a także włączenia nowych wkładów. Artykuły dotyczą głównie zagadnień na poziomie średniozaawansowanym i są często napisane w żartobliwym tonie. Nie wszystkie pozycje mogą być jeszcze w pełni zgodne z najnowszą edycją standardu C++.

  • cppreference.com (C++03/11/14/17/...) (zainicjowane przez Nate'a Kohla) jest wiki, które podsumowuje podstawowe cechy języka i posiada obszerną dokumentację biblioteki standardowej C++. Dokumentacja jest bardzo dokładna, ale jest łatwiejsza do czytania niż oficjalny dokument standardowy i zapewnia lepszą nawigację dzięki swojej naturze wiki. Projekt dokumentuje wszystkie wersje standardu C++, a strona umożliwia filtrowanie wyświetlania dla konkretnej wersji. Projekt został zaprezentowany przez Nate'a Kohla na CppCon'14.

    Classics / Older

    Uwaga: Niektóre informacje zawarte w tych książkach mogą nie być aktualne lub nie są już uważane za najlepsze praktyki.

  • The Design and Evolution of C++](http://www.amazon.com/dp/0201543303/) (Bjarne Stroustrup) Jeśli chcesz wiedzieć, dlaczego język jest taki, jaki jest, w tej książce znajdziesz odpowiedź. Obejmuje ona wszystko przed standaryzacją języka C++.

  • Ruminacje o C++ - (Andrew Koenig i Barbara Moo) [Recenzja]

  • Advanced C++ Programming Styles and Idioms](http://www.amazon.com/dp/0201548550/) (James Coplien) Poprzednik ruchu wzorców, opisuje wiele specyficznych dla C++ "idiomów". Jest to z pewnością bardzo dobra książka i może być nadal warta przeczytania, jeśli możesz poświęcić trochę czasu, ale dość stara i nieaktualna w stosunku do obecnego C++.

  • Large Scale C++ Software Design](http://www.amazon.com/dp/0201633620) (John Lakos) Lakos wyjaśnia techniki zarządzania bardzo dużymi projektami oprogramowania w C++. Z pewnością dobra lektura, gdyby tylko była aktualna. Została napisana na długo przed C++ 98 i nie zawiera wielu cech (np. przestrzeni nazw) ważnych dla dużych projektów. Jeśli musisz pracować w dużym projekcie programistycznym w C++, możesz chcieć ją przeczytać, choć musisz wziąć z nią więcej niż ziarno soli. Pierwszy tom nowego wydania to oczekiwany w 2019 roku.

  • Jeśli chcesz wiedzieć, jak powszechnie implementowane są wirtualne funkcje członkowskie i jak obiekty bazowe są powszechnie rozmieszczane w pamięci w scenariuszu dziedziczenia wielokrotnego, a także jak to wszystko wpływa na wydajność, to tutaj znajdziesz dokładne omówienie tych tematów.

  • The Annotated C++ Reference Manual (Bjarne Stroustrup, Margaret A. Ellis) Ta książka jest dość przestarzała, ponieważ bada wersję C++ 2.0 z 1989 roku - szablony, wyjątki, przestrzenie nazw i nowe rzutowania nie były jeszcze wprowadzone. Niemniej jednak, książka ta przechodzi przez cały standard C++ z tamtego okresu, wyjaśniając przesłanki, możliwe implementacje i cechy języka. To nie jest książka do nauki zasad programowania i wzorców w C++, ale do zrozumienia każdego aspektu języka C++.

  • Thinking in C++](http://www.amazon.com/dp/0139798099/) (Bruce Eckel, wyd. 2, 2000). Dwa tomy; jest to zestaw darmowych książek w stylu samouczka. Pliki do pobrania: vol 1, vol 2. Niestety są one obarczone wieloma trywialnymi błędami (np. utrzymywanie, że temporaries są automatycznie const), bez oficjalnej listy erraty. Częściowa lista errata 3rd party jest dostępna na stronie (http://www.computersciencelab.com/Eckel.htm), ale najwyraźniej nie jest ona utrzymywana.

  • Scientific and Engineering C++: An Introduction to Advanced Techniques and Examples (John Barton i Lee Nackman) Jest to obszerna i bardzo szczegółowa książka, która próbowała wyjaśnić i wykorzystać wszystkie funkcje dostępne w C++, w kontekście metod numerycznych. Wprowadziła kilka nowych technik, takich jak Curiously Recurring Template Pattern (CRTP, zwany też trikiem Bartona-Nackmana). Był pionierem kilku technik, takich jak analiza wymiarowa i automatyczne różnicowanie. Dostarczał wiele kompilowalnego i użytecznego kodu, od parsera wyrażeń do wrappera Lapacka. Kod jest wciąż dostępny tutaj: http://www.informit.com/store/scientific-and-engineering-c-plus-plus-an-introduction-9780201533934. Niestety, książki stały się nieco przestarzałe w stylu i cechach C ++, jednak w tamtym czasie (1994, przed STL) było to niesamowite tour-de-force. Rozdziały dotyczące dziedziczenia dynamiki są nieco skomplikowane do zrozumienia i niezbyt użyteczne. Zaktualizowana wersja tej klasycznej książki, która zawiera semantykę ruchu i lekcje wyciągnięte z STL, byłaby bardzo miła.

Komentarze (22)