Den endelige C++-bogguide og -liste

Dette spørgsmål forsøger at samle de få perler blandt de snesevis af dårlige C++-bøger, der udgives hvert år.

I modsætning til mange andre programmeringssprog, som man ofte lærer på farten fra tutorials på internettet, er der kun få, der hurtigt kan lære C++ uden at studere en velskrevet C++-bog. Det er alt for stort og komplekst til at gøre dette. Faktisk er det så stort og komplekst, at der findes rigtig mange meget dårlige C++-bøger derude. Og her taler vi ikke om dårlig stil, men om ting som at de indeholder overvældende åbenlyse faktuelle fejl og promoverer afskyeligt dårlige programmeringsstile.

Rediger venligst det accepterede svar for at angive kvalitetsbøger og et omtrentligt færdighedsniveau - _helst efter _at have diskuteret din tilføjelse i C++-chatrummet. (De faste brugere kan nådesløst fortryde dit arbejde, hvis de er uenige i en anbefaling). Tilføj en kort beskrivelse af hver enkelt bog, som du personligt har læst/har haft gavn af. Diskuter gerne kvalitet, overskrifter osv. Bøger, der opfylder kriterierne, vil blive tilføjet til listen. Bøger, der har anmeldelser fra Association of C and C++ Users (ACCU), har links til anmeldelsen.

*Note: FAQs og andre ressourcer kan findes i C++ tag info og under [tag:c++-faq].

Begynder

Indledende, ingen tidligere programmeringserfaring

  • [C++ Primer]] (http://www.amazon.com/Primer-5th-Stanley-B-Lippman/dp/0321714113) * (Stanley Lippman, Josée Lajoie og Barbara E. Moo) (opdateret til C++11) Med sine 1.000 sider er dette en meget grundig introduktion til C++, der dækker stort set alt i sproget i et meget tilgængeligt format og i stor detalje. Den femte udgave (udgivet den 16. august 2012) dækker C++11. [Anmeldelse]
  • [Programming: Principles and Practice Using C++]](http://www.amazon.com/dp/0321992784/) (Bjarne Stroustrup, 2. udgave - 25. maj 2014) (opdateret til C++11/C++14) En introduktion til programmering ved hjælp af C++ af sprogets skaberen. En god læsning, der ikke forudsætter nogen tidligere programmeringserfaring, men som ikke kun er for begyndere.

Indledende, med tidligere programmeringserfaring

  • A Tour of C++ (Bjarne Stroustrup) (2. udgave til C++17) "Touren" er en hurtig (ca. 180 sider og 14 kapitler) tutorial-oversigt over hele standard-C++ (sprog og standardbibliotek, og brug af C++11) på et moderat højt niveau for folk, der allerede kender C++ eller i det mindste er erfarne programmører. Denne bog er en udvidet udgave af det materiale, der udgør kapitel 2-5 i The C++ Programming Language, 4. udgave.

  • [Accelerated C++] (http://www.amazon.com/dp/020170353X/) (Andrew Koenig og Barbara Moo, 1. udgave - 24. august 2000) Denne bog dækker stort set det samme som C++ Primer, men gør det på en fjerdedel af dens plads. Dette skyldes i høj grad, at den ikke forsøger at være en introduktion til programmering, men en introduktion til C++ for folk, der tidligere har programmeret i et andet sprog. Den har en stejlere indlæringskurve, men for dem, der kan klare dette, er den en meget kompakt introduktion til sproget. (Historisk set var den banebrydende ved at være den første bog til begyndere, der anvendte en moderne tilgang til undervisning i sproget). På trods af dette er C++ den underviser i, er rent C++98. [Anmeldelse]

    Bedste praksis

  • [Effective C++]](http://www.amazon.com/dp/0321334876/) (Scott Meyers, 3rd Edition - May 22, 2005) Denne blev skrevet med det formål at være den bedste anden bog C++-programmører bør læse, og det er lykkedes. Tidligere udgaver var rettet mod programmører, der kommer fra C, den tredje udgave ændrer dette og er rettet mod programmører, der kommer fra sprog som Java. Den præsenterer ~50 tommelfingerregler, der er nemme at huske, sammen med deres begrundelse i en meget tilgængelig (og underholdende) stil. For C++11 og C++14 er eksemplerne og nogle få spørgsmål forældede, og Effective Modern C++ bør foretrækkes. [Anmeldelse]

  • [Effective Modern C++]]1 (Scott Meyers) Dette er i princippet den nye version af Effective C++, der er rettet mod C++-programmører, der er ved at gå fra C++03 til C++11 og C++14.

  • [Effective STL] (http://www.amazon.com/dp/0201749629/) (Scott Meyers) Dette har til formål at gøre det samme ved den del af standardbiblioteket, der kommer fra STL, som Effective C++ gjorde ved sproget som helhed: Den præsenterer tommelfingerregler sammen med deres begrundelse. [Review]

    Intermediate

  • More Effective C++ (Scott Meyers) Endnu flere tommelfingerregler end Effective C++. Ikke så vigtige som dem i den første bog, men stadig gode at vide.

  • Exceptional C++ (Herb Sutter) Præsenteret som et sæt puslespil, har denne en af de bedste og grundigste diskussioner af korrekt ressourcestyring og undtagelsessikkerhed i C++ gennem Resource Acquisition is Initialization (RAII) foruden en dybdegående dækning af en række andre emner, herunder pimpl-idiomet, name lookup, godt klassedesign og C++-hukommelsesmodellen. [Review]

  • More Exceptional C++ (Herb Sutter) Dækker yderligere emner om undtagelsessikkerhed, som ikke er dækket i Exceptional C++, ud over diskussionen om effektiv objektorienteret programmering i C++ og korrekt brug af STL. [Review]

  • [Exceptional C++ Style]] (http://www.amazon.com/dp/0201760428/) (Herb Sutter) (http://www.amazon.com/dp/0201760428/) (Herb Sutter) Diskuterer generisk programmering, optimering og ressourcestyring; denne bog indeholder også en fremragende redegørelse for, hvordan man skriver modulopbygget kode i C++ ved hjælp af non-member-funktioner og princippet om enkeltansvar. [Anmeldelse]

  • [C++ Coding Standards]](http://www.amazon.com/dp/0321113586/) (Herb Sutter og Andrei Alexandrescu) "Coding standards" betyder her ikke "hvor mange mellemrum skal jeg indrykke min kode?" Denne bog indeholder 101 bedste praksis, idiomer og almindelige faldgruber, som kan hjælpe dig med at skrive korrekt, forståelig og effektiv C++-kode. [Anmeldelse]

  • [C++ Templates: The Complete Guide]](http://www.amazon.com/dp/0201734842/) (David Vandevoorde and Nicolai M. Josuttis) Dette er den bog om skabeloner, som de eksisterede før C++11. Den dækker alt fra det helt grundlæggende til nogle af de mest avancerede skabelonmetaprogrammeringer og forklarer hver eneste detalje af, hvordan skabeloner fungerer (både konceptuelt og på hvordan de implementeres) og diskuterer mange almindelige faldgruber. Har fremragende resuméer af One Definition Rule (ODR) og overload-opløsning i appendikserne. Der er allerede udgivet en [anden udgave] (http://amzn.com/0321714121), som dækker C++11, C++14 og C++17. [Anmeldelse]

  • C++ 17 - The Complete Guide (Nicolai M. Josuttis) Denne bog beskriver alle de nye funktioner, der er indført i C++17-standarden, og dækker alt fra de simple funktioner som 'Inline Variables', 'constexpr if' helt op til 'Polymorphic Memory Resources' og 'New and Delete with overaligned Data'.

    Avanceret

  • [Modern C++ Design]] (http://www.amazon.com/dp/0201704315/) (Andrei Alexandrescu) En banebrydende bog om avancerede generiske programmeringsteknikker. Introducerer policy-baseret design, typelister og grundlæggende generiske programmeringsidioter og forklarer derefter, hvordan mange nyttige designmønstre (herunder små objektallokatorer, funktorer, factories, visitors og multimetoder) kan implementeres effektivt, modulært og rent ved hjælp af generisk programmering. [Anmeldelse]

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

  • [C++ Concurrency In Action]](http://www.amazon.com/dp/1933988770) (Anthony Williams) En bog, der dækker C++11 samtidighedsunderstøttelse, herunder trådbiblioteket, atomics-biblioteket, C++-hukommelsesmodellen, låse og mutexes samt spørgsmål om design og fejlfinding af flertrådede applikationer. En anden udgave, der dækker C++14 og C++17, er allerede blevet offentliggjort.

  • [Advanced C++ Metaprogramming] (http://www.amazon.com/dp/1460966163) (Davide Di Gennaro) En håndbog om TMP-teknikker fra før C++11, der fokuserer mere på praksis end på teori. Der er et væld af snippets i denne bog, hvoraf nogle er blevet forældet af type traits, men teknikkerne er ikke desto mindre nyttige at kende. Hvis man kan finde sig i den finurlige formatering/redigering, er den lettere at læse end Alexandrescu, og den er nok mere givende. For mere erfarne udviklere er der en god chance for, at du kan opsamle noget om et mørkt hjørne af C++ (en quirk), som normalt kun kommer frem gennem omfattende erfaring.

    Reference Style - Alle niveauer

  • [The C++ Programming Language]](http://www.amazon.com/dp/0321958322/) (Bjarne Stroustrup) (opdateret til C++11) Den klassiske introduktion til C++ af dens skaber. Skrevet som en parallel til den klassiske K&R, og denne læser sig faktisk meget som den og dækker stort set alt fra kernesproget til standardbiblioteket, programmeringsparadigmer og sprogets filosofi. [Anmeldelse] Bemærk: Alle udgivelser af C++-standarden følges i dette spørgsmål: Hvor kan jeg finde den aktuelle C++-standard.

  • C++ Standard Library Tutorial and Reference (Nicolai Josuttis) (opdateret til C++11) En introduktion og reference til C++ Standard Library. Den anden udgave (udgivet den 9. april 2012) dækker C++11. [Anmeldelse]

  • [The C++ IO Streams and Locales]](http://www.amazon.com/dp/0201183951) (Angelika Langer and Klaus Kreft) Der er meget lidt at sige om denne bog, bortset fra at hvis du vil vide noget om streams og locales, så er dette det eneste sted, hvor du kan finde de endelige svar. [Anmeldelse] C++11/14/17/11/17/... Referencer:

  • The C++11/14/17 Standard (INCITS/ISO/IEC 14882:2011/2014/2017) Dette er naturligvis den endelige dommer over alt, hvad der er eller ikke er C++. Vær dog opmærksom på, at den udelukkende er tænkt som en reference for erfarne brugere, der er villige til at afsætte betydelig tid og kræfter til at forstå den. C++17-standarden er udgivet i elektronisk form for 198 schweizerfrancs.

  • C++17-standarden er tilgængelig, men tilsyneladende ikke i en billig form - direkte fra ISO koster den 198 schweizerfranc (ca. 200 US-dollar). For de fleste mennesker er det endelige udkast før standardisering mere end tilstrækkeligt (og gratis). Mange vil foretrække et endnu nyere udkast, der dokumenterer nye funktioner, som sandsynligvis vil blive medtaget i C++20.

  • Overview of the New C++ (C++11/14) (PDF only) (Scott Meyers) (opdateret til C++14) Dette er præsentationsmaterialet (dias og nogle forelæsningsnoter) fra et tredages kursus, der blev tilbudt af Scott Meyers, som er en højt respekteret forfatter om C++. Selv om listen af emner er kort, er kvaliteten høj.

  • De [C++ Core Guidelines (C++11/14/17/...)] (https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md) (redigeret af Bjarne Stroustrup og Herb Sutter) er et online-dokument under udvikling, der består af et sæt retningslinjer for god brug af moderne C++. Retningslinjerne er fokuseret på forholdsvis overordnede emner som f.eks. grænseflader, ressourcestyring, hukommelsesstyring og samtidighed, der påvirker applikationsarkitekturen og biblioteksdesignet. Projektet blev [annonceret på CppCon'15 af Bjarne Stroustrup m.fl.] (https://isocpp.org/blog/2015/09/bjarne-stroustrup-announces-cpp-core-guidelines) og modtager gerne bidrag fra fællesskabet. De fleste retningslinjer er suppleret med en begrundelse og eksempler samt diskussioner om mulig værktøjsunderstøttelse. Mange regler er specielt udformet til automatisk at kunne kontrolleres af statiske analyseværktøjer.

  • C++ Super-FAQ (Marshall Cline, Bjarne Stroustrup m.fl.) er et forsøg fra Standard C++ Foundation på at forene de C++ FAQ'er, der tidligere blev vedligeholdt individuelt af Marshall Cline og Bjarne Stroustrup, og som også inddrager nye bidrag. Artiklerne omhandler for det meste spørgsmål på et mellemniveau og er ofte skrevet med en humoristisk tone. Det er ikke sikkert, at alle punkterne er helt opdaterede i forhold til den seneste udgave af C++-standarden endnu.

  • [cppreference.com (C++03/11/14/17/...)] (http://en.cppreference.com/) (initieret af Nate Kohl) er en wiki, der opsummerer de grundlæggende kernefunktioner i sproget og har en omfattende dokumentation af C++-standardbiblioteket. Dokumentationen er meget præcis, men er lettere at læse end det officielle standarddokument og giver bedre navigation på grund af wiki-naturen. Projektet dokumenterer alle versioner af C++-standarden, og på webstedet er det muligt at filtrere visningen for en bestemt version. Projektet blev [præsenteret af Nate Kohl på CppCon'14] (https://isocpp.org/blog/2015/07/cppcon-2014-cppreference.com-documenting-cpp-one-edit-at-a-time-nate-kohl).

    Klassikere / Ældre

    Bemærkning: Nogle oplysninger i disse bøger er muligvis ikke længere aktuelle eller betragtes ikke længere som bedste praksis.

  • [The Design and Evolution of C++]](http://www.amazon.com/dp/0201543303/) (Bjarne Stroustrup) Hvis du vil vide hvorfor sproget er, som det er, så er det i denne bog, du finder svarene. Den dækker alt før standardiseringen af C++.

  • Ruminations on C++ - (Andrew Koenig og Barbara Moo) [Anmeldelse]

  • [Advanced C++ Programming Styles and Idioms]](http://www.amazon.com/dp/0201548550/) (James Coplien) En forløber for mønsterbevægelsen, den beskriver mange C++-specifikke "idiomer". Det er bestemt en rigtig god bog og kan stadig være værd at læse, hvis man har tid til det, men den er ret gammel og ikke opdateret med den nuværende C++.

  • [Large Scale C++ Software Design]](http://www.amazon.com/dp/0201633620) (John Lakos) (John Lakos) Lakos forklarer teknikker til at styre meget store C++-softwareprojekter. Helt sikkert en god læsning, hvis den bare var opdateret. Den blev skrevet længe før C++ 98 og mangler mange funktioner (f.eks. namespaces), der er vigtige for store projekter. Hvis du skal arbejde i et stort C++-softwareprojekt, kan du måske læse den, selv om du skal tage mere end et gran salt med den. Det første bind af en ny udgave er [forventes i 2019] (http://www.amazon.com/dp/0201717069).

  • [Inside the C++ Object Model]] (http://www.amazon.com/dp/0201834545) (Stanley Lippman) Hvis du vil vide, hvordan virtuelle medlemsfunktioner almindeligvis implementeres, og hvordan basisobjekter almindeligvis er placeret i hukommelsen i et multiarvelsesscenarie, og hvordan alt dette påvirker ydeevnen, er det her, du kan finde grundige diskussioner af sådanne emner.

  • [The Annotated C++ Reference Manual]](https://www.amazon.com/Annotated-C-Reference-Manual/dp/0201514591) (Bjarne Stroustrup, Margaret A. Ellis) Denne bog er ret forældet, idet den undersøger C++ 2.0-versionen fra 1989 - skabeloner, undtagelser, namespaces og nye casts var endnu ikke indført. Når det er sagt, gennemgår bogen dog hele C++-standarden fra dengang og forklarer sprogets begrundelse, mulige implementeringer og funktioner. Dette er ikke en bog for at lære programmeringsprincipper og mønstre på C++, men for at forstå alle aspekter af C++-sproget.

  • [Thinking in C++] (http://www.amazon.com/dp/0139798099/) (Bruce Eckel, 2. udgave, 2000). To bind; er en tutorial-stil gratis sæt af bøger på intro-niveau. Downloads: vol 1, vol 2. Desværre er de behæftet med en række trivielle fejl (f.eks. at de fastholder, at temporaries automatisk er const), og der findes ingen officiel errata-liste. En delvis 3rd party errata-liste er tilgængelig på (http://www.computersciencelab.com/Eckel.htm), men den’bliver tilsyneladende ikke vedligeholdt.

  • [Scientific and Engineering C++: An Introduction to Advanced Techniques and Examples]] (https://www.amazon.com/Scientific-Engineering-Introduction-Advanced-Techniques/dp/0201533936) (John Barton og Lee Nackman) Det er en omfattende og meget detaljeret bog, der har forsøgt at forklare og udnytte alle de funktioner, der er tilgængelige i C++, i forbindelse med numeriske metoder. Den introducerede på det tidspunkt flere nye teknikker, såsom Curiously Recurring Template Pattern (CRTP, også kaldet Barton-Nackman-trick). Det var banebrydende for flere teknikker som f.eks. dimensionsanalyse og automatisk differentiering. Den blev leveret med en masse kompilerbar og nyttig kode, lige fra en udtryksanalysator til en Lapack-wrapper. Koden er stadig tilgængelig her: http://www.informit.com/store/scientific-and-engineering-c-plus-plus-an-introduction-9780201533934. Desværre er bøgerne blevet noget forældede i stil og C++-funktioner, men det var en utrolig tour-de-force på det tidspunkt (1994, før STL). Kapitlerne om dynamikarv er lidt komplicerede at forstå og ikke særlig nyttige. En opdateret version af denne klassiske bog, der omfatter move-semantik og erfaringerne fra STL ville være meget rart.

Kommentarer (22)