Le guide et la liste définitifs des livres sur le C++

Cette question tente de rassembler les quelques perles parmi les dizaines de mauvais livres sur le C++ qui sont publiés chaque année.

Contrairement à de nombreux autres langages de programmation, que l'on apprend souvent sur le tas à partir de tutoriels trouvés sur Internet, rares sont ceux qui sont capables de se familiariser rapidement avec le C++ sans étudier un livre C++ bien écrit. Le langage est bien trop grand et complexe pour cela. En fait, il est si grand et si complexe qu'il existe de très nombreux livres C++ de très mauvaise qualité. Et nous ne parlons pas de mauvais style, mais de choses comme des erreurs factuelles flagrantes et la promotion de styles de programmation abyssalement mauvais.

Veuillez modifier la réponse acceptée afin de fournir des livres de qualité et un niveau de compétence approximatif - de préférence après discuter de votre ajout dans [le salon de discussion C++] (http://chat.stackoverflow.com/rooms/10/loungec). (Les habitués pourraient défaire impitoyablement votre travail s'ils ne sont pas d'accord avec une recommandation). Ajoutez une courte description de chaque livre que vous avez personnellement lu ou dont vous avez bénéficié. N'hésitez pas à débattre de la qualité, des titres, etc. Les livres qui répondent aux critères seront ajoutés à la liste. Les livres qui ont fait l'objet d'une critique par l'Association of C and C++ Users (ACCU) ont un lien vers la critique.

Remarque : les FAQ et autres ressources se trouvent dans la section [C++ tag info] (https://stackoverflow.com/tags/c%2b%2b/info) et sous [tag:c++-faq].

Débutant

Introduction, sans expérience préalable de la programmation

  • [C++ Primer * (Stanley Lippman, Josée Lajoie et Barbara E. Moo) (mise à jour pour C++11) Avec ses 1 000 pages, il s'agit d'une introduction très complète à C++ qui couvre à peu près tout le langage dans un format très accessible et de manière très détaillée. La cinquième édition (sortie le 16 août 2012) couvre C++11. [Critique]
  • Programming : Principles and Practice Using C++ (Bjarne Stroustrup, 2e édition - 25 mai 2014) (mise à jour pour C++11/C++14) Une introduction à la programmation en C++ par le créateur du langage. Une bonne lecture, qui ne suppose aucune expérience préalable de la programmation, mais qui ne s'adresse pas uniquement aux débutants.

Introduction, avec une expérience préalable de la programmation.

  • A Tour of C++](https://www.amazon.com/Tour-C-Depth-ebook/dp/B00F8CWGOS) (Bjarne Stroustrup) (2ème édition pour C++17) Le "tour" est un tutoriel rapide (environ 180 pages et 14 chapitres) qui donne un aperçu de tout le C++ standard (langage et bibliothèque standard, et utilisation de C++11) à un niveau moyennement élevé pour les personnes qui connaissent déjà le C++ ou qui sont au moins des programmeurs expérimentés. Ce livre est une version étendue du matériel qui constitue les chapitres 2-5 de The C++ Programming Language, 4e édition.

  • Accelerated C++ (Andrew Koenig et Barbara Moo, 1ère édition - 24 août 2000) Ce livre couvre essentiellement le même terrain que le C++ Primer, mais sur un quart de son espace. Cela est dû en grande partie au fait qu'il ne cherche pas à être une introduction à la programmation, mais une introduction au C++ pour les personnes qui ont déjà programmé dans un autre langage. Il a une courbe d'apprentissage plus raide, mais, pour ceux qui peuvent y faire face, c'est une introduction très compacte au langage. (Historiquement, il a innové en étant le premier livre pour débutants à utiliser une approche moderne de l'enseignement du langage). Malgré cela, le C++ qu'il enseigne est purement C++98. Revue de presse

    Meilleures pratiques

  • [Effective C++ (Scott Meyers, 3e édition - 22 mai 2005) Ce livre a été écrit dans le but d'être le meilleur deuxième livre que les programmeurs C++ devraient lire, et il a réussi. Les éditions précédentes étaient destinées aux programmeurs venant du C, la troisième édition change cela et vise les programmeurs venant de langages comme Java. Elle présente environ 50 règles empiriques faciles à retenir, accompagnées de leur justification, dans un style très accessible (et agréable). Pour C++11 et C++14, les exemples et quelques questions sont dépassés et il faut préférer Effective Modern C++. Revue

  • [Effective Modern C++][1] (Scott Meyers) Il s'agit essentiellement de la nouvelle version de Effective C++, destinée aux programmeurs C++ faisant la transition de C++03 à C++11 et C++14.

  • Effective STL](http://www.amazon.com/dp/0201749629/) (Scott Meyers) Ce document a pour but de faire à la partie de la bibliothèque standard issue de la STL ce que Effective C++ a fait au langage dans son ensemble : Il présente des règles empiriques accompagnées de leur justification. Revue de presse

    Intermédiaire

  • More Effective C++](http://www.amazon.com/dp/020163371X/) (Scott Meyers) Encore plus de règles empiriques que Effective C++. Pas aussi importantes que celles du premier livre, mais toujours bonnes à connaître.

  • Exceptional C++](http://www.amazon.com/dp/0201615622/) (Herb Sutter) Présenté comme un ensemble de puzzles, ce livre contient l'une des meilleures discussions approfondies sur la gestion correcte des ressources et la sécurité des exceptions en C++ par le biais de Resource Acquisition is Initialization (RAII), ainsi qu'une couverture approfondie d'une variété d'autres sujets, notamment l'idiome pimpl, la recherche de noms, la bonne conception des classes et le modèle de mémoire C++. [Revue]

  • More Exceptional C++](http://www.amazon.com/dp/020170434X/) (Herb Sutter) Couvre des sujets supplémentaires sur la sécurité des exceptions qui ne sont pas abordés dans Exceptional C++, en plus d'une discussion sur la programmation orientée objet efficace en C++ et l'utilisation correcte de la STL. [Revue]](http://accu.org/index.php?module=bookreviews&func=search&rid=784)

  • Exceptional C++ Style (Herb Sutter) Discute de la programmation générique, de l'optimisation et de la gestion des ressources ; ce livre contient également une excellente exposition de la manière d'écrire du code modulaire en C++ en utilisant des fonctions non membres et le principe de responsabilité unique. Revue de presse

  • C++ Coding Standards (Herb Sutter et Andrei Alexandrescu) "Normes de codage" ne signifie pas ici "combien d'espaces dois-je indenter mon code ?". Ce livre contient 101 bonnes pratiques, idiomes et pièges courants qui peuvent vous aider à écrire un code C++ correct, compréhensible et efficace. Revue

  • C++ Templates : The Complete Guide (David Vandevoorde et Nicolai M. Josuttis) C'est le livre sur les templates tels qu'ils existaient avant C++11. Il couvre tout, depuis les bases jusqu'à la métaprogrammation la plus avancée des templates, explique chaque détail du fonctionnement des templates (tant sur le plan conceptuel que sur celui de leur mise en œuvre) et aborde de nombreux pièges courants. Les annexes contiennent d'excellents résumés de la règle de définition unique (ODR) et de la résolution des surcharges. Une [deuxième édition] (http://amzn.com/0321714121) couvrant C++11, C++14 et C++17 a déjà été publiée. Revue

  • C++ 17 - The Complete Guide (Nicolai M. Josuttis) Ce livre décrit toutes les nouvelles fonctionnalités introduites dans la norme C++17, depuis les plus simples comme les "variables en ligne", "constexpr if" jusqu'aux "ressources mémoire polymorphes" et "New and Delete with overaligned Data".

    Avancé

  • Modern C++ Design (Andrei Alexandrescu) Un livre révolutionnaire sur les techniques de programmation générique avancées. Il présente la conception basée sur les politiques, les listes de types et les idiomes fondamentaux de la programmation générique, puis explique comment de nombreux modèles de conception utiles (y compris les petits allocateurs d'objets, les foncteurs, les usines, les visiteurs et les méthodes multiples) peuvent être mis en œuvre de manière efficace, modulaire et propre en utilisant la programmation générique. [Revue]

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

  • C++ Concurrency In Action (Anthony Williams) Un livre couvrant la prise en charge de la concurrence dans C++11, notamment la bibliothèque thread, la bibliothèque atomique, le modèle de mémoire C++, les verrous et les mutex, ainsi que les problèmes de conception et de débogage des applications multithread. Une deuxième édition couvrant C++14 et C++17 a déjà été publiée.

  • Advanced C++ Metaprogramming (Davide Di Gennaro) Un manuel de techniques TMP antérieur à C++11, axé davantage sur la pratique que sur la théorie. Il y a une tonne de snippets dans ce livre, dont certains sont rendus obsolètes par les traits de type, mais les techniques sont néanmoins utiles à connaître. Si vous pouvez supporter le formatage/édition bizarre, il est plus facile à lire qu'Alexandrescu, et sans doute plus enrichissant. Pour les développeurs plus expérimentés, il y a de bonnes chances que vous puissiez apprendre quelque chose sur un coin sombre du C++ (une bizarrerie) qui n'est généralement découvert qu'au cours d'une longue expérience.

    Style de référence - Tous les niveaux

  • Le langage de programmation C++ (http://www.amazon.com/dp/0321958322/) (Bjarne Stroustrup) (mise à jour pour C++11) L'introduction classique au C++ par son créateur. Ecrit en parallèle du classique K&R, il s'en rapproche beaucoup et couvre à peu près tout, du langage de base à la bibliothèque standard, des paradigmes de programmation à la philosophie du langage. [Review] Note : Toutes les versions du standard C++ sont suivies dans cette question : [Où puis-je trouver la norme C++ actuelle] (https://stackoverflow.com/a/4653479/14065).

  • Tutoriel et référence sur la bibliothèque standard C++ (Nicolai Josuttis) (mise à jour pour C++11) _L'introduction et la référence pour la bibliothèque standard C++. La deuxième édition (sortie le 9 avril 2012) couvre C++11. [Critique]

  • The C++ IO Streams and Locales (Angelika Langer and Klaus Kreft) Il y a très peu à dire sur ce livre, si ce n'est que, si vous voulez savoir quoi que ce soit sur les flux et les locales, c'est le seul endroit où trouver des réponses définitives. [Critique] C++11/14/17/... Références :

  • Le standard C++ 11/14/17 (INCITS/ISO/IEC 14882:2011/2014/2017) C'est, bien sûr, l'arbitre final de tout ce qui est ou n'est pas C++. Sachez toutefois qu'elle est conçue comme une référence pour les utilisateurs expérimentés prêts à consacrer beaucoup de temps et d'efforts à sa compréhension. Le standard C++17 est disponible sous forme électronique pour 198 francs suisses.

  • La norme C++17 est disponible, mais apparemment pas sous une forme économique - [directement auprès de l'ISO] (https://www.iso.org/standard/68564.html) elle coûte 198 francs suisses (environ 200 dollars américains). Pour la plupart des gens, le [projet final avant normalisation] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4659.pdf) est plus que suffisant (et gratuit). Beaucoup préféreront un [projet encore plus récent] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/n4778.pdf), qui documente les nouvelles fonctionnalités qui seront probablement incluses dans C++20.

  • Overview of the New C++ (C++11/14) (PDF uniquement) (Scott Meyers) (mise à jour pour C++14) Il s'agit du matériel de présentation (diapositives et quelques notes de cours) d'un cours de formation de trois jours offert par Scott Meyers, qui est un auteur très respecté sur le C++. Même si la liste des éléments est courte, la qualité est élevée.

  • Les C++ Core Guidelines (C++11/14/17/...) (édité par Bjarne Stroustrup et Herb Sutter) est un document en ligne évolutif qui consiste en un ensemble de directives pour bien utiliser le C++ moderne. Les directives sont axées sur des questions de niveau relativement élevé, telles que les interfaces, la gestion des ressources, la gestion de la mémoire et la concurrence, qui affectent l'architecture des applications et la conception des bibliothèques. Le projet a été [annoncé à la CppCon'15 par Bjarne Stroustrup et d'autres] (https://isocpp.org/blog/2015/09/bjarne-stroustrup-announces-cpp-core-guidelines) et accueille les contributions de la communauté. La plupart des directives sont complétées par une justification et des exemples, ainsi que des discussions sur le support possible des outils. De nombreuses règles sont conçues spécifiquement pour être vérifiables automatiquement par des outils d'analyse statique.

  • La Super-FAQ C++ (Marshall Cline, Bjarne Stroustrup et d'autres) est un effort de la Fondation Standard C++ pour unifier les FAQ C++ précédemment maintenues individuellement par Marshall Cline et Bjarne Stroustrup et incorporant également de nouvelles contributions. Les articles traitent principalement de questions de niveau intermédiaire et sont souvent rédigés sur un ton humoristique. Tous les articles ne sont pas nécessairement à jour avec la dernière édition de la norme C++.

  • cppreference.com (C++03/11/14/17/...) (initié par Nate Kohl) est un wiki qui résume les caractéristiques de base du langage de base et possède une documentation étendue sur la bibliothèque standard C++. La documentation est très précise mais est plus facile à lire que le document standard officiel et offre une meilleure navigation grâce à sa nature de wiki. Le projet documente toutes les versions de la norme C++ et le site permet de filtrer l'affichage pour une version spécifique. Le projet a été présenté par Nate Kohl à la CppCon'14.

    Classiques / Anciens

    Note: Certaines informations contenues dans ces ouvrages peuvent ne pas être à jour ou ne plus être considérées comme des bonnes pratiques.

  • The Design and Evolution of C++](http://www.amazon.com/dp/0201543303/) (Bjarne Stroustrup) Si vous voulez savoir pourquoi le langage est tel qu'il est, c'est dans ce livre que vous trouverez les réponses. Il couvre tout ce qui se passe avant la normalisation du C++.

  • Ruminations sur le C++ - (Andrew Koenig et Barbara Moo) [Critique]

  • Advanced C++ Programming Styles and Idioms (James Coplien) Précurseur du mouvement des patrons, il décrit de nombreux "idiomes" spécifiques au C++. C'est certainement un très bon livre qui vaut la peine d'être lu si vous avez le temps, mais il est assez vieux et n'est pas à jour avec le C++ actuel.

  • Large Scale C++ Software Design (John Lakos) Lakos explique les techniques de gestion de très gros projets logiciels C++. C'est certainement un bon livre, si seulement il était à jour. Il a été écrit bien avant C++ 98 et manque de nombreuses fonctionnalités (par exemple, les espaces de noms) importantes pour les projets à grande échelle. Si vous devez travailler dans le cadre d'un grand projet de logiciel C++, vous pourriez avoir envie de le lire, même si vous devez prendre plus qu'un grain de sel avec lui. Le premier volume d'une nouvelle édition est [attendu en 2019] (http://www.amazon.com/dp/0201717069).

  • Inside the C++ Object Model](http://www.amazon.com/dp/0201834545) (Stanley Lippman) Si vous voulez savoir comment les fonctions membres virtuelles sont généralement mises en oeuvre et comment les objets de base sont généralement disposés en mémoire dans un scénario de multi-héritage, et comment tout cela affecte les performances, c'est ici que vous trouverez des discussions approfondies sur ces sujets.

  • The Annotated C++ Reference Manual (Bjarne Stroustrup, Margaret A. Ellis) Ce livre est assez dépassé dans la mesure où il explore la version 2.0 du C++ de 1989 - Les modèles, les exceptions, les espaces de noms et les nouveaux casts n'étaient pas encore introduits. Cela dit, ce livre passe en revue l'ensemble du standard C++ de l'époque en expliquant le raisonnement, les implémentations possibles et les caractéristiques du langage. Ce n'est pas un livre pour apprendre les principes de programmation et les patrons du C++, mais pour comprendre tous les aspects du langage C++.

  • Thinking in C++](http://www.amazon.com/dp/0139798099/) (Bruce Eckel, 2e édition, 2000). Deux volumes ; est un ensemble de livres d'introduction de style tutoriel gratuit. Téléchargements : vol 1, vol 2. Malheureusement, ils sont entachés d'un certain nombre d'erreurs triviales (par exemple, maintenir que les temporaires sont automatiquement const), sans liste officielle d'errata. Une liste partielle d'errata de la 3e partie est disponible sur (http://www.computersciencelab.com/Eckel.htm), mais elle n'est apparemment pas maintenue.

  • Scientific and Engineering C++ : An Introduction to Advanced Techniques and Examples (John Barton et Lee Nackman) Il s'agit d'un livre complet et très détaillé qui tente d'expliquer et d'utiliser toutes les fonctionnalités disponibles dans C++, dans le contexte des méthodes numériques. Il a introduit à l'époque plusieurs nouvelles techniques, telles que le Curiously Recurring Template Pattern (CRTP, également appelé tour Barton-Nackman). Il a ouvert la voie à plusieurs techniques telles que l'analyse dimensionnelle et la différenciation automatique. Il était accompagné d'un grand nombre de codes compilables et utiles, allant d'un analyseur d'expression à un wrapper Lapack. Le code est toujours disponible ici : http://www.informit.com/store/scientific-and-engineering-c-plus-plus-an-introduction-9780201533934. Malheureusement, les livres sont devenus quelque peu obsolètes dans le style et les fonctionnalités C++, mais c'était un incroyable tour de force à l'époque (1994, pré-STL). Les chapitres sur l'héritage dynamique sont un peu compliqués à comprendre et pas très utiles. Une version actualisée de ce livre classique incluant la sémantique des mouvements et les leçons tirées de la STL serait très appréciable. [1] : http://www.amazon.com/Effective-Modern-Specific-Ways-Improve/dp/1491903996

Commentaires (22)