A végleges C++ könyvkalauz és lista

Ez a kérdés megpróbálja összegyűjteni azt a néhány gyöngyszemet az évente megjelenő tucatnyi rossz C++ könyv közül.

Ellentétben sok más programozási nyelvvel, amelyeket gyakran az interneten található oktatóprogramokból lehet menet közben elsajátítani, a C++ nyelvet kevesen képesek gyorsan elsajátítani egy jól megírt C++ könyv tanulmányozása nélkül. Ehhez túlságosan nagy és összetett. Valójában annyira nagy és összetett, hogy nagyon sok nagyon rossz C++ könyv létezik. És itt most nem a rossz stílusról van szó, hanem olyan dolgokról, mint a kirívóan nyilvánvaló ténybeli hibák és a mélységesen rossz programozási stílusok népszerűsítése.

Kérlek, szerkeszd meg az elfogadott választ, hogy megadj minőségi könyveket és egy hozzávetőleges tudásszintet - előnyösen miután megvitattad a kiegészítésedet a C++ chatszobában. (A törzsvendégek könyörtelenül visszavonhatják a munkádat, ha nem értenek egyet egy ajánlással.) Adj hozzá egy rövid ismertetőt/leírást minden olyan könyvről, amelyet személyesen olvastál/hasznosítottál. Nyugodtan vitatkozzatok a minőségről, címszavakról stb. A kritériumoknak megfelelő könyvek felkerülnek a listára. Azokra a könyvekre, amelyekről a C és C++ felhasználók szövetsége (ACCU) véleményt írt, linkek vezetnek a véleményhez.

*Figyelem: GYIK és egyéb források a C++ tag info és a [tag:c++-faq] alatt találhatók.

Kezdő

Bevezető, korábbi programozási tapasztalat nélkül

  • C++ Primer * (Stanley Lippman, Josée Lajoie, and Barbara E. Moo) (frissítve a C++11-hez) Ez az 1 000 oldalas, nagyon alapos bevezetés a C++-ba, amely a nyelv szinte minden elemét tartalmazza, nagyon közérthető formában és nagy részletességgel. Az ötödik kiadás (2012. augusztus 16-án jelent meg) a C++11-et is tartalmazza. [Áttekintés]
  • Programming: Principles and Practice Using C++ (Bjarne Stroustrup, 2. kiadás - 2014. május 25.) (frissítve a C++11/C++14-hez) A nyelv megalkotójának bevezetése a C++ nyelv használatával történő programozásba. Jó olvasmány, amely nem feltételez programozási előképzettséget, de nem csak kezdőknek szól.

