Galīgais C++ grāmatu ceļvedis un saraksts

Šajā jautājumā ir mēģināts apkopot dažas pērles starp desmitiem slikto C++ grāmatu, kas tiek publicētas katru gadu.

Atšķirībā no daudzām citām programmēšanas valodām, kuras bieži vien apgūst, izmantojot internetā atrodamās pamācības, reti kurš spēj ātri apgūt C++, neizstudējot labi uzrakstītu C++ grāmatu. Tā ir pārāk liela un sarežģīta, lai to darītu. Patiesībā tā ir tik liela un sarežģīta, ka ir ļoti daudz ļoti sliktu C++ grāmatu. Un mēs nerunājam par sliktu stilu, bet gan par tādām lietām kā kropļojoši acīmredzamas faktu kļūdas un _neiedomājami sliktu programmēšanas stilu popularizēšana.

Lūdzu, rediģējiet pieņemto atbildi, lai norādītu kvalitatīvas grāmatas un aptuveno prasmju līmeni - _vēlams __pēc tam, kad apspriedāt savu papildinājumu C++ tērzēšanas istabā. (Regulārie lietotāji var nežēlīgi atcelt jūsu darbu, ja viņi nepiekrīt ieteikumam).) Pievienojiet īsu aprakstu/aprakstu par katru grāmatu, kuru esat personīgi lasījis/izmantojis. Varat brīvi diskutēt par kvalitāti, virsrakstiem utt. Grāmatas, kas atbilst kritērijiem, tiks pievienotas sarakstam. Grāmatām, kurām ir C un C++ lietotāju asociācijas (ACCU) recenzijas, ir saites uz recenzijām.

*Piezīme: Biežāk uzdotie jautājumi un citi resursi atrodami C++ tag info un sadaļā [tag:c++-faq].

Iesācējs

Iepazīšanās, bez iepriekšējas programmēšanas pieredzes

  • C++ Primer * (Stanley Lippman, Josée Lajoie un Barbara E. Moo) (atjaunināts C++11) 1k lappušu apjomā šis ir ļoti pamatīgs ievads C++ valodā, kurā ļoti saprotamā formā un detalizēti aplūkots gandrīz viss valodas aspekts. Piektais izdevums (iznācis 2012. gada 16. augustā) aptver C++11. [Review]
  • Programming: Principles and Practice Using C++ (Bjarne Stroustrup, 2. izdevums - 2014. gada 25. maijs) (atjaunināts atbilstoši C++11/C++14) Ievads programmēšanā, izmantojot C++, ko sarakstījis šīs valodas radītājs. Laba lasāmviela, kurā netiek pieļauta iepriekšēja programmēšanas pieredze, taču tā nav domāta tikai iesācējiem.

Ievads, ar iepriekšēju programmēšanas pieredzi

  • A Tour of C++ (Bjarne Stroustrup) (2nd edition for C++17). "Ekskursija" ir ātrs (apmēram 180 lappuses un 14 nodaļas) mācību pārskats par visu standarta C++ (valoda un standarta bibliotēka, un C++11 izmantošana) vidēji augstā līmenī cilvēkiem, kas jau pārzina C++ vai vismaz ir pieredzējuši programmētāji. Šī grāmata ir paplašināta tā materiāla versija, kas veido The C++ Programming Language, 4th edition 2.-5. nodaļu.

  • Accelerated C++ (Andrew Koenig un Barbara Moo, 1. izdevums - 2000. gada 24. augusts) Šī grāmata būtībā aptver to pašu, ko C++ Primer, bet tikai ceturtajā daļā no tās apjoma. Tas lielā mērā ir tāpēc, ka tā nav ieskats programmēšanā, bet gan ieskats C++ cilvēkiem, kas iepriekš ir programmējuši kādā citā valodā. Tajā ir stāvāka mācīšanās līkne, bet tiem, kas ar to spēj tikt galā, tas ir ļoti kompakts ievads šajā valodā. (Vēsturiski tā bija pirmā grāmata iesācējiem, kas izmantoja mūsdienīgu pieeju valodas mācīšanai.) Neskatoties uz to, C++ ir tikai C++98. [Review]

    Labākā prakse

  • Effective C++ (Scott Meyers, 3. izdevums - 2005. gada 22. maijs) Šī grāmata tika sarakstīta ar mērķi kļūt par labāko otro grāmatu, kas C++ programmētājiem būtu jāizlasa, un tas tai izdevās. Iepriekšējie izdevumi bija domāti programmētājiem, kas nāk no C valodas, bet trešais izdevums to maina un ir domāts programmētājiem, kas nāk no tādām valodām kā Java. Tajā ļoti pieejamā (un patīkamā) stilā ir izklāstīti ~50 viegli iegaumējami īkšķu noteikumi un to pamatojums. C++11 un C++14 piemēri un daži jautājumi ir novecojuši, tāpēc priekšroka būtu jādod Effective Modern C++. [Review]

  • Effective Modern C++ (Scott Meyers) Šī būtībā ir Effective C++ jaunā versija, kas paredzēta C++ programmētājiem, kuri pāriet no C++03 uz C++11 un C++14.

  • Effective STL (Scott Meyers) Tās mērķis ir panākt to pašu, ko Effective C++ panāca ar standarta bibliotēkas daļu, kas nāk no STL, un ar valodu kopumā: Tajā sniegti īkšķu noteikumi un to pamatojums. [Pārskats]

    Intermediate

  • More Effective C++ (Scott Meyers) Vēl vairāk prakses noteikumu nekā Effective C++. Ne tik svarīgi kā pirmajā grāmatā, bet tomēr labi zināt.

  • Exceptional C++ (Herb Sutter) Šajā grāmatā, kas pasniegta kā mīklu komplekts, ir viens no labākajiem un pamatīgākajiem pārskati par pareizu resursu pārvaldību un izņēmumu drošību C++, izmantojot Resource Acquisition is Initialization (RAII), kā arī padziļināti aplūkotas dažādas citas tēmas, tostarp pimpl idioma, vārdu meklēšana, labs klases dizains un C++ atmiņas modelis. [Pārskats]

  • More Exceptional C++ (Herb Sutter) Papildus diskusijām par efektīvu objektorientētu programmēšanu C++ valodā un pareizu STL lietošanu aplūkoti papildu izņēmumu drošības temati, kas nav apskatīti Exceptional C++. [Pārskats]

  • Exceptional C++ Style (Herb Sutter) Šajā grāmatā ir aplūkota vispārīgā programmēšana, optimizācija un resursu pārvaldība; tajā ir arī lieliski izklāstīts, kā rakstīt moduļu kodu C++ valodā, izmantojot ne-locekļu funkcijas un vienas atbildības principu. [Review]

  • C++ kodēšanas standarti (Herb Sutter un Andrei Alexandrescu) "Kodēšanas standarti" šeit nenozīmē "cik atstarpēm man vajadzētu ievilkt kodu?". Šajā grāmatā ir apkopota 101 labākā prakse, idiomas un biežāk sastopamās kļūdas, kas var palīdzēt jums rakstīt pareizu, saprotamu un efektīvu C++ kodu. [atsauksme]

  • C++ Templates: The Complete Guide (David Vandevoorde and Nicolai M. Josuttis) Šī ir pareizākā grāmata par šabloniem, kādi tie pastāvēja pirms C++11. Tajā aplūkots viss, sākot no pašiem pamatiem līdz pat vismodernākajai šablonu metaprogrammēšanai, un izskaidrota katra sīkākā detaļa par to, kā darbojas šabloni (gan konceptuāli, gan to implementācijas gaitā), kā arī aplūkotas daudzas biežāk sastopamās kļūmes. Pielikumos ir lieliski kopsavilkumi par vienas definīcijas noteikumu (ODR) un pārslodzes izšķiršanu. Jau ir publicēts otrais izdevums, kas aptver C++11, C++14 un C++17. [Review]

  • C++ 17 - The Complete Guide (Nicolai M. Josuttis) Šajā grāmatā aprakstītas visas C++17 standartā ieviestās jaunās iespējas, aptverot visu, sākot no vienkāršā, piemēram, 'Inline Variables', 'constexpr if' līdz pat 'Polymorphic Memory Resources' un 'New and Delete with overaligned Data'.

    Advanced

  • Modern C++ Design (Andrei Alexandrescu) Pārrāvuma grāmata par progresīvām vispārīgām programmēšanas metodēm. Iepazīstina ar uz politiku balstītu projektēšanu, tipu sarakstiem un vispārīgās programmēšanas pamatidiomām, pēc tam izskaidro, kā, izmantojot vispārīgo programmēšanu, var efektīvi, modulāri un tīri īstenot daudzus noderīgus projektēšanas paraugus (tostarp mazu objektu alokatorus, funktorus, rūpnīcas, apmeklētājus un multimetodes). [Pārskats]

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

  • C++ Concurrency In Action (Anthony Williams) Grāmata, kurā aplūkots C++11 vienlaicības atbalsts, ieskaitot pavedienu bibliotēku, atomikas bibliotēku, C++ atmiņas modeli, atslēgas un mutexus, kā arī daudzpavedienu lietojumprogrammu projektēšanas un atkļūdošanas jautājumi. Jau ir publicēts otrais izdevums, kas aptver C++14 un C++17.

  • Advanced C++ Metaprogramming (Davide Di Gennaro) TMP metaprogrammēšanas rokasgrāmata pirms C++11, kas vairāk pievēršas praksei nekā teorijai. Šajā grāmatā ir tonna fragmentu, no kuriem daži ir novecojuši, pateicoties tipu īpašībām, bet tehnikas tomēr ir noderīgi zināt. Ja jūs varat samierināties ar dīvaino formatējumu/rediģēšanu, to ir vieglāk lasīt nekā Alexandrescu, un, iespējams, tā ir daudz noderīgāka. Pieredzējušākiem izstrādātājiem ir liela iespēja, ka jūs uzzināsiet kaut ko par kādu C++ tumšo stūrīti (quirk), kas parasti rodas tikai ar lielu pieredzi.

    Atsauces stils - visiem līmeņiem

  • The C++ Programming Language (Bjarne Stroustrup) (updated for C++11) Klasisks C++ ievads, ko sarakstījis tās radītājs. Uzrakstīts paralēli klasiskajam K&R, šis patiešām ir ļoti līdzīgs un aptver gandrīz visu, sākot ar valodas kodolu, standarta bibliotēku, programmēšanas paradigmām un beidzot ar valodas filozofiju. [Pārskats] Piezīme: Šajā jautājumā ir aplūkoti visi C++ standarta izdevumi: Kur es varu atrast pašreizējo C++ standartu.

  • C++ Standard Library Tutorial and Reference (Nicolai Josuttis) (atjaunināts C++11) _C++ standarta bibliotēkas ievads un atsauce. Otrais izdevums (iznācis 2012. gada 9. aprīlī) aptver C++11. [Review]

  • The C++ IO Streams and Locales (Angelika Langere un Klauss Krefts) Par šo grāmatu nav daudz ko teikt, izņemot to, ka, ja vēlaties kaut ko uzzināt par plūsmām un lokāliem, tad šī ir vienīgā vieta, kur atrast galīgās atbildes. [atsauksme] C++11/14/17/... Atsauces:

  • C++11/14/17 standarts (INCITS/ISO/IEC 14882:2011/2014/2017) Tas, protams, ir galīgais arbitrs par visu, kas ir vai nav C++. Tomēr ņemiet vērā, ka tas ir domāts tikai kā atsauce pieredzējušiem lietotājiem, kas ir gatavi veltīt ievērojamu laiku un pūles tā izpratnei. C++17 standarts ir izdots elektroniskā formātā par 198 Šveices frankiem.

  • C++17 standarts ir pieejams, bet šķiet, ka ne ekonomiski izdevīgā formā - tieši no ISO tas maksā 198 Šveices frankus (aptuveni 200 ASV dolāru). Lielākajai daļai cilvēku galīgais projekts pirms standartizācijas ir vairāk nekā piemērots (un bezmaksas). Daudzi dos priekšroku vēl jaunākam projektam, kurā dokumentētas jaunas funkcijas, kas, iespējams, tiks iekļautas C++20.

  • Apskats par jauno C++ (C++11/14) (tikai PDF) (Scott Meyers) (atjaunināts C++14) Šie ir trīs dienu mācību kursa prezentācijas materiāli (slaidi un dažas lekciju piezīmes), ko piedāvāja Scott Meyers, kurš ir ļoti atzīts C++ autors. Lai gan priekšmetu saraksts ir īss, to kvalitāte ir augsta.

  • C++ kodola vadlīnijas (C++11/14/17/...) (rediģējuši Bjarne Stroustrup un Herb Sutter) ir attīstāms tiešsaistes dokuments, kas sastāv no vadlīniju kopuma, kā labi izmantot mūsdienu C++. Vadlīnijas ir vērstas uz relatīvi augstāka līmeņa jautājumiem, piemēram, saskarnēm, resursu pārvaldību, atmiņas pārvaldību un vienlaicīgumu, kas ietekmē lietojumprogrammu arhitektūru un bibliotēku dizainu. Projektu CppCon'15 laikā paziņoja Bjarne Stroustrup un citi, un tajā tiek gaidīti kopienas ieguldījumi. Lielākā daļa vadlīniju ir papildinātas ar pamatojumu un piemēriem, kā arī diskusijām par iespējamo rīku atbalstu. Daudzi noteikumi ir īpaši izstrādāti tā, lai tos varētu automātiski pārbaudīt ar statiskās analīzes rīkiem.

  • C++ Super-FAQ (Marshall Cline, Bjarne Stroustrup un citi) ir C++ Standarta fonda centieni apvienot C++ FAQ, ko iepriekš atsevišķi uzturēja Marshall Cline un Bjarne Stroustrup, kā arī iekļaut jaunus ieguldījumus. Šajos punktos galvenokārt tiek risināti vidēja līmeņa jautājumi, un tie bieži vien ir rakstīti ar humora pieskaņu. Iespējams, ka ne visi jautājumi ir pilnībā pielāgoti jaunākajam C++ standarta izdevumam.

  • cppreference.com (C++03/11/14/17/...) (iniciators Nate Kohl) ir wiki, kurā apkopotas valodas kodola pamatiezīmes un ir plaša C++ standarta bibliotēkas dokumentācija. Dokumentācija ir ļoti precīza, bet ir vieglāk lasāma nekā oficiālais standarta dokuments un nodrošina labāku navigāciju, pateicoties tās wiki raksturam. Projektā ir dokumentētas visas C++ standarta versijas, un vietnē ir iespējams filtrēt attēlošanu konkrētai versijai. Projektu [CppCon'14] prezentēja Nate Kohl](https://isocpp.org/blog/2015/07/cppcon-2014-cppreference.com-documenting-cpp-one-edit-at-a-time-nate-kohl).

    Klasika / Vecāki

    Piezīme: Dažas šajās grāmatās ietvertās ziņas var nebūt aktuālas vai vairs netikt uzskatītas par labāko praksi.

  • _The Design and Evolution of C++ (Bjarne Stroustrup) Ja vēlaties uzzināt, kāpēc valoda ir tāda, kāda tā ir, šajā grāmatā atradīsiet atbildes. Tajā ir aprakstīts viss, kas notika līdz C++ standartizācijai.

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

  • Advanced C++ Programming Styles and Idioms (James Coplien) Advanced C++ Programming Styles and Idioms (James Coplien). Tajā aprakstīti daudzi C++ specifiski "idioti". Tā noteikti ir ļoti laba grāmata, un, iespējams, joprojām būtu vērts to izlasīt, ja varat atvēlēt laiku, taču tā ir diezgan veca un nav atjaunināta ar pašreizējo C++.

  • Large Scale C++ Software Design (John Lakos) Lakos skaidro metodes, kā vadīt ļoti lielus C++ programmatūras projektus. Protams, laba lasāmviela, ja vien tā būtu aktuāla. Tā tika sarakstīta ilgi pirms C++ 98, un tajā nav iekļautas daudzas lielajiem projektiem svarīgas funkcijas (piemēram, vārdu telpas). Ja jums ir jāstrādā pie liela C++ programmatūras projekta, jūs varētu to izlasīt, lai gan ar to ir jārēķinās vairāk nekā ar sāls graudu. Jaunā izdevuma pirmais sējums ir gaidāms 2019. gadā.

  • Inside the C++ Object Model (Stanley Lippman) Ja vēlaties uzzināt, kā parasti tiek īstenotas virtuālās locekļu funkcijas un kā bāzes objekti parasti tiek izvietoti atmiņā, izmantojot vairāku funkciju pārmantojamību, un kā tas viss ietekmē veiktspēju, šeit atradīsiet izsmeļošu diskusiju par šiem jautājumiem.

  • The Annotated C++ Reference Manual (Bjarne Stroustrup, Margaret A. Ellis) Šī grāmata ir diezgan novecojusi, jo tajā aplūkota 1989. gada C++ 2.0 versija - tajā vēl nebija ieviesti šabloni, izņēmumi, vārdu telpas un jaunie casts. Tomēr, to sakot, šajā grāmatā ir aplūkots viss tā laika C++ standarts, skaidrojot tā pamatojumu, iespējamās implementācijas un valodas īpašības. Šī nav grāmata, lai apgūtu programmēšanas principus un modeļus par C++, bet gan lai izprastu katru C++ valodas aspektu.

  • Thinking in C++ (Bruce Eckel, 2. izdevums, 2000). Divi sējumi; ir mācību stila brīvs ievadlīmeņa grāmatu komplekts. Lejupielādes: 1. sējums, 2. sējums. Diemžēl tajās ir vairākas triviālas kļūdas (piemēram, apgalvojums, ka temporāri automātiski ir const), un nav oficiāla errata saraksta. Daļējs 3rd puses kļūdu saraksts ir pieejams (http://www.computersciencelab.com/Eckel.htm), bet tas acīmredzot netiek uzturēts.

  • Scientific and Engineering C++: An Introduction to Advanced Techniques and Examples (John Barton and Lee Nackman) (John Barton and Lee Nackman). Tā ir visaptveroša un ļoti detalizēta grāmata, kurā mēģināts izskaidrot un izmantot visas C++ pieejamās iespējas skaitlisko metožu kontekstā. Tajā tika ieviestas vairākas jaunas metodes, piemēram, Curiously Recurring Template Pattern (CRTP, saukta arī par Bartona un Nackmana triku). Tā bija pionieris vairākās metodēs, piemēram, dimensiju analīzē un automātiskajā diferencēšanā. Tam bija pievienots daudz kompilējama un noderīga koda, sākot ar izteicienu analizatoru un beidzot ar Lapack wrapper. Kods joprojām ir pieejams šeit: http://www.informit.com/store/scientific-and-engineering-c-plus-plus-an-introduction-9780201533934. Diemžēl grāmatas ir nedaudz novecojušas pēc stila un C++ funkcijām, tomēr tajā laikā (1994. gadā, pirms STL) tā bija neticama tūre. Nodaļas par dinamikas pārmantojamību ir mazliet sarežģītas, lai tās saprastu, un nav pārāk noderīgas. Būtu ļoti labi, ja tiktu izdota šīs klasiskās grāmatas atjaunināta versija, kurā būtu iekļauta kustību semantika un STL gūtās atziņas.

Komentāri (22)