Dokončni vodnik in seznam knjig C++

To vprašanje poskuša zbrati nekaj biserov med desetinami slabih knjig o C++, ki izidejo vsako leto.

Za razliko od številnih drugih programskih jezikov, ki jih pogosto osvojimo na poti z učnimi gradivi, ki jih najdemo na internetu, lahko le redki hitro osvojijo C++ brez študija dobro napisane knjige o C++. Za to je namreč preveč obsežen in zapleten. Pravzaprav je tako velik in zapleten, da obstaja zelo veliko zelo slabih knjig o C++. Pri tem ne govorimo o slabem slogu, ampak o stvareh, kot so krajno očitne stvarne napake in promoviranje skrajno slabih programskih slogov.

Prosimo, da uredite sprejeti odgovor in navedete kvalitetne knjige in približno raven znanja - najbolje _po tem, ko boste o svojem dodatku razpravljali v klepetalnici C++. (Redni uporabniki lahko neusmiljeno razveljavijo vaše delo, če se s priporočilom ne strinjajo.) Dodajte kratek zapis/opis o vsaki knjigi, ki ste jo osebno prebrali/od katere ste imeli koristi. Lahko razpravljate o kakovosti, naslovih itd. Knjige, ki izpolnjujejo merila, bodo dodane na seznam. Knjige, ki jih je pregledalo Združenje uporabnikov C in C++ (ACCU), imajo povezave do pregleda.

*Opomba: Pogosta vprašanja in drugi viri so na voljo v razdelku C++ tag info in pod [tag:c++-faq].

Začetnik

Uvodni, brez predhodnih izkušenj s programiranjem

  • C++ Primer * (Stanley Lippman, Josée Lajoie in Barbara E. Moo) (posodobljeno za C++11) Na 1 tisoč straneh je to zelo temeljit uvod v C++, ki v zelo dostopni obliki in zelo podrobno obravnava skoraj vse v jeziku. Peta izdaja (izšla 16. avgusta 2012) zajema C++11. [Recenzija]
  • Programming: Principles and Practice Using C++ (Bjarne Stroustrup, 2. izdaja - 25. maj 2014) (posodobljeno za C++11/C++14) Uvod v programiranje s C++, ki ga je napisal ustvarjalec tega jezika. Dobro branje, ki ne predpostavlja predhodnih izkušenj s programiranjem, vendar ni namenjeno le začetnikom.