Bevezető, korábbi programozási tapasztalatokkal

  • A Tour of C++ (Bjarne Stroustrup) (2. kiadás a C++17-hez) A "túra" egy gyors (kb. 180 oldal és 14 fejezet) oktató jellegű áttekintés a teljes standard C++-ról (nyelv és standard könyvtár, és a C++11 használata) közepesen magas szinten, olyanok számára, akik már ismerik a C++-t, vagy legalábbis tapasztalt programozók. Ez a könyv a The C++ Programming Language, 4. kiadás 2-5. fejezetét alkotó anyag bővített változata.

  • Accelerated C++ (Andrew Koenig és Barbara Moo, 1. kiadás - 2000. augusztus 24.) Ez alapvetően ugyanazt a területet fedi le, mint a C++ Primer, de negyedakkora helyen. Ez nagyrészt azért van így, mert nem a programozásba próbál bevezetés lenni, hanem a C++ bevezetése azoknak, akik korábban más nyelven programoztak. Meredekebb tanulási görbével rendelkezik, de azok számára, akik ezzel megbirkóznak, nagyon kompakt bevezetést nyújt a nyelvbe. (Történelmileg új utat nyitott azzal, hogy ez volt az első olyan kezdő könyv, amely modern megközelítést alkalmazott a nyelv tanításához.) Ennek ellenére a C++ amelyet tanít, tisztán C++98. [Értékelés]

    Legjobb gyakorlatok

  • Effective C++ (Scott Meyers, 3. kiadás - 2005. május 22.) Ez azzal a céllal íródott, hogy a legjobb második könyv legyen, amit a C++ programozóknak olvasniuk kell, és ez sikerült is. A korábbi kiadások a C-ből érkező programozókat célozták meg, a harmadik kiadás ezt megváltoztatja, és az olyan nyelvekből érkező programozókat célozza meg, mint a Java. Nagyon közérthető (és élvezetes) stílusban mutat be ~50 könnyen megjegyezhető hüvelykujjszabályt az indoklásukkal együtt. A C++11 és C++14 esetében a példák és néhány kérdés elavult, ezért az Effective Modern C++ inkább az Effective Modern C++-t kell előnyben részesíteni. [Review]

  • Effective Modern C++ (Scott Meyers) Ez lényegében az Effective C++ új változata, amely a C++03-ról a C++11-re és a C++14-re való átállás előtt álló C++ programozóknak szól.

  • Effective STL (Scott Meyers) Célja, hogy ugyanazt tegye a szabványkönyvtár STL-ből származó részével, amit a Effective C++ tett a nyelv egészével: Ökölszabályokat mutat be azok indoklásával együtt. [Review]

    Intermediate

  • More Effective C++ (Scott Meyers) Még több ökölszabály, mint a Effective C++. Nem olyan fontosak, mint az első könyvben találhatóak, de azért jó tudni.

  • Exceptional C++ (Herb Sutter) Rejtvények sorozataként bemutatva, ez tartalmazza az egyik legjobb és alaposabb tárgyalását a megfelelő erőforrás-kezelésnek és a kivételek biztonságának a C++-ban az Resource Acquisition is Initialization (RAII) segítségével, emellett számos más témát is alaposan tárgyal, beleértve a pimpl idiómát, a névkeresést, a jó osztálytervezést és a C++ memóriamodellt. [Áttekintés]

  • More Exceptional C++ (Herb Sutter) Az Exceptional C++-ban nem tárgyalt további kivételbiztonsági témákat tárgyalja, emellett a hatékony objektumorientált programozás C++-ban és az STL helyes használata is szóba kerül. [Áttekintés]

  • Exceptional C++ Style (Herb Sutter) Az általános programozást, az optimalizálást és az erőforrás-kezelést tárgyalja; ez a könyv azt is kiválóan bemutatja, hogyan lehet moduláris kódot írni C++-ban a nem-tag függvények és az egy felelősség elve segítségével. [Recenzió]

  • C++ Coding Standards (Herb Sutter és Andrei Alexandrescu) A "Coding standards" itt nem azt jelenti, hogy "hány szóközzel kell behúzni a kódomat?". Ez a könyv 101 legjobb gyakorlatot, idiómát és gyakori buktatót tartalmaz, amelyek segíthetnek helyes, érthető és hatékony C++ kódot írni. [Recenzió]

  • C++ Templates: The Complete Guide (David Vandevoorde és Nicolai M. Josuttis) Ez a könyv a sablonokról, ahogyan azok a C++11 előtt léteztek. A legapróbb alapoktól a legfejlettebb sablon-metaprogramozásig mindent tárgyal, és minden részletét elmagyarázza a sablonok működésének (mind koncepcionálisan, mind a megvalósításuknál), és számos gyakori buktatót tárgyal. A függelékben kiváló összefoglalókat tartalmaz az Egy definíciós szabályról (ODR) és a túlterhelés feloldásáról. Már megjelent egy második kiadás, amely a C++11, a C++14 és a C++17 szabványokat tárgyalja. [Áttekintés]

  • C++ 17 - The Complete Guide (Nicolai M. Josuttis) Ez a könyv a C++17 szabványban bevezetett összes újdonságot ismerteti, lefedve az egyszerűbbektől kezdve az 'Inline változók', 'constexpr if' egészen a 'Polymorf memóriaforrások' és az 'Új és törlés túlkódolt adatokkal'-ig.

    Haladó

  • Modern C++ Design (Andrei Alexandrescu) Egy úttörő könyv a fejlett általános programozási technikákról. Bemutatja a policy-alapú tervezést, a típuslistákat és az alapvető generikus programozási idiómákat, majd elmagyarázza, hogyan lehet számos hasznos tervezési mintát (beleértve a kis objektum allokátorokat, functorokat, gyárakat, látogatókat és több metódust) hatékonyan, modulárisan és tisztán megvalósítani a generikus programozás segítségével. [Áttekintés]

  • C++ Template Metaprogramming (David Abrahams és Aleksey Gurtovoy)

  • C++ Concurrency In Action (Anthony Williams) A C++11 párhuzamossági támogatásával foglalkozó könyv, beleértve a szálkönyvtárat, az atomics könyvtárat, a C++ memóriamodellt, a zárakat és a mutexeket, valamint a többszálú alkalmazások tervezésének és hibakeresésének kérdéseit. Már megjelent egy második kiadás, amely a C++14 és a C++17 programokat tárgyalja.

  • Advanced C++ Metaprogramming (Davide Di Gennaro) A C++11 előtti TMP technikák kézikönyve, amely inkább a gyakorlatra, mint az elméletre összpontosít. Rengeteg szippantás van ebben a könyvben, amelyek közül néhányat a type traits elavulttá tett, de a technikákat, ennek ellenére hasznos tudni. Ha el tudod viselni a furcsa formázást/szerkesztést, könnyebben olvasható, mint Alexandrescu könyve, és vitathatatlanul kifizetődőbb. A tapasztaltabb fejlesztők számára jó esély van arra, hogy a C++ egy olyan sötét szegletéről (furcsaságáról) is megtudhatsz valamit, amire általában csak kiterjedt tapasztalattal lehet rájönni.

    Referencia stílus - Minden szint

  • The C++ Programming Language (Bjarne Stroustrup) (frissítve a C++11-hez) A C++ klasszikus bevezetése a C++ megalkotójától. A klasszikus K&R-rel párhuzamosan íródott, és valóban nagyon hasonlít rá, és szinte mindent tárgyal a nyelv magjától a szabványos könyvtáron át a programozási paradigmákig és a nyelv filozófiájáig. [Áttekintés] Megjegyzés: A C++ szabvány minden kiadása nyomon követhető ebben a kérdésben: Hol találom az aktuális C++ szabványt.

  • C++ Standard Library Tutorial and Reference (Nicolai Josuttis) (frissítve a C++11-hez) A C++ Standard Library bevezetője és referenciája. A második kiadás (2012. április 9-én jelent meg) a C++11-et is tartalmazza. [Áttekintés]

  • The C++ IO Streams and Locales (Angelika Langer és Klaus Kreft) Erről a könyvről nagyon kevés mondanivaló van, kivéve, hogy ha bármit is tudni akarsz a streamekről és a locales-ekről, akkor itt megtalálod a végleges válaszokat. [Recenzió] C++11/14/11/17/... Hivatkozások:

  • A C++11/14/17 szabvány (INCITS/ISO/IEC 14882:2011/2014/2017) Ez természetesen a végső döntőbírája mindannak, ami C++ vagy nem C++. Legyen azonban tudatában annak, hogy pusztán referenciának szánják tapasztalt felhasználók számára, akik hajlandóak jelentős időt és energiát áldozni a megértésére. A C++17 szabvány elektronikus formában 198 svájci frankért jelenik meg.

  • A C++17 szabvány elérhető, de úgy tűnik, nem gazdaságos formában - közvetlenül az ISO-tól 198 svájci frankba (kb. 200 dollár) kerül. A legtöbb ember számára a szabványosítás előtti végleges tervezet több mint megfelelő (és ingyenes). Sokan inkább a még újabb tervezetet fogják előnyben részesíteni, amely olyan új funkciókat dokumentál, amelyek valószínűleg bekerülnek a C++20-ba.

  • Overview of the New C++ (C++11/14) (csak PDF) (Scott Meyers) (frissítve a C++14-hez) Ezek egy háromnapos tanfolyam prezentációs anyagai (diák és néhány előadás jegyzete), amelyet Scott Meyers tartott, aki a C++ egyik legelismertebb szerzője. Bár a tételek listája rövid, a minőség magas.

  • A C++ Core Guidelines (C++11/14/17/...) (szerkesztette Bjarne Stroustrup és Herb Sutter) egy fejlődő online dokumentum, amely a modern C++ jó használatára vonatkozó irányelvekből áll. Az irányelvek viszonylag magasabb szintű kérdésekre összpontosítanak, mint például az interfészek, az erőforrás-kezelés, a memóriakezelés és az alkalmazásarchitektúrát és a könyvtártervezést befolyásoló párhuzamosság. A projektet Bjarne Stroustrup és mások a CppCon'15-ön jelentették be és várja a közösség hozzájárulásait. A legtöbb iránymutatást indoklással és példákkal, valamint a lehetséges eszköztámogatásról szóló megbeszélésekkel egészítik ki. Sok szabályt kifejezetten úgy terveztek, hogy statikus elemző eszközökkel automatikusan ellenőrizhető legyen.

  • A C++ Super-FAQ (Marshall Cline, Bjarne Stroustrup és mások) a Standard C++ Foundation erőfeszítése a korábban Marshall Cline és Bjarne Stroustrup által külön-külön karbantartott C++ GYIK-ek egységesítésére, valamint új hozzájárulások beépítésére. A cikkek többnyire középhaladó szintű kérdésekkel foglalkoznak, és gyakran humoros hangvételűek. Előfordulhat, hogy még nem minden cikk felel meg teljesen a C++ szabvány legújabb kiadásának.

  • cppreference.com (C++03/11/14/17/...) (kezdeményezője Nate Kohl) egy olyan wiki, amely összefoglalja a nyelv alapvető alapfunkcióit, és kiterjedt dokumentációval rendelkezik a C++ szabványkönyvtárról. A dokumentáció nagyon precíz, de könnyebben olvasható, mint a hivatalos szabványdokumentum, és wiki jellegéből adódóan jobb navigációt biztosít. A projekt a C++ szabvány összes verzióját dokumentálja, és az oldal lehetővé teszi a megjelenítés szűrését egy adott verzióra. A projektet Nate Kohl mutatta be a CppCon'14-en.

    Klasszikusok / Régebbi

    Figyelem: Az ezekben a könyvekben található egyes információk nem feltétlenül naprakészek, vagy már nem tekinthetők a legjobb gyakorlatnak.

  • The Design and Evolution of C++ (Bjarne Stroustrup) Ha tudni akarod, hogy miért olyan a nyelv, amilyen, ebben a könyvben megtalálod a válaszokat. Ez mindent lefed a C++ szabványosítása előtti időszakot.

  • Ruminations on C++ - (Andrew Koenig and Barbara Moo) [Review]

  • Advanced C++ Programming Styles and Idioms (James Coplien) A pattern mozgalom elődje, számos C++-specifikus "idiómát" ír le. Ez egy nagyon jó könyv, és talán még mindig érdemes elolvasni, ha van rá időd, de elég régi és nem naprakész a jelenlegi C++-hoz képest.

  • Large Scale C++ Software Design (John Lakos) Lakos a nagyon nagy C++ szoftverprojektek kezelésének technikáit ismerteti. Minden bizonnyal jó olvasmány, ha csak aktuális lenne. Jóval a C++ 98 előtt íródott, és számos, a nagyszabású projektek számára fontos funkciót (pl. névterek) kihagy. Ha nagy C++ szoftverprojektben kell dolgoznod, érdemes elolvasnod, bár több mint egy szemernyi sót kell hozzátenned. Az új kiadás első kötete várhatóan 2019-ben.

  • Inside the C++ Object Model (Stanley Lippman) Ha tudni szeretné, hogy a virtuális tagfüggvényeket általában hogyan valósítják meg, és hogyan helyezik el az alapobjektumokat a memóriában egy többszörös öröklődési forgatókönyvben, és mindez hogyan befolyásolja a teljesítményt, akkor itt alapos tárgyalásokat talál az ilyen témákról.

  • The Annotated C++ Reference Manual (Bjarne Stroustrup, Margaret A. Ellis) Ez a könyv meglehetősen elavult abban a tekintetben, hogy az 1989-es C++ 2.0-s verzióját vizsgálja - a sablonok, kivételek, névterek és az új castok még nem voltak bevezetve. Azt mondhatjuk azonban, hogy ez a könyv végigmegy a teljes akkori C++ szabványon, elmagyarázva a nyelv logikáját, lehetséges megvalósításait és jellemzőit. Ez a könyv nem a C++ programozási elveinek és mintáinak megtanulására szolgál, hanem a C++ nyelv minden aspektusának megértésére.

  • [Thinking in C++] (http://www.amazon.com/dp/0139798099/) (Bruce Eckel, 2. kiadás, 2000). Két kötet; egy oktató jellegű, bevezető szintű könyvekből álló mentes sorozat. Letöltések: 1. kötet, 2. kötet. Sajnos ezek’t számos triviális hibával (pl. annak fenntartása, hogy az ideiglenesek automatikusan const), hivatalos errata lista nélkül. Egy részleges 3rd fél hibalistája elérhető a (http://www.computersciencelab.com/Eckel.htm) címen, de úgy tűnik, hogy nem karbantartott.

  • Tudományos és mérnöki C++: An Introduction to Advanced Techniques and Examples (John Barton és Lee Nackman) Ez egy átfogó és nagyon részletes könyv, amely a numerikus módszerekkel összefüggésben igyekezett elmagyarázni és felhasználni a C++-ban rendelkezésre álló összes funkciót. Annak idején számos új technikát mutatott be, mint például a Curiously Recurring Template Pattern (CRTP, más néven Barton-Nackman trükk). Úttörő szerepet játszott több olyan technikában, mint a dimenzióelemzés és az automatikus differenciálás. Rengeteg fordítható és hasznos kódot tartalmazott, a kifejezés-elemzőtől kezdve a Lapack wrapperig. A kód még mindig elérhető itt: http://www.informit.com/store/scientific-and-engineering-c-plus-plus-an-introduction-9780201533934. Sajnos a könyvek stílusa és a C++ funkciók kissé elavultak, azonban akkoriban (1994, az STL előtt) hihetetlenül nagy túra volt. A dinamikai öröklődésről szóló fejezetek kissé bonyolultan érthetőek és nem túl hasznosak. Nagyon jó lenne egy frissített változata ennek a klasszikus könyvnek, amely tartalmazza a mozgatás szemantikáját és az STL tanulságait.

Kommentárok (22)