Определяющее руководство и список книг по C++

В этом вопросе сделана попытка собрать несколько жемчужин среди десятков плохих книг по C++, которые выходят каждый год.

В отличие от многих других языков программирования, которые часто осваиваются на ходу из учебников, найденных в Интернете, мало кто способен быстро освоить C++ без изучения хорошо написанной книги по C++. Он слишком большой и сложный для этого. На самом деле, он настолько велик и сложен, что в мире существует очень много очень плохих книг по C++. И мы говорим не о плохом стиле, а о таких вещах, как спортивные очевидные фактические ошибки и пропаганда ужасно плохих стилей программирования.

Пожалуйста, отредактируйте принятый ответ, указав _качественные книги и примерный уровень навыков - предпочтительно после обсуждения вашего добавления в чате C++. (Завсегдатаи могут безжалостно удалить вашу работу, если они не согласны с рекомендацией). Добавьте краткую информацию/описание о каждой книге, которую вы лично прочитали/получили пользу. Не стесняйтесь обсуждать качество, заголовки и т.д. Книги, соответствующие критериям, будут добавлены в список. Книги, на которые есть рецензии Ассоциации пользователей C и C++ (ACCU), имеют ссылки на рецензии.

*Примечание: FAQ и другие ресурсы можно найти в разделе C++ tag info и под [tag:c++-faq].

Новичок

Вводный, без предыдущего опыта программирования

  • C++ Primer * (Stanley Lippman, Josée Lajoie, and Barbara E. Moo) (обновлено для C++11) При объеме в 1 тыс. страниц, это очень подробное введение в C++, которое охватывает практически все в языке в очень доступном формате и очень подробно. Пятое издание (выпущено 16 августа 2012 года) охватывает C++11. [Обзор]
  • Programming: Principles and Practice Using C++ (Bjarne Stroustrup, 2nd Edition - May 25, 2014) (обновлено для C++11/C++14) Введение в программирование на C++ от создателя языка. Хорошее чтение, которое не предполагает предыдущего опыта программирования, но предназначено не только для начинающих.
  • Не путать с C++ Primer Plus (Stephen Prata), имеющим значительно менее благоприятный обзор.

