Този въпрос се опитва да събере няколкото бисера сред десетките лоши книги за C++, които се публикуват всяка година.
За разлика от много други езици за програмиране, които често се усвояват в движение от учебници, намерени в интернет, малцина са в състояние бързо да усвоят C++, без да са изучили добре написана книга за C++. Той е твърде голям и сложен, за да се направи това. Всъщност той е толкова голям и сложен, че има много много лоши книги за C++. И тук не става дума за лош стил, а за неща като ярко очевидни фактически грешки и пропагандиране на ужасно лоши стилове на програмиране.
Моля, редактирайте приетия отговор, за да посочите качествените книги и приблизително ниво на уменията - за предпочитане след като обсъдите допълнението си в чат за C++. (Редовните потребители могат безмилостно да отменят работата ви, ако не са съгласни с препоръката.) Добавете кратка информация/описание за всяка книга, която лично сте прочели/от която сте извлекли полза. Чувствайте се свободни да обсъждате качеството, заглавията и т.н. Книгите, които отговарят на критериите, ще бъдат добавени към списъка. Книгите, които имат рецензии от Асоциацията на потребителите на C и C++ (ACCU), имат връзки към рецензията.
*Забележка: Често задавани въпроси и други ресурси могат да бъдат намерени в C++ tag info и под [tag:c++-faq].
A Tour of C++ (Bjarne Stroustrup) (2-ро издание за C++17) "Обиколката" представлява бърз (около 180 страници и 14 глави) учебен преглед на целия стандартен C++ (език и стандартна библиотека, и използване на C++11) на умерено високо ниво за хора, които вече знаят C++ или поне са опитни програмисти. Тази книга е разширена версия на материала, който съставлява глави 2-5 от The C++ Programming Language, 4-то издание.
Accelerated C++ (Андрю Кьониг и Барбара Му, 1-во издание - 24 август 2000 г.) В общи линии тя покрива същата тема като C++ Primer, но го прави на една четвърт от нейното пространство. Това до голяма степен се дължи на факта, че тя не се опитва да бъде въведение в програмирането, а въведение в C++ за хора, които'преди това са програмирали на някакъв друг език. Тя има по-стръмна крива на обучение, но за тези, които могат да се справят с това, тя е много компактно въведение в езика. (Исторически погледнато, това е първата книга за начинаещи, в която се използва модерен подход към преподаването на езика). Въпреки това, C++ в нея се преподава единствено на C++98. [Преглед]
Effective C++ (Скот Майерс, трето издание - 22 май 2005 г.) Тази книга беше написана с цел да бъде най-добрата втора книга, която програмистите на C++ трябва да прочетат, и тя успя. Предишните издания бяха насочени към програмисти, идващи от C, а третото издание променя това и е насочено към програмисти, идващи от езици като Java. В нея са представени ~50 лесни за запомняне правила, заедно с тяхната обосновка, в много достъпен (и приятен) стил. За C++11 и C++14 примерите и няколко въпроса са остарели и Effective Modern 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) в допълнение към задълбоченото покриване на различни други теми, включително идиома pimpl, търсенето на имена, добрия дизайн на класовете и модела на паметта на C++. [Преглед]
More Exceptional C++ (Herb Sutter) Обхваща допълнителни теми за безопасност на изключенията, които не са разгледани в Exceptional C++, в допълнение към обсъждането на ефективното обектно-ориентирано програмиране в C++ и правилното използване на STL. [Преглед]
Exceptional C++ Style (Herb Sutter) Обсъжда се общо програмиране, оптимизация и управление на ресурсите; тази книга съдържа и отлично изложение на това как да се пише модулен код в C++ чрез използване на нечленуващи функции и принципа на една отговорност. [[Преглед]] (http://accu.org/index.php?module=bookreviews&func=search&rid=107)
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. [Преглед]
Modern C++ Design (Andrei Alexandrescu) Новаторска книга за усъвършенствани техники за генерично програмиране. Въвежда дизайн, базиран на политики, списъци с типове и фундаментални идиоми за генерично програмиране, след което обяснява как много полезни шаблони за проектиране (включително разпределители на малки обекти, функтори, фабрики, посетители и мултиметоди) могат да бъдат реализирани ефективно, модулно и чисто с помощта на генерично програмиране. [Преглед]
C++ Template Metaprogramming (David Abrahams and Aleksey Gurtovoy)
C++ Concurrency In Action (Anthony Williams) Книга, обхващаща поддръжката на C++11 за едновременност, включително библиотеката за нишки, библиотеката atomics, модела на паметта на C++, ключалките и mutexes, както и въпроси, свързани с проектирането и отстраняването на грешки в многонишкови приложения. Вече е публикувано второ издание, което обхваща C++14 и C++17.
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. [Review]
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.
Обзор на новия C++ (C++11/14) (само PDF) (Scott Meyers) (актуализиран за C++14) Това са презентационни материали (слайдове и някои записки от лекции) от тридневен курс за обучение, предлаган от Scott Meyers, който'е високоуважаван автор на C++. Въпреки че списъкът с елементи е кратък, качеството им е високо.
C++ Core Guidelines (C++11/14/17/...) (под редакцията на Bjarne Stroustrup и Herb Sutter) е развиващ се онлайн документ, състоящ се от набор от насоки за добро използване на съвременния C++. Насоките са фокусирани върху въпроси от относително по-високо ниво, като интерфейси, управление на ресурсите, управление на паметта и паралелност, засягащи архитектурата на приложенията и дизайна на библиотеките. Проектът е обявен на CppCon'15 от Bjarne Stroustrup и други и приветства приноса на общността. Повечето насоки са допълнени с обосновка и примери, както и с обсъждания на възможна поддръжка на инструменти. Много от правилата са разработени специално, за да могат да се проверяват автоматично от инструменти за статичен анализ.
The C++ Super-FAQ (Marshall Cline, Bjarne Stroustrup and others) е опит на Standard C++ Foundation да обедини често задаваните въпроси и отговори за C++, поддържани преди това поотделно от Marshall Cline и Bjarne Stroustrup, като включва и нови приноси. Статиите разглеждат предимно въпроси на средно ниво и често са написани с хумористичен тон. Възможно е все още не всички елементи да са напълно актуални с последното издание на стандарта C++.
Забележка: Част от информацията, съдържаща се в тези книги, може да не е актуална или вече да не се счита за най-добра практика.
The Design and Evolution of C++ (Bjarne Stroustrup) Ако искате да знаете защо езикът е такъв, какъвто е, тази книга е мястото, където ще намерите отговорите. Тя обхваща всичко преди стандартизацията на C++.
Ruminations on C++ - (Andrew Koenig and Barbara Moo) [Review]
Advanced C++ Programming Styles and Idioms (James Coplien) Предшественик на движението за шаблони, в него са описани много специфични за C++ "идиоми". Със сигурност'е много добра книга и може би все още си заслужава да се прочете, ако можете да отделите време, но е доста стара и не е в крак с актуалния C++.
Large Scale C++ Software Design (John Lakos) Lakos обяснява техники за управление на много големи софтуерни проекти на C++. Със сигурност е добро четиво, ако само беше актуално. Написана е много преди C++ 98 и пропуска много функции (напр. пространства от имена), важни за мащабните проекти. Ако ви се налага да работите в голям софтуерен проект на C++, може би ще искате да я прочетете, въпреки че трябва да я приемате с повече от зрънце сол. Първият том на новото издание е очаква се през 2019 г..
Inside the C++ Object Model (Стенли Липман) Ако искате да знаете как обикновено се реализират виртуалните членски функции и как обикновено се разполагат базовите обекти в паметта при сценарий с многократно наследяване и как всичко това влияе на производителността, тук ще намерите задълбочени дискусии по тези теми.
The Annotated C++ Reference Manual (Bjarne Stroustrup, Margaret A. Ellis) Тази книга е доста остаряла поради факта, че изследва версията C++ 2.0 от 1989 г. - все още не са въведени шаблони, изключения, пространства от имена и нови кастове. Въпреки това тази книга разглежда целия тогавашен стандарт C++, като обяснява обосновката, възможните имплементации и характеристиките на езика. Това не е книга за изучаване на принципите и шаблоните за програмиране на C++, а за разбиране на всеки аспект на езика C++.
Thinking in C++ (Bruce Eckel, 2-ро издание, 2000 г.). Два тома; представлява безплатен набор от книги в стил учебник за начално ниво. Изтегляне: том 1, том 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, би била много добра.