Esta pregunta intenta recoger las pocas perlas entre las docenas de malos libros de C++ que se publican cada año.
A diferencia de muchos otros lenguajes de programación, que a menudo se aprenden sobre la marcha a partir de tutoriales encontrados en Internet, pocos son capaces de aprender rápidamente C++ sin estudiar un libro de C++ bien escrito. Es demasiado grande y complejo para hacerlo. De hecho, es tan grande y complejo, que hay muchos libros de C++ muy malos por ahí. Y no nos referimos a un mal estilo, sino a cosas como la presentación de errores evidentes en los hechos y la promoción de estilos de programación abismalmente malos.
Por favor, edita la respuesta aceptada para proporcionar libros de calidad y un nivel de habilidad aproximado - preferiblemente después decir tu adición en la sala de chat de C++. (Los habituales podrían deshacer sin piedad tu trabajo si no están de acuerdo con una recomendación). Añade una breve reseña/descripción sobre cada libro que hayas leído/aprovechado personalmente. Siéntase libre de debatir sobre la calidad, los títulos, etc. Los libros que cumplan los criterios se añadirán a la lista. Los libros que tienen reseñas de la Asociación de Usuarios de C y C++ (ACCU) tienen enlaces a la reseña.
Nota: Las preguntas frecuentes y otros recursos se pueden encontrar en la etiqueta C++ info y en [tag:c++-faq];
A Tour of C++ (Bjarne Stroustrup) (2ª edición para C++17) El "tour" es un rápido (unas 180 páginas y 14 capítulos) resumen tutorial de todo el C++ estándar (lenguaje y biblioteca estándar, y uso de C++11) a un nivel moderadamente alto para personas que ya conocen C++ o al menos son programadores experimentados. Este libro es una versión ampliada del material que constituye los capítulos 2-5 de The C++ Programming Language, 4th edition.
Accelerated C++ (Andrew Koenig y Barbara Moo, 1ª edición - 24 de agosto de 2000) Este libro cubre básicamente el mismo terreno que el C++ Primer, pero lo hace en una cuarta parte de su espacio. Esto se debe en gran medida a que no intenta ser una introducción a la programación, sino una introducción a C++ para personas que han programado previamente en algún otro lenguaje. Tiene una curva de aprendizaje más pronunciada, pero, para aquellos que puedan afrontarla, es una introducción muy compacta al lenguaje. (Históricamente, abrió un nuevo camino al ser el primer libro para principiantes que utilizó un enfoque moderno para enseñar el lenguaje). A pesar de ello, el C++ que enseña es puramente C++98. [Review]
Effective C++ (Scott Meyers, 3ª edición - 22 de mayo de 2005) Se escribió con el objetivo de ser el mejor segundo libro que los programadores de C++ deberían leer, y lo consiguió. Las ediciones anteriores estaban dirigidas a programadores que venían de C, la tercera edición cambia esto y se dirige a programadores que vienen de lenguajes como Java. Presenta ~50 reglas empíricas fáciles de recordar junto con su justificación en un estilo muy accesible (y agradable). Para C++11 y C++14 los ejemplos y algunos temas están desfasados y debería preferirse Effective Modern C++. [Review]
Effective Modern C++ (Scott Meyers) Esta es básicamente la nueva versión de Effective C++, dirigida a los programadores de C++ que hacen la transición de C++03 a C++11 y C++14.
More Effective C++ (Scott Meyers) Incluso más reglas generales que Effective C++. No son tan importantes como las del primer libro, pero sigue siendo bueno conocerlas.
Exceptional C++](http://www.amazon.com/dp/0201615622/) (Herb Sutter) Presentado como un conjunto de rompecabezas, tiene una de las mejores y más completas discusiones sobre la gestión adecuada de los recursos y la seguridad de las excepciones en C++ a través de Resource Acquisition is Initialization (RAII), además de la cobertura en profundidad de una variedad de otros temas, incluyendo el lenguaje pimpl, la búsqueda de nombres, el buen diseño de clases y el modelo de memoria de C++. [Revisión]
More Exceptional C++ (Herb Sutter) Cubre temas adicionales sobre la seguridad de las excepciones que no se tratan en Exceptional C++, además de la discusión sobre la programación orientada a objetos efectiva en C++ y el uso correcto de la STL. [Revisión]
Exceptional C++ Style (Herb Sutter) Discute la programación genérica, la optimización y la gestión de recursos; este libro también tiene una excelente exposición de cómo escribir código modular en C++ utilizando funciones no miembros y el principio de responsabilidad única. [Reseña]
C++ Coding Standards (Herb Sutter y Andrei Alexandrescu) "Estándares de codificación" aquí no significa "¿cuántos espacios debo sangrar mi código?". Este libro contiene 101 mejores prácticas, modismos y errores comunes que pueden ayudarle a escribir un código C++ correcto, comprensible y eficiente. [Reseña]
C++ Templates: The Complete Guide (David Vandevoorde y Nicolai M. Josuttis) Este es el libro sobre las plantillas tal y como existían antes de C++11. Cubre todo, desde lo más básico hasta la metaprogramación con plantillas más avanzada, y explica cada detalle de cómo funcionan las plantillas (tanto conceptualmente como en su implementación) y discute muchos escollos comunes. Cuenta con excelentes resúmenes de la regla de definición única (ODR) y de la resolución de sobrecargas en los apéndices. Ya se ha publicado una segunda edición que cubre C++11, C++14 y C++17. [Revisión]
Modern C++ Design (Andrei Alexandrescu) Un libro innovador sobre técnicas avanzadas de programación genérica. Introduce el diseño basado en políticas, las listas de tipos y los modismos fundamentales de la programación genérica, y luego explica cómo muchos patrones de diseño útiles (incluyendo asignadores de objetos pequeños, functores, fábricas, visitantes y multimétodos) pueden implementarse de forma eficiente, modular y limpia utilizando la programación genérica. [Review]
C++ Template Metaprogramming (David Abrahams y Aleksey Gurtovoy)
C++ Concurrency In Action](http://www.amazon.com/dp/1933988770) (Anthony Williams) Un libro que cubre el soporte de concurrencia de C++11, incluyendo la librería de hilos, la librería atomics, el modelo de memoria de C++, los bloqueos y los mutexes, así como cuestiones de diseño y depuración de aplicaciones multihilo. Ya se ha publicado una segunda edición que cubre C++14 y C++17.
The C++ Programming Language (Bjarne Stroustrup) (actualizado para C++11) La clásica introducción a C++ por su creador. Escrito de forma paralela al clásico K&R, se parece mucho a éste y cubre casi todo, desde el núcleo del lenguaje hasta la biblioteca estándar, pasando por los paradigmas de programación y la filosofía del lenguaje. [Review] Nota: En esta pregunta se hace un seguimiento de todas las versiones del estándar C++: Dónde puedo encontrar el estándar C++ actual.
Tutorial y referencia de la biblioteca estándar de C++](http://www.amazon.com/dp/0321623215/) (Nicolai Josuttis) (actualizado para C++11) _La introducción y referencia de la biblioteca estándar de C++. La segunda edición (publicada el 9 de abril de 2012) cubre C++11. [Review]
The C++ IO Streams and Locales (Angelika Langer y Klaus Kreft) Hay muy poco que decir sobre este libro, excepto que, si quieres saber algo sobre streams y locales, éste es el único lugar donde encontrarás respuestas definitivas. [Reseña] C++11/14/17/... Referencias:
El estándar C++11/14/17 (INCITS/ISO/IEC 14882:2011/2014/2017)_ Este, por supuesto, es el árbitro final de todo lo que es o no es C++. Sin embargo, hay que tener en cuenta que está pensado como una mera referencia para usuarios expertos dispuestos a dedicar un tiempo y un esfuerzo considerables a su comprensión. El estándar C++17 se publica en formato electrónico por 198 francos suizos.
El estándar C++17 está disponible, pero aparentemente no de forma económica - directamente de la ISO cuesta 198 francos suizos (unos 200 dólares estadounidenses). Para la mayoría de la gente, el borrador final antes de la estandarización es más que adecuado (y gratuito). Muchos preferirán un borrador aún más reciente, que documenta las nuevas características que probablemente se incluirán en C++20.
Visión general del nuevo C++ (C++11/14) (sólo en PDF)_](http://www.artima.com/shop/overview_of_the_new_cpp) (Scott Meyers) (actualizado para C++14) Se trata de los materiales de presentación (diapositivas y algunas notas de clase) de un curso de formación de tres días ofrecido por Scott Meyers, que es un autor muy respetado en C++. Aunque la lista de temas es corta, la calidad es alta.
Las Directrices del núcleo de C++ (C++11/14/17/...) (editado por Bjarne Stroustrup y Herb Sutter) es un documento en línea en evolución que consiste en un conjunto de directrices para utilizar bien el C++ moderno. Las directrices se centran en cuestiones de nivel relativamente alto, como las interfaces, la gestión de recursos, la gestión de la memoria y la concurrencia que afectan a la arquitectura de las aplicaciones y al diseño de las bibliotecas. El proyecto fue anunciado en la CppCon'15 por Bjarne Stroustrup y otros y acoge las contribuciones de la comunidad. La mayoría de las directrices se complementan con una justificación y ejemplos, así como con discusiones sobre el posible apoyo de herramientas. Muchas reglas están diseñadas específicamente para que puedan ser comprobadas automáticamente por herramientas de análisis estático.
La C++ Super-FAQ (Marshall Cline, Bjarne Stroustrup y otros) es un esfuerzo de la Standard C++ Foundation para unificar las preguntas frecuentes sobre C++ mantenidas anteriormente de forma individual por Marshall Cline y Bjarne Stroustrup e incorporar también nuevas contribuciones. Los artículos abordan en su mayoría cuestiones de nivel intermedio y a menudo están escritos en tono de humor. Es posible que no todos los artículos estén totalmente actualizados con la última edición del estándar C++.
Nota: Alguna información contenida en estos libros puede no estar actualizada o ya no se considera la mejor práctica.
The Design and Evolution of C++ (Bjarne Stroustrup) Si quieres saber por qué el lenguaje es como es, en este libro encontrarás las respuestas. Abarca todo lo anterior a la estandarización de C++.
Ruminations on C++ - (Andrew Koenig y Barbara Moo) [Review]
Advanced C++ Programming Styles and Idioms](http://www.amazon.com/dp/0201548550/) (James Coplien) Predecesor del movimiento de patrones, describe muchos "modismos" específicos de C++. Sin duda es un libro muy bueno y puede valer la pena leerlo si se dispone de tiempo, pero es bastante antiguo y no está actualizado con el C++ actual.
Large Scale C++ Software Design (John Lakos) Lakos explica técnicas para gestionar proyectos de software C++ muy grandes. Ciertamente, una buena lectura, si sólo estuviera actualizada. Fue escrito mucho antes de C++ 98 y echa de menos muchas características (por ejemplo, los espacios de nombres) importantes para los proyectos a gran escala. Si necesitas trabajar en un gran proyecto de software C++, puede que quieras leerlo, aunque debes tomar más que un grano de sal con él. El primer volumen de una nueva edición está previsto para 2019.
Si quiere saber cómo se implementan habitualmente las funciones miembro virtuales y cómo se distribuyen los objetos base en la memoria en un escenario de multiherencia, y cómo todo esto afecta al rendimiento, aquí encontrará discusiones exhaustivas sobre estos temas.
The Annotated C++ Reference Manual_](https://www.amazon.com/Annotated-C-Reference-Manual/dp/0201514591) (Bjarne Stroustrup, Margaret A. Ellis) Este libro está bastante anticuado, ya que explora la versión 2.0 de C++ de 1989: las plantillas, las excepciones, los espacios de nombres y los nuevos moldes aún no se habían introducido. Sin embargo, este libro recorre todo el estándar C++ de la época explicando los fundamentos, las posibles implementaciones y las características del lenguaje. No es un libro para aprender principios y patrones de programación en C++, sino para entender todos los aspectos del lenguaje C++.
Thinking in C++ (Bruce Eckel, 2ª edición, 2000). Dos volúmenes; es un conjunto de libros de nivel introductorio de estilo tutorial gratis. Descargas: vol 1, vol 2. Desgraciadamente, están viciados por una serie de errores triviales (por ejemplo, mantener que los temporales son automáticamente const
), sin lista oficial de erratas. Una lista parcial de erratas de 3rd está disponible en (http://www.computersciencelab.com/Eckel.htm), pero aparentemente no se mantiene.
Scientific and Engineering C++: An Introduction to Advanced Techniques and Examples (John Barton y Lee Nackman) Es un libro completo y muy detallado que trataba de explicar y aprovechar todas las características disponibles en C++, en el contexto de los métodos numéricos. Introdujo en su momento varias técnicas nuevas, como el Curiously Recurring Template Pattern (CRTP, también llamado Barton-Nackman trick). Fue pionero en varias técnicas como el análisis dimensional y la diferenciación automática. Venía con un montón de código compilable y útil, que iba desde un analizador de expresiones hasta un envoltorio de Lapack. El código sigue estando disponible aquí: http://www.informit.com/store/scientific-and-engineering-c-plus-plus-an-introduction-9780201533934. Lamentablemente, el libro se ha quedado algo anticuado en cuanto a estilo y características de C++, sin embargo, fue un increíble tour-de-force en su momento (1994, pre-STL). Los capítulos sobre la herencia dinámica son un poco complicados de entender y no son muy útiles. Una versión actualizada de este libro clásico que incluya la semántica de los movimientos y las lecciones aprendidas de la STL estaría muy bien.