Вводный курс, с предыдущим опытом программирования

  • A Tour of C++ (Bjarne Stroustrup) (2-е издание для C++17) Тур" - это быстрый (около 180 страниц и 14 глав) обучающий обзор всего стандартного C++ (язык и стандартная библиотека, и использование C++11) на умеренно высоком уровне для людей, которые уже знают C++ или, по крайней мере, являются опытными программистами. Эта книга представляет собой расширенную версию материала, составляющего главы 2-5 книги "Язык программирования C++", 4-е издание.

  • Accelerated C++ (Andrew Koenig and Barbara Moo, 1st Edition - August 24, 2000) Эта книга в основном охватывает тот же материал, что и C++ Primer, но делает это на четвертой части своей площади. Это в основном потому, что он не пытается быть введением в программирование, а является введением в С++ для людей, которые ранее программировали на каком-то другом языке. Она имеет более крутую кривую обучения, но для тех, кто может с этим справиться, это очень компактное введение в язык. (Исторически, эта книга стала первым учебником для начинающих, в котором использовался современный подход к обучению языку). Несмотря на это, C++ в ней преподается исключительно на C++98. [Обзор]

    Лучшие практики

  • Effective C++ (Scott Meyers, 3rd Edition - May 22, 2005) Эта книга была написана с целью стать лучшей второй книгой по C++, которую программисты должны прочитать, и ей это удалось. Предыдущие издания были нацелены на программистов, пришедших из языка Си, третье издание меняет это и нацелено на программистов, пришедших из таких языков, как Java. В книге представлено ~50 легко запоминающихся правил и их обоснование в очень доступном (и приятном) стиле. Для C++11 и C++14 примеры и некоторые вопросы устарели, поэтому следует отдать предпочтение Effective Modern C++. [Обзор]

  • Effective Modern C++ (Scott Meyers) Это, по сути, новая версия Effective C++, предназначенная для программистов C++, переходящих с C++03 на C++11 и C++14.

  • Effective STL (Scott Meyers) Цель этой статьи - сделать с частью стандартной библиотеки, происходящей из STL, то же самое, что Effective C++ сделал с языком в целом: В ней представлены эмпирические правила вместе с их обоснованием. [Обзор]

    Intermediate

  • More Effective C++ (Scott Meyers) Еще больше правил, чем в Effective C++. Не такие важные, как в первой книге, но все равно полезно знать.

  • Exceptional C++ (Herb Sutter) Представленная в виде набора головоломок, эта книга содержит одно из лучших и подробных обсуждений правильного управления ресурсами и безопасности исключений в C++ через Resource Acquisition is Initialization (RAII) в дополнение к глубокому освещению множества других тем, включая идиому pimpl, поиск имен, хороший дизайн классов и модель памяти C++. [Обзор]

  • More Exceptional C++ (Herb Sutter) Охватывает дополнительные темы безопасности исключений, не рассмотренные в Exceptional C++, в дополнение к обсуждению эффективного объектно-ориентированного программирования на C++ и правильного использования STL. [Обзор]

  • Exceptional C++ Style (Herb Sutter) Обсуждается общее программирование, оптимизация и управление ресурсами; в этой книге также есть отличное изложение того, как писать модульный код на C++, используя нечленимые функции и принцип единой ответственности. [Обзор]

  • C++ Coding Standards (Herb Sutter and Andrei Alexandrescu) "Стандарты кодирования" здесь не означает "сколько пробелов я должен отступать в коде?". Эта книга содержит 101 лучший опыт, идиомы и распространенные подводные камни, которые помогут вам писать правильный, понятный и эффективный код на C++. [Обзор]

  • C++ Templates: The Complete Guide (David Vandevoorde and Nicolai M. Josuttis) Это самая книга о шаблонах в том виде, в котором они существовали до C++11. Она охватывает все от самых основ до наиболее продвинутого метапрограммирования шаблонов и объясняет каждую деталь работы шаблонов (как концептуально, так и на уровне их реализации), а также обсуждает многие распространенные подводные камни. В приложениях даны отличные краткие описания правила одного определения (ODR) и разрешения перегрузки. Уже опубликовано второе издание, охватывающее C++11, C++14 и C++17. [Обзор]

  • C++ 17 - The Complete Guide (Nicolai M. Josuttis) В книге описываются все новые возможности, представленные в стандарте C++17, начиная с таких простых, как 'Inline Variables', 'constexpr if' и заканчивая 'Polymorphic Memory Resources' и 'New and Delete with overaligned Data'.

    Advanced

  • Modern C++ Design (Андрей Александреску) Новаторская книга о передовых методах общего программирования. Представляет проектирование на основе политики, списки типов и фундаментальные идиомы родового программирования, а затем объясняет, как многие полезные модели проектирования (включая распределители небольших объектов, функторы, фабрики, посетители и мультиметоды) могут быть реализованы эффективно, модульно и чисто с помощью родового программирования. [Обзор]

  • C++ Template Metaprogramming (Дэвид Абрахамс и Алексей Гуртовой)

  • C++ Concurrency In Action (Anthony Williams) Книга, охватывающая поддержку параллелизма в C++11, включая библиотеку потоков, библиотеку atomics, модель памяти C++, блокировки и мьютексы, а также вопросы проектирования и отладки многопоточных приложений. Уже опубликовано второе издание, охватывающее C++14 и C++17.

  • Advanced C++ Metaprogramming (Davide Di Gennaro) Руководство по техникам TMP до выхода C++11, ориентированное больше на практику, чем на теорию. В этой книге есть тонна фрагментов, некоторые из которых устарели благодаря свойствам типов, но, тем не менее, эти техники полезно знать. Если вы сможете смириться с причудливым форматированием/редактированием, то читать ее будет легче, чем Александреску, и, возможно, более полезно. Для более опытных разработчиков есть большая вероятность, что вы узнаете что-то о темном уголке C++ (причуде), который обычно открывается только через большой опыт.

    Reference Style - All Levels

  • The C++ Programming Language (Bjarne Stroustrup) (обновлено для C++11) Классическое введение в C++ от его создателя. Написанное параллельно классическому K&R, оно действительно очень похоже на него и охватывает практически все - от ядра языка до стандартной библиотеки, от парадигм программирования до философии языка. [Обзор] Примечание: Все выпуски стандарта C++ отслеживаются в этом вопросе: Где найти текущий стандарт C++.

  • C++ Standard Library Tutorial and Reference (Nicolai Josuttis) (обновлено для C++11) _Введение и справочник по стандартной библиотеке C++. Второе издание (выпущено 9 апреля 2012 года) охватывает C++11. [Обзор]

  • The C++ IO Streams and Locales (Angelika Langer and Klaus Kreft) Об этой книге мало что можно сказать, кроме того, что если вы хотите узнать что-нибудь о потоках и локалях, то это единственное место, где можно найти окончательные ответы. [Обзор] C++11/14/17/... Ссылки:

  • Стандарт C++11/14/17 (INCITS/ISO/IEC 14882:2011/2014/2017)_ Это, конечно, окончательный арбитр всего, что является или не является C++. Однако имейте в виду, что он предназначен исключительно в качестве справочника для опытных пользователей, готовых посвятить значительное время и усилия для его понимания. Стандарт C++17 выпущен в электронной форме за 198 швейцарских франков.

  • Стандарт C++17 доступен, но, похоже, не в экономичном виде - напрямую от ISO он стоит 198 швейцарских франков (около 200 долларов США). Для большинства людей окончательный проект перед стандартизацией более чем достаточен (и бесплатен). Многие предпочтут еще более новый проект, документирующий новые возможности, которые, вероятно, будут включены в C++20.

  • Overview of the New C++ (C++11/14) (PDF only) (Scott Meyers) (обновлено для C++14) Это презентационные материалы (слайды и некоторые конспекты лекций) трехдневного учебного курса, проведенного Скоттом Мейерсом, который является весьма уважаемым автором по C++. Несмотря на то, что список материалов короткий, качество высокое.

  • The C++ Core Guidelines (C++11/14/17/...) (под редакцией Бьярна Струструпа и Херба Саттера) - это развивающийся онлайновый документ, состоящий из набора рекомендаций по использованию современного C++. Руководство сосредоточено на относительно высокоуровневых вопросах, таких как интерфейсы, управление ресурсами, управление памятью и параллелизм, влияющих на архитектуру приложений и проектирование библиотек. Проект был анонсирован на CppCon'15 Бьярном Струструпом и другими и приветствует вклад сообщества. Большинство правил дополнены обоснованием и примерами, а также обсуждением возможной инструментальной поддержки. Многие правила разработаны специально для автоматической проверки средствами статического анализа.

  • C++ Super-FAQ (Marshall Cline, Bjarne Stroustrup и другие) - это попытка Standard C++ Foundation объединить C++ FAQs, ранее поддерживаемые по отдельности Marshall Cline и Bjarne Stroustrup, а также включить новые материалы. Статьи в основном посвящены вопросам промежуточного уровня и часто написаны в юмористическом тоне. Не все статьи могут быть полностью обновлены в соответствии с последней редакцией стандарта C++.

  • cppreference.com (C++03/11/14/17/...) (инициатор Nate Kohl) - это вики, в которой кратко описаны основные возможности языка ядра и имеется обширная документация по стандартной библиотеке C++. Документация очень точная, но читается легче, чем официальный стандартный документ, и обеспечивает лучшую навигацию благодаря своей вики-природе. Проект документирует все версии стандарта C++, и сайт позволяет фильтровать отображение для конкретной версии. Проект был представлен Нейтом Колом на CppCon'14.

    Classics / Older

    Примечание: Некоторая информация, содержащаяся в этих книгах, может быть неактуальной или больше не считаться лучшей практикой.

  • The Design and Evolution of C++ (Bjarne Stroustrup) Если вы хотите знать, почему язык стал таким, какой он есть, в этой книге вы найдете ответы. Она охватывает все, что было до стандартизации C++.

  • Ruminations on C++ - (Andrew Koenig and Barbara Moo) [Обзор]

  • Advanced C++ Programming Styles and Idioms (James Coplien) Предшественник движения паттернов, он описывает множество специфических для C++ "идиом". Это, безусловно, очень хорошая книга, и ее стоит прочитать, если у вас есть время, но она довольно старая и не отвечает современным требованиям C++.

  • Large Scale C++ Software Design (John Lakos) Лакос объясняет методы управления очень большими программными проектами на C++. Безусловно, хорошее чтение, если бы только оно было актуальным. Она была написана задолго до появления C++ 98 и упускает многие возможности (например, пространства имен), важные для крупномасштабных проектов. Если вам предстоит работать в крупном программном проекте на C++, вы, возможно, захотите ее прочитать, хотя вам нужно взять с собой больше, чем крупицу соли. Первый том нового издания - ожидается в 2019 году.

  • Inside the C++ Object Model (Stanley Lippman) Если вы хотите узнать, как обычно реализуются виртуальные функции-члены, как обычно располагаются базовые объекты в памяти в сценарии мультинаследования, и как все это влияет на производительность, то здесь вы найдете подробное обсуждение таких тем.

  • The Annotated C++ Reference Manual (Bjarne Stroustrup, Margaret A. Ellis) Эта книга довольно устарела, поскольку в ней рассматривается версия C++ 2.0 1989 года - шаблоны, исключения, пространства имен и новые касты еще не были представлены. Однако, несмотря на это, в книге рассматривается весь стандарт C++ того времени, объясняется обоснование, возможные реализации и особенности языка. Это книга не для изучения принципов программирования и паттернов на C++, а для понимания каждого аспекта языка C++.

  • Thinking in C++ (Bruce Eckel, 2nd Edition, 2000). Два тома; представляет собой учебник в стиле бесплатного набора книг вводного уровня. Скачать: vol 1, vol 2. К сожалению, они омрачены рядом тривиальных ошибок (например, утверждение о том, что временные элементы автоматически являются const), и нет официального списка исправлений. Частичный список ошибок от 3rd сторон доступен по адресу (http://www.computersciencelab.com/Eckel.htm), но он, по-видимому, не поддерживается.

  • Scientific and Engineering C++: An Introduction to Advanced Techniques and Examples (John Barton and Lee Nackman) Это всеобъемлющая и очень подробная книга, которая попыталась объяснить и использовать все возможности, доступные в C++, в контексте численных методов. В ней было представлено несколько новых для того времени техник, таких как Curiously Recurring Template Pattern (CRTP, также называемый трюком Бартона-Накмана). Он стал первопроходцем в таких методах, как анализ размерности и автоматическое дифференцирование. Он поставляется с большим количеством компилируемого и полезного кода, начиная от парсера выражений и заканчивая оберткой Lapack. Код все еще доступен здесь: http://www.informit.com/store/scientific-and-engineering-c-plus-plus-an-introduction-9780201533934. К сожалению, книги несколько устарели по стилю и возможностям C++, однако в то время (1994 год, до появления STL) это был невероятный тур-де-форс. Главы о динамическом наследовании немного сложны для понимания и не очень полезны. Обновленная версия этой классической книги, включающая семантику перемещений и уроки, извлеченные из STL, была бы очень кстати.

Комментарии (22)