Uvodni del, s predhodnimi izkušnjami s programiranjem

  • A Tour of C++ (Bjarne Stroustrup) (2. izdaja za C++17) "Ogled" je hiter (približno 180 strani in 14 poglavij) učni pregled celotnega standardnega C++ (jezik in standardna knjižnica, in uporaba C++11) na zmerno visoki ravni za ljudi, ki že poznajo C++ ali so vsaj izkušeni programerji. Ta knjiga je razširjena različica gradiva, ki predstavlja poglavja 2-5 knjige The C++ Programming Language, 4. izdaja.

  • Accelerated C++ (Andrew Koenig in Barbara Moo, 1. izdaja - 24. avgust 2000) V osnovi pokriva isto področje kot C++ Primer, vendar na četrtini prostora. To je predvsem zato, ker ne gre za uvod v programiranje, temveč za uvod v C++ za ljudi, ki so prej programirali v kakšnem drugem jeziku. Ima bolj strmo krivuljo učenja, vendar je za tiste, ki se s tem lahko spopadejo, zelo kompakten uvod v jezik. (Zgodovinsko gledano je bila prva knjiga za začetnike, ki je uporabljala sodoben pristop k poučevanju jezika.) Kljub temu je C++ ki ga uči, je izključno C++98. [Recenzija]

    Najboljše prakse

  • Effective C++ (Scott Meyers, 3. izdaja - 22. maj 2005) Napisana je bila z namenom, da bi bila najboljša druga knjiga, ki bi jo morali prebrati programerji C++, in to ji je uspelo. Prejšnje izdaje so bile namenjene programerjem, ki prihajajo iz C, tretja izdaja pa to spreminja in je namenjena programerjem, ki prihajajo iz jezikov, kot je Java. V zelo dostopnem (in prijetnem) slogu predstavlja ~50 lahko zapomnljivih pravil in njihovo utemeljitev. Za C++11 in C++14 so primeri in nekaj vprašanj zastareli, zato je treba dati prednost Učinkovitemu sodobnemu C++. [Recenzija]

  • Effective Modern C++]1 (Scott Meyers) To je pravzaprav nova različica Effective C++, namenjena programerjem C++, ki prehajajo s C++03 na C++11 in C++14.

  • Effective STL (Scott Meyers) Namen tega je narediti enako za del standardne knjižnice, ki izhaja iz STL, kot je Effective C++ naredil za jezik kot celoto: V njem so predstavljena pravila in njihova utemeljitev. [Pregled]

    Intermediate

  • More Effective C++ (Scott Meyers) Še več pravil kot Effective C++. Niso tako pomembna kot v prvi knjigi, vendar jih je še vedno dobro poznati.

  • Exceptional C++ (Herb Sutter) Knjiga, ki je predstavljena kot sklop ugank, vsebuje eno najboljših in temeljitih razprav o pravilnem upravljanju virov in varnosti izjem v C++ s pomočjo pridobivanja virov in inicializacije (RAII), poleg tega pa poglobljeno obravnava tudi številne druge teme, vključno z idiomom pimpl, iskanjem imen, dobro zasnovo razredov in pomnilniškim modelom C++. [Pregled]

  • More Exceptional C++ (Herb Sutter) Poleg razprave o učinkovitem objektno usmerjenem programiranju v C++ in pravilni uporabi STL zajema dodatne teme o varnosti izjem, ki niso zajete v Exceptional C++. [Review]

  • Exceptional C++ Style (Herb Sutter) Obravnava generično programiranje, optimizacijo in upravljanje virov; v tej knjigi je tudi odlično predstavljeno, kako pisati modularno kodo v C++ z uporabo nečlanskih funkcij in načela ene odgovornosti. [Recenzija]

  • C++ Coding Standards (Herb Sutter in Andrei Alexandrescu) "Kodirni standardi" tu ne pomenijo "koliko presledkov naj odmislim v svoji kodi?". Ta knjiga vsebuje 101 najboljšo prakso, idiome in pogoste pasti, ki vam lahko pomagajo pri pisanju pravilne, razumljive in učinkovite kode C++. [Recenzija]

  • C++ Templates: The Complete Guide (David Vandevoorde in Nicolai M. Josuttis) To je knjiga o predlogah, kakršne so obstajale pred C++11. Zajema vse od osnov do najnaprednejšega metaprogramiranja predlog in razloži vsako podrobnost delovanja predlog (tako konceptualno kot pri njihovem izvajanju) ter obravnava številne pogoste pasti. V dodatkih ima odlične povzetke pravila ene definicije (ODR) in razreševanja preobremenitev. Objavljena je bila že druga izdaja, ki zajema C++11, C++14 in C++17. [Recenzija]

  • C++ 17 - The Complete Guide (Nicolai M. Josuttis) Knjiga opisuje vse novosti, uvedene v standardu C++17, in zajema vse od preprostih, kot so 'Inline Variables', 'constexpr if' vse do 'Polymorphic Memory Resources' ter 'New and Delete with overaligned Data'.

    Napredno

  • Modern C++ Design (Andrei Alexandrescu) Prelomna knjiga o naprednih tehnikah generičnega programiranja. Predstavi načrtovanje, ki temelji na politikah, sezname tipov in temeljne idiome generičnega programiranja, nato pa razloži, kako je mogoče številne uporabne oblikovne vzorce (vključno z dodeljevalniki majhnih predmetov, funktorji, tovarnami, obiskovalci in več metodami) učinkovito, modularno in čisto implementirati z uporabo generičnega programiranja. [Pregled]

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

  • C++ Concurrency In Action (Anthony Williams) Knjiga, ki zajema podporo za sočasnost v C++11, vključno s knjižnico niti, knjižnico atomics, pomnilniškim modelom C++, ključavnicami in mutexi, ter vprašanja načrtovanja in odpravljanja napak večnitnih aplikacij. Objavljena je bila že druga izdaja, ki zajema C++14 in C++17.

  • Advanced C++ Metaprogramming (Davide Di Gennaro) Priročnik tehnik TMP iz obdobja pred C++11, ki je bolj osredotočen na prakso kot na teorijo. V tej knjigi je ogromno utrinkov, od katerih so nekateri zaradi lastnosti tipov zastareli, vendar je tehnike kljub temu koristno poznati. Če se lahko sprijaznite z nenavadnim oblikovanjem in urejanjem, je knjigo lažje brati kot Alexandrescu in je verjetno bolj koristna. Za bolj izkušene razvijalce obstaja velika verjetnost, da boste izvedeli kaj o temnem kotičku C++ (quirk), ki ga običajno spoznamo šele z bogatimi izkušnjami.

    Referenčni slog - vse stopnje

  • The C++ Programming Language (Bjarne Stroustrup) (updated for C++11) Klasični uvod v C++, ki ga je napisal njegov avtor. Napisan je vzporedno s klasičnim K&R, zato se dejansko bere zelo podobno in zajema skoraj vse, od jedra jezika do standardne knjižnice, programskih paradigem in filozofije jezika. [Review] Opomba: V tem vprašanju so zajete vse izdaje standarda C++: Kje najdem trenutni standard C++.

  • C++ Standard Library Tutorial and Reference (Nicolai Josuttis) (posodobljeno za C++11) _Uvod in referenca za standardno knjižnico C++. Druga izdaja (izšla 9. aprila 2012) zajema C++11. [Review]

  • The C++ IO Streams and Locales (Angelika Langer in Klaus Kreft) O tej knjigi ni'kaj dosti povedati, razen tega, da če želite vedeti karkoli o tokovih in krajih, potem je to edino mesto, kjer boste našli dokončne odgovore. [Recenzija] C++11/14/17/... Reference:

  • Standard C++11/14/17 (INCITS/ISO/IEC 14882:2011/2014/2017) To je seveda končni razsodnik vsega, kar je ali ni C++. Vendar se zavedajte, da je namenjen izključno kot referenca za izkušene uporabnike, ki so pripravljeni nameniti veliko časa in truda za njegovo razumevanje. Standard C++17 je izdan v elektronski obliki za 198 švicarskih frankov.

  • Standard C++17 je na voljo, vendar očitno ne v ekonomični obliki - neposredno pri ISO stane 198 švicarskih frankov (približno 200 ameriških dolarjev). Za večino ljudi je končni osnutek pred standardizacijo več kot primeren (in brezplačen). Mnogim bo bolj všeč še novejši osnutek, ki dokumentira nove funkcije, ki bodo verjetno vključene v C++20.

  • Pregled novega C++ (C++11/14) (samo PDF) (Scott Meyers) (posodobljeno za C++14) To je predstavitveno gradivo (diapozitivi in nekaj zapiskov predavanj) tridnevnega usposabljanja, ki ga je ponudil Scott Meyers, zelo priznan avtor o C++. Čeprav je seznam predmetov kratek, je njihova kakovost visoka.

  • [C++ Core Guidelines (C++11/14/17/...)] (https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md) (uredila sta ga Bjarne Stroustrup in Herb Sutter) je razvijajoči se spletni dokument, sestavljen iz niza smernic za dobro uporabo sodobnega C++. Smernice se osredotočajo na vprašanja razmeroma višje ravni, kot so vmesniki, upravljanje virov, upravljanje pomnilnika in sočasnost, ki vplivajo na arhitekturo aplikacij in zasnovo knjižnic. Projekt so na konferenci CppCon'15 napovedali Bjarne Stroustrup in drugi in pozdravlja prispevke skupnosti. Večina smernic je dopolnjena z utemeljitvijo in primeri ter razpravami o možni podpori orodij. Številna pravila so zasnovana posebej za samodejno preverjanje z orodji za statično analizo.

  • C++ Super-FAQ (Marshall Cline, Bjarne Stroustrup in drugi) je prizadevanje Fundacije Standard C++ za poenotenje pogostih vprašanj in odgovorov o C++, ki sta jih prej posamično vzdrževala Marshall Cline in Bjarne Stroustrup, ter vključitev novih prispevkov. Postavke večinoma obravnavajo vprašanja na srednji ravni in so pogosto napisane v humornem tonu. Vsi članki morda še niso popolnoma posodobljeni z najnovejšo izdajo standarda C++.

  • cppreference.com (C++03/11/14/17/...) (pobudnik Nate Kohl) je wiki, ki povzema osnovne značilnosti jedra jezika in ima obsežno dokumentacijo standardne knjižnice C++. Dokumentacija je zelo natančna, vendar je lažje berljiva kot uradni standardni dokument in zaradi svoje narave wikija omogoča boljšo navigacijo. Projekt dokumentira vse različice standarda C++, stran pa omogoča filtriranje prikaza za določeno različico. Projekt je [predstavil Nate Kohl na konferenci CppCon'14] (https://isocpp.org/blog/2015/07/cppcon-2014-cppreference.com-documenting-cpp-one-edit-at-a-time-nate-kohl).

    Klasika / starejše

    Pomnilo: Nekatere informacije v teh knjigah morda niso posodobljene ali ne veljajo več za najboljšo prakso.

  • The Design and Evolution of C++ (Bjarne Stroustrup) Če želite vedeti, zakaj je jezik takšen, kot je, boste v tej knjigi našli odgovore. V njej je zajeto vse, kar se je dogajalo pred standardizacijo C++.

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

  • Advanced C++ Programming Styles and Idioms (James Coplien) Predhodnik gibanja vzorcev opisuje številne "idiome", značilne za C++. Vsekakor je to zelo dobra knjiga in bi jo bilo morda še vedno vredno prebrati, če si lahko vzamete čas, vendar je precej stara in ni posodobljena s trenutnim C++.

  • Large Scale C++ Software Design (John Lakos) Lakos razloži tehnike za upravljanje zelo velikih projektov programske opreme C++. Vsekakor dobro branje, če bi bilo le posodobljeno. Napisano je bilo veliko pred C++ 98 in v njem manjkajo številne lastnosti (npr. imenske prostore), ki so pomembne za velike projekte. Če morate delati v velikem projektu programske opreme C++, ga boste morda želeli prebrati, čeprav ga je treba jemati z več kot zrnom soli. Prvi zvezek nove izdaje je predvidoma leta 2019.

  • Inside the C++ Object Model (Stanley Lippman) Če želite izvedeti, kako se običajno izvajajo virtualne članske funkcije in kako so osnovni objekti običajno razporejeni v pomnilniku v scenariju več dednosti ter kako vse to vpliva na zmogljivost, boste na tem mestu našli temeljite razprave o teh temah.

  • The Annotated C++ Reference Manual (Bjarne Stroustrup, Margaret A. Ellis) Ta knjiga je precej zastarela, saj obravnava različico C++ 2.0 iz leta 1989 - predloge, izjeme, imenske prostore in nove oddaje še niso bile uvedene. Vendar pa ta knjiga obravnava celoten takratni standard C++ in pojasnjuje razloge, možne izvedbe in značilnosti jezika. To ni knjiga za učenje programskih načel in vzorcev na C++, temveč za razumevanje vseh vidikov jezika C++.

  • Thinking in C++ (Bruce Eckel, 2. izdaja, 2000). Dva zvezka; gre za brezplačen komplet knjig za uvodno raven v učbeniški slog. Prenosi: 1. del, 2. del. Na žalost ju’zaznamujejo številne trivialne napake (npr. ohranjanje, da so temporarji samodejno const), brez uradnega seznama napak. Delni seznam errat 3rd stranke je na voljo na (http://www.computersciencelab.com/Eckel.htm), vendar se očitno ne vzdržuje.

  • Scientific and Engineering C++: An Introduction to Advanced Techniques and Examples (John Barton in Lee Nackman) Gre za izčrpno in zelo podrobno knjigo, ki je poskušala razložiti in uporabiti vse funkcije, ki so na voljo v C++, v kontekstu numeričnih metod. Takrat je predstavila več novih tehnik, kot je Curiously Recurring Template Pattern (CRTP, imenovan tudi Barton-Nackmanov trik). Bil je pionir več tehnik, kot sta dimenzijska analiza in avtomatska diferenciacija. Vseboval je veliko sestavljive in uporabne kode, od analizatorja izrazov do Lapackovega ovitka. Koda je še vedno na voljo tukaj: http://www.informit.com/store/scientific-and-engineering-c-plus-plus-an-introduction-9780201533934. Žal so knjige nekoliko zastarele v slogu in funkcijah C++, vendar je bila v tistem času (1994, predSTL) to neverjetna tour-de-force. Poglavja o dedovanju dinamike so nekoliko zapletena za razumevanje in ne preveč uporabna. Posodobljena različica te klasične knjige, ki bi vključevala semantiko premikanja in spoznanja, pridobljena s STL, bi bila zelo dobra.

Komentarji (22)