У цьому питанні зроблена спроба зібрати кілька перлин серед десятків поганих книг по С++, які видаються щороку.
На відміну від багатьох інших мов програмування, які часто підхоплюються на ходу з підручників, знайдених в Інтернеті, мало хто здатен швидко підхопити С++ без вивчення добре написаної книги по С++. Вона занадто велика і складна для цього. Насправді, вона настільки велика і складна, що існує дуже багато дуже поганих книг по С++. І ми говоримо не про поганий стиль, а про такі речі, як вихваляння очевидних фактичних помилок та пропаганда жахливо поганих стилів програмування.
Будь ласка, відредагуйте прийняту відповідь, вказавши якісні книжки та приблизний рівень навичок - бажано після обговорення вашого доповнення у чаті С++. (Завсідники можуть безжально знищити вашу роботу, якщо вони не згодні з рекомендацією). Додайте коротку анотацію/опис про кожну книгу, яку Ви особисто прочитали/отримали від неї користь. Не соромтеся обговорювати якість, заголовки тощо. Книги, які відповідають критеріям, будуть додані до списку. Книги, які мають рецензії від Асоціації користувачів мови С та С++ (АППАУ), мають посилання на рецензію.
*Примітка: Часті запитання та інші ресурси можна знайти в розділі tag:C++ info та в розділі [tag:c++-faq].
A Tour of C++ (Bjarne Stroustrup) (2-е видання для C++17) Цей "тур" є коротким (близько 180 сторінок і 14 розділів) навчальним оглядом всього стандарту C++ (мова і стандартна бібліотека, та використання C++11) на помірно високому рівні для людей, які вже знають C++ або, принаймні, є досвідченими програмістами. Ця книга є розширеною версією матеріалу, що становить глави 2-5 книги "Мова програмування С++", 4-е видання.
Прискорений C++ (Ендрю Кеніг та Барбара Му, 1-е видання - 24 серпня 2000 р.) Ця книга в основному охоплює ті ж самі питання, що й "Підручник C++", але займає четверту частину його обсягу. Це значною мірою тому, що він не намагається бути вступом до програмування, а є вступом до С++ для людей, які раніше програмували якоюсь іншою мовою. Він має більш круту криву навчання, але для тих, хто може з цим впоратися, це дуже компактний вступ до мови. (Історично, вона проклала новий шлях, будучи першою книгою для початківців, яка використовувала сучасний підхід до викладання мови). Незважаючи на це, C++, який в ній викладається що в ній викладається, є суто C++98. [Рецензія]
Effective C++ (Скотт Мейерс, 3-тє видання - 22 травня 2005 р.) Ця книга була написана з метою стати найкращою другою книгою, яку повинні прочитати програмісти C++, і це вдалося. Попередні видання були орієнтовані на програмістів, які прийшли з мови C, третє видання змінює це і орієнтоване на програмістів, які прийшли з таких мов, як Java. У ньому представлено близько 50 простих для запам'ятовування практичних правил разом з їх обґрунтуванням у дуже доступному (і приємному) стилі. Для C++11 і C++14 приклади і деякі питання застаріли, і слід віддати перевагу ефективному сучасному C++. [Рецензія]
Effective Modern C++ (Скотт Мейерс) Це, по суті, нова версія Effective C++, орієнтована на програмістів C++, які переходять з C++03 на C++11 та C++14.
More Effective C++ (Скотт Мейерс) Ще більше емпіричних правил, ніж Effective C++. Не такі важливі, як у першій книзі, але все одно корисно знати.
Exceptional C++ (Herb Sutter) Представлена у вигляді набору головоломок, ця книга має одне з найкращих і ґрунтовних обговорень належного управління ресурсами та безпеки виключень у C++ за допомогою Resource Acquisition is Initialization (RAII) на додаток до глибокого висвітлення різноманітних інших тем, включаючи ідіому прищів, пошук імен, хороший дизайн класів та модель пам'яті C++. [Огляд]
More Exceptional C++ (Herb Sutter) Охоплює додаткові теми безпеки виключних ситуацій, які не були розглянуті в Exceptional C++, на додаток до обговорення ефективного об'єктно-орієнтованого програмування на C++ та правильного використання STL. [Огляд]
Exceptional C++ Style (Герб Саттер) Обговорює загальне програмування, оптимізацію та управління ресурсами; ця книга також має чудовий виклад того, як писати модульний код на C++ з використанням функцій-нечленів та принципу єдиної відповідальності. [Рецензія]
Стандарти кодування C++ (Герб Саттер і Андрій Александреску) "Стандарти кодування" тут не означає "на скільки пробілів я повинен робити відступи в своєму коді?". Ця книга містить 101 найкращу практику, ідіоми та типові помилки, які допоможуть вам написати правильний, зрозумілий та ефективний код на C++. [Рецензія]
C++ Templates: The Complete Guide (David Vandevoorde and Nicolai M. Josuttis) Це повна книга про шаблони в тому вигляді, в якому вони існували до C++11. Вона охоплює все, від самих основ до деяких найбільш просунутих шаблонних метапрограм, і пояснює кожну деталь того, як працюють шаблони (як концептуально, так і на рівні їх реалізації), а також обговорює багато поширених пасток. Має чудові резюме Правила одного визначення (ODR) та вирішення проблеми перевантаження в додатках. Вже опубліковано друге видання, що охоплює C++11, C++14 та C++17. [Огляд]
Сучасне проектування на C++ (Андрій Александреску) Новаторська книга про передові загальні методи програмування. Представляє проектування на основі політик, списки типів і фундаментальні ідіоми загального програмування, а потім пояснює, як багато корисних шаблонів проектування (включаючи невеликі розподільники об'єктів, функції, фабрики, відвідувачі і мультиметоди) можуть бути реалізовані ефективно, модульно і чисто, використовуючи загальне програмування. [Огляд]
С++ Шаблонне метапрограмування (Девід Абрахамс та Олексій Гуртовий)
C++ Concurrency In Action (Ентоні Вільямс) Книга, що охоплює підтримку паралелізму в C++11, включаючи бібліотеку потоків, бібліотеку атомізації, модель пам'яті C++, блокування та м'ютекси, а також питання проектування та налагодження багатопотокових додатків. Вже вийшло друком друге видання, що охоплює С++14 та С++17.
Мова програмування C++ (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 (Анжеліка Лангер та Клаус Крефт) Про цю книгу можна сказати дуже мало, за винятком того, що якщо ви хочете дізнатися що-небудь про потоки та локалі, то це єдине місце, де можна знайти вичерпні відповіді. [Рецензія] C++11/14/17/... Посилання:**.
Стандарт C++11/14/17 (INCITS/ISO/IEC 14882:2011/2014/2017)_ Це, звичайно, остаточний арбітр всього, що є або не є C++. Однак слід пам'ятати, що він призначений виключно як довідник для досвідчених користувачів, готових присвятити значний час і зусилля його розумінню. Стандарт С++17 випускається в електронному вигляді за ціною 198 швейцарських франків.
Стандарт С++17 доступний, але, схоже, не в економічно вигідній формі - безпосередньо від ISO він коштує 198 швейцарських франків (близько 200 доларів США). Для більшості людей остаточний проект перед стандартизацією є більш ніж достатнім (і безкоштовним). Багато хто віддасть перевагу ще новішому проекту, що документує нові можливості, які, ймовірно, будуть включені до C++20.
Огляд нового C++ (C++11/14) (тільки PDF) (Скотт Мейерс) (оновлений для C++14) Це презентаційні матеріали (слайди та деякі конспекти лекцій) триденного навчального курсу, запропонованого Скоттом Мейерсом, дуже шанованим автором з C++. Незважаючи на те, що перелік матеріалів невеликий, їхня якість висока.
C++ Core Guidelines (C++11/14/17/...) (під редакцією Б'ярна Строструпа та Герба Саттера) - це онлайновий документ, що розвивається, який складається з набору рекомендацій щодо ефективного використання сучасної мови С++. Настанови зосереджені на відносно високорівневих питаннях, таких як інтерфейси, управління ресурсами, управління пам'яттю та паралелізм, що впливають на архітектуру додатків та дизайн бібліотек. Проект був оголошений на CppCon'15 Bjarne Stroustrup та іншими і вітає внески з боку спільноти. Більшість настанов доповнено обґрунтуванням та прикладами, а також обговоренням можливої підтримки інструментів. Багато правил розроблено спеціально для автоматичної перевірки інструментами статичного аналізу.
C++ Super-FAQ (Marshall Cline, Bjarne Stroustrup та інші) - це спроба Фонду Стандартного C++ об'єднати FAQ по C++, які раніше підтримувалися індивідуально Маршаллом Клайном і Бьярном Строструпом, а також включити нові матеріали. Статті в основному стосуються питань проміжного рівня і часто написані в гумористичному тоні. Не всі статті можуть повністю відповідати останній редакції стандарту C++.
Примітка: Деяка інформація, що міститься у цих книгах, може бути неактуальною або більше не вважатися найкращою практикою.
The Design and Evolution of C++ (Bjarne Stroustrup) Якщо ви хочете знати, чому мова є такою, якою вона є, ця книга - те місце, де ви знайдете відповіді. Вона охоплює все, що було до стандартизації C++.
Роздуми про C++ - (Andrew Koenig and Barbara Moo) [Рецензія]
Advanced C++ Programming Styles and Idioms (James Coplien) Попередник руху шаблонів, він описує багато специфічних для C++ "ідіом". Це, безумовно, дуже хороша книга, і її все ще варто прочитати, якщо у вас є час, але вона досить стара і не відповідає сучасному рівню розвитку C++.
Large Scale C++ Software Design (Джон Лакос) Лакос пояснює методи управління дуже великими програмними проектами на C++. Безумовно, хороша книга, якби вона була актуальною. Вона була написана задовго до C++ 98 і не враховує багато особливостей (наприклад, простори імен), важливих для великомасштабних проектів. Якщо вам потрібно працювати у великому програмному проекті на С++, вам варто прочитати її, хоча до неї потрібно ставитися з великою часткою скептицизму. Перший том нового видання очікується у 2019 році.
Inside the C++ Object Model (Stanley Lippman) Якщо ви хочете знати, як зазвичай реалізуються віртуальні функції-члени і як зазвичай розміщуються в пам'яті базові об'єкти в сценарії з множинним успадкуванням, і як все це впливає на продуктивність, то саме тут ви знайдете докладні обговорення цих тем.
The Annotated C++ Reference Manual (Bjarne Stroustrup, Margaret A. Ellis) Ця книга є досить застарілою, оскільки розглядає версію C++ 2.0 1989 року - шаблони, виключення, простори імен та нові приведення ще не були введені. Однак, незважаючи на це, книга проходить через весь стандарт С++ того часу, пояснюючи обґрунтування, можливі реалізації та особливості мови. Це книга не для вивчення принципів і шаблонів програмування на С++, а для розуміння всіх аспектів мови С++.
Thinking in C++ (Bruce Eckel, 2nd Edition, 2000). Два томи; являє собою підручник у стилі безкоштовного набору книг початкового рівня. Завантаження: vol 1, vol 2. На жаль, вони затьмарені низкою тривіальних помилок (наприклад, твердження про те, що тимчасові значення автоматично стають "постійними"), і не мають офіційного списку помилок. Частковий список помилок 3 партії доступний за адресою (http://www.computersciencelab.com/Eckel.htm), але він, очевидно, не підтримується.
Науковий та інженерний C++: Вступ до передових методів і прикладів (Джон Бартон і Лі Накман). Це всеосяжна і дуже детальна книга, в якій зроблена спроба пояснити і використати всі можливості, доступні в С++, в контексті чисельних методів. Вона представила на той час кілька нових методів, таких як Шаблон Шаблону, що Цікаво Повторюється (Curiously Recurring Template Pattern, CRTP, також відомий як трюк Бартона-Накмана). Вона стала першопрохідцем в декількох методах, таких як розмірний аналіз і автоматичне диференціювання. Він поставлявся з великою кількістю компілюючого і корисного коду, починаючи від синтаксичного аналізатора виразів і закінчуючи обгорткою Lapack. Код все ще доступний тут: http://www.informit.com/store/scientific-and-engineering-c-plus-plus-an-introduction-9780201533934. На жаль, книги дещо застаріли за стилем та можливостями С++, однак, на той час (1994 рік, до STL) це був неймовірний тур-де-форс. Розділи, присвячені успадкуванню динаміки, є дещо складними для розуміння і не дуже корисними. Оновлена версія цієї класичної книги, що включає семантику ходів та уроки, отримані з STL, була б дуже доречною.