Литература по С++

Стивен Прата. Язык программирования C++ (C++11). Лекции и упражнения Стивен Прата. Язык программирования C++ (C++11). Лекции и упражнения, 6-е издание — М.: Вильямс, 2012. — 1248 с.

Когда я учился такой книги, к сожалению, не было. Книга толстая, но читать ее интересно. Автор не является членом комитета стандартизации языка, а преподает в ВУЗе, поэтому написал не справочник, а учебник. Это лучший учебник по С++, который я видел. Прата собрал весь свой педагогический опыт и сделал упор именно на те аспекты, с которыми у студентов возникают проблемы (как ни странно, но у моих студентов те же самые проблемы, поэтому я рекомендую им эту книгу). Книга новая и в ней описывается новый стандарт. Специально под фичи С++11 выделено всего 50 страниц, но по ходу всей книги делаются небольшие отступления на эту тему.

Б. Страуструп Язык программирования С++ Б. Страуструп Язык программирования С++. Специальное издание. Пер. с англ. — М.: Издательство Бином, 2011 г. — 1136 с.

Хорошая книга от автора языка. Текст книги сухой, хотя в ней есть примеры, советы по поводу «хорошего кода» и даже упражнения. Лично я, использую ее в качестве справочника — как учебник книга вряд ли может сравниться с произведением Прата.

Рецензия от другого, уважаемого мной программиста:

Бьерн Страуструп — это удивительный человек, сочетающий в себе несочетаемые вещи. Во-первых, это человек, придумавший один из самых гениальных языков современности. Во-вторых, это человек, дающий ужасающие рекомендации по программированию на собственном языке.

Если вы уже успели потратить свои деньги на приобретение этой книги, то будьте бдительны. Отнеситесь к ней как к справочнику возможностей языка C++ и не воспринимайте близко к сердцу советы, которые дает автор книги (за исключением банальных типа инкапсуляции данных).

У меня сложилось впечатление, что книга писалась в жутко укуренном состоянии. Совершенно никакой последовательности мысли. Напоминает письмо дяди Федора из Простоквашино. Читается тяжело и муторно, насквозь пронизана бессмысленными и никому не нужными лирическими отступлениями.

Когда я впервые читал эту книгу в русскоязычном издании, я долго не мог понять, какому идиоту пришло в голову сверстать исходники наклонным, и главное, не моноширинным шрифтом. Когда я узнал, что предпочтения относительно шрифта исходили от самого автора, мне вообще поплохело.

Диагноз
Данная книга категорически противопоказана неокрепшим умам. Если ее и стоит читать, то только тогда, когда вы научитесь безошибочно отделять плохие рекомендации от хороших. Чтение этой книги с целью получения новых знаний похоже на добычу золота из морской воды.

978-5-94074-990-5_270_369_5_80 Мейерс С. Эффективное использование С++. 35 новых рекомендаций по улучшению ваших программ и проектов. — М.: ДМК Пресс, 2014. — 294с.
meiers-effektivnoe-ispolzovanie-c-55-vernyh Мейерс С. Эффективное использование С++. 55 верных способов улучшить структуру и код ваших программ. — М.: ДМК Пресс, 2006. — 300с.

Две книги Скотта Мейерса для углубленного изучения С++. Выполнены в виде сборников правил типа: «Никогда не вызывайте виртуальные функции в конструкторе или деструкторе». Правила касаются понимания концепций объектно-ориентированного программирования, вопросов управления памятью, обработки ошибок и эффективности кода. К правилами прилагается исчерпывающее объяснение. В очень небольшой части материал книг пересекается, но в целом, они дополняют друг друга. Начать изучение стоит с книги «35 рекомендаций» — она попроще.

Андрей Александреску. Современное проектирование на C++. Андрей Александреску. Современное проектирование на C++. Обобщенное программирование и прикладные шаблоны проектирования. Перевод с английского — Издательский дом «Вильямс», 2002 г. 336 с.

Отзыв от уважаемого мной программиста:

Если вы будете читать эту книгу впервые, то сначала у вас закипит мозг, после чего вы свалитесь со стула, а после того, как придете в себя, первой вашей мыслью будет фраза «Них#я себе, что можно на C++ вытворять!».

Это одна из тех редких книг, которую нужно прочесть всем, кто желает стать настоящим профессионалом своего дела.

Книга рассказывает об основных паттернах проектирования с упором на их реализацию. Особый восторг вызывают фирменные метапрограммные рецепты господина Александреску.

Единственным, но в то же время практически незаметным недостатком, я считаю несколько недостаточное внимание, уделенное разделению предлагаемых подходов на хорошие и плохие. Однако, если ваш мозг будет в состоянии понять, о чем же именно рассказывает эта книга, то такое разделение вы сможете сделать самостоятельно без особого труда.

Герб Саттер, Андрей Александреску. Стандарты программирования на C++. 101 правило и рекомендация. Герб Саттер, Андрей Александреску. Стандарты программирования на C++. 101 правило и рекомендация. Перевод с английского — Издательский дом «Вильямс», 2005 г. 224 с.

Отзыв от уважаемого мной программиста:

На мой взгляд это одна из лучших книг (если не самая лучшая) из серии «C++ In-Depth». Коротко, просто и по делу. Ничего лишнего, ни одной плохой рекомендации. Создается ощущение, что читаешь некий доклад о том как нужно программировать, основанный на опыте всех программистов, полученном с момента создания языка C++, из которого тщательным образом было отобрано только самое лучшее и выкинута вся муть, которую выдумывают современные воспаленные мозги.

Остается добавить, что само название, «101 правило и рекомендация», это не просто бойкое маркетинговое название, выдуманное молодым маркетологом-энтузиастом. Книга действительно представляет собой сто одну коротенькую рекомендацию по программированию.

Если вы еще не успели прочитать эту книгу, то я рекомендую вам сделать это без отлагательств — результат превзойдет все ваши ожидания.

Элджер Дж. C++. Библиотека программиста: Пер. с англ. — СПб.: Питер, 2000. — 320 с. Элджер Дж. C++. Библиотека программиста: Пер. с англ. — СПб.: Питер, 2000. — 320 с.

Краткое содержание книги прекрасно описано в первой главе, не буду дублировать, перечислю лишь то, что привлекло внимание.

Первая часть посвящена языку С++, ее можно рассматривать как очень краткое, но глубокое введение в язык.
— во второй главе приведено очень поверхностное изложение тонкостей С++, а также множество коварных фрагментов кода, на которых можно проверить знаете ли вы язык в достаточном объеме чтобы читать дальше или нет.
— третья глава посвящена шаблонам (templates). Если вы до этого не сталкивались с ними — то по приведенному материалу сможете разобраться. Все, что там описано работает, но стоит учитывать, что книга писалась в 90х годах, сейчас возможности шаблонов гораздо шире.
— глава 4 посвящена обработке исключений, написана в том же стиле, что и третья. Можно использовать как полноценный учебник.

Во второй части книги рассказывается про умные указатели и итераторы. Очень подробно, про всякие разные. Поразительно, что по этой теме написано так много… Например, про умные указатели писал в своих книгах Майерс, но совсем с другой стороны. Наиболее понравилась глава 7 про «грани и другие мудрые указатели» и глава 9 «транзакции и гениальные указатели».

В части 3 речь идет о двойной диспетчеризации, производящих функциях и, опять же, умных (на этот раз «невидимых») указателях. Материал местами отдает академизмом, но все равно интересно.

В четвертой части речь идет о памяти — перегрузке операторов new и delete, при этом описывается несколько алгоритмов, которые могут улучшить работу с памятью в ваших программах, в том числе уплотнения памяти и сборки мусора. Мое личное мнение — все это интересно, но реализовать качественно эти алгоритмы слишком сложно и не совсем очевидны случаи когда стоит это делать. Так, например, недавно я публиковал аннотацию на доклад по похожей теме: https://vk.com/wall-105242702_701, в котором нечто подобное (не все) реализовано в malloc. Вероятно, в тех редких случаях, когда вас не устраивает стандартный malloc — можно использовать другую реализацию.

Резюме: книга интересная. Первая глава однозначно имеет практическую направленность. Остальная часть книги интересна, полезна для кругозора и местами на практике (например раздел по двойной диспетчеризации).

Аммерааль, Леен STL для программистов на C++; М.: ДМК — Москва, 2014. — 239 c.
Мейерс, С. Эффективное использование STL. Библиотека программиста / С. Мейерс. СПб.: Питер, 2002. — 224 с.

Многие ребята, занимающиеся промышленной разработкой на С++ сообщили мне, что не читали эти книги, но хотели бы (времени нет). Нужно ли вам читать их или вы уже знаете STL? — выяснить это можно с помощью простого теста про sdt::vector из семи вопросов (тест касается мизерной и самой простой части содержимого книг). Судя по текущей статистике, эти книжки будут очень полезны всем.

Книга Аммерааля, откровенного говоря, очень скучная, почти как справочник. Читать ее стоит по диагонали, однако, я выбрал для вас наиболее интересные (с моей точки зрения) моменты:
1. Из первой главы можно узнать зачем вообще нужны итераторы и как их не стоит использовать. Хорошо написано про категории итераторов. Если вы не знаете что такое Erase–remove idiom — то эту главу точно нужно просмотреть. Тут же можно прочитать про ряд полезных алгоритмов: sort, find, copy, merge, replace_reverse, find_if, remove_if — однако эта часть очень скучна, хотя, полезно знать что такие алгоритмы вообще существуют (ну чтобы не писать велосипеды).

2. Во второй главе описаны ассоциативные контейнеры и ряд алгоритмов. Если вы не знаете что такое set/map — то можно почитать. В третьей главе подробно описываются vector (и vector<bool>), list и deque, стоит заглянуть если вы не знаете как может быть реализован deque внутри (тут перекликается с одним из советов Маерса — не использовать deque вместо вектора без особой необходимости, хоть он и эффективнее). Если вы не используете в своей работе операции splice, remove и merge для std::list — то также почитайте.

3. Вы слышали про set_intersection/set_union? — если нет, посмотрите примеры к четвертой главе (из них все понятно, текст читать не стоит). Если не знаете что такое адаптеры контейнеров (stack, queue, priority_queue) — загляните в пятую главу. Из полезного в шестой главе — адаптеры итераторов (inserter) и std::transform (незаслуженно забытый студентами).

4. В седьмой главе описаны алгоритмы, опять же как в справочнике, но с хорошими примерами. Нет смысла всех их перечислять, но заглянуть туда стоит если вы не слышали про: adjacent_find, mismatch, copy (им можно хитро пользоваться, а также есть copy_backward), generate, random_shuffle, partition (и stable_partition). А знали ли вы, что STL есть генератор перестановок, операции с пирамидами, а также ряд операций, позволяющих работать с массивами (отсортированными) как со множествами? — знать детали всех этих функций не обязательно (для этого есть справочник), а вот знать что такое вообще существует — нужно.

Что касается второй книги (Мейерса) — то в ней традиционно (для этого автора) материал упорядочен в виде советов. Читается она интересно и увлекательно (местами даже может оказаться удивительно). Перечислять что из нее можно узнать смысла нет, т.к. лучше просмотреть список советов и читать лишь те, что вам интересны (я бы на всякий случай просмотрел все).

Итог: эти две книги не являются учебниками по STL, чтобы научиться им пользоваться — надо ставить задачу и писать код. Книги же помогут вам набить меньше шишек. Читать лучше сначала Аммерааля, а потом уже Мейерса, т.к., несмотря на то, что вторую книгу читать проще, ориентирована она на людей, уже знакомых с STL — упор в ней больше делается на тонкости.