Обзоры книг по C++
Учебная литература. Часть I

Харви Дейтел, Пол Дейтел. Как программировать на C++

1456 страниц. Бином, 2008

Harvey Deitel, Paul Deitel. C++: How to Program. Prentice Hall, 2005

Авторы также выпускают книги по языкам C и C♯‎. Книга вполне подойдёт для новичков, но с оговорками. По году публикации понятно, что что-то новее стандарта C++03 искать не нужно. Однако первая же программа, «Hello, world», использует заголовочный файл <iostream.h> ещё из достандартного C++, cout из глобального пространства имён и пропускает тип возвращаемого значения функции main() (просто main() вместо int main()).

// Первая программа на C++
#include <iostream.h>
 
main()
{
    cout << "Добро пожаловать в C++\n";
 
    return 0;   //показывает, что программа успешно окончена
}

Спецификация исключений (глава 13.11) в стандарте C++11 изменилась очень сильно. Может, до появления первого стандарта и писали 0 вместо NULL (глава 15), но у такого варианта есть недостаток. И даже NULL в том же C++11 сменил nullptr.

Книга усыпана советами и замечаниями «по технике программирования» (они занимают целые страницы), но часть из них тоже устарели:

«Типичная ошибка программирования 1.2. Забывают включить файл iostream.h в программу, которая вводит данные с клавиатуры или выводит данные на экран».

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

В книге много классических примеров и упражнений (хотя «упражнения для самопроверки», где нужно вписать ответы на место пропусков, немного раздражают). Скорее всего, это касается только русского перевода, одинарные кавычки '\0' почему-то набраны неверно: ’\0’. Перед несколькими последними темами авторы прерывают свой рассказ о языке и показывают, как можно — хоть и не идеально — реализовать некоторые структуры данных: списки, стеки, очереди и деревья.

Приложения: стандартная библиотека, таблица приоритета операций, набор символов ASCII и системы счисления.

Крис Джамса. Учимся программировать на языке C++

320 страниц. Мир, 1997

Kris Jamsa. Rescued by C++. Jamsa Press, 1996

Книга с более размеренным изложением, но менее полным. Обложка обещает, что «каждый урок требует только десять минут времени». В самом первом уроке бросаются в глаза Windows 95, MS-DOS и COM. Книга издана до выхода первого стандарта, что сказывается на её содержании.

В самом первом примере кода встречается то, что в стандартном C++ считается неверным: тип возвращаемого значения void у функции main().

#include <iostream.h>
 
void main(void)
 {
   cout << "Учимся программировать на языке C++!";
 }

Обратите внимание на оформление (как расставлены скобки). Стиль тоже несовременный (объявление всех переменных в начале функции). В книге много неточностей, например, директивы препроцессора, функция main() и выражения (statements) дружно названы «операторами программы».

В некоторых темах не объясняется, что например, директиву препроцессора #define CLASS_SIZE 50 нужно знать, но вместо неё в C++ нужно пользоваться константами.

В последней части под названием «Расширенные возможности C++» (кроме прочего) странно видеть работу с файлами, аргументами командной строки, полиморфизм и исключения (по понятным причинам — с описанием устаревшей спецификации исключений). Урок про ассемблерные вставки и другие больше подходят к тематике части.

Майкл Доусон. Изучаем C++ через программирование игр

352 страницы. Питер, 2016

Michael Dawson. Beginning C++ Through Game Programming. Cengage Learning, 2014

Автор также написал книгу «Программируем на Python». А у этого труда заманчивое название и введение:

«Ультрасовременные компьютерные игры не уступают голливудским блокбастерам по визуальным эффектам, саундтреку и градусу напряжения. Но игры — совершенно особый вид развлечений; хорошая игра может заставить геймера часами просиживать у монитора. Основная изюминка компьютерных игр, которая делает их столь увлекательными, — это интерактивность. Компьютерная игра — это не фильм, где вы наблюдаете за приключениями героя, побеждающего несмотря ни на что, — в игре вы сами перевоплощаетесь в героя».

Но не стоит обольщаться, все игры будут в консоли, скриншотов которой в книге с избытком.

Вместо программы «Hello, world!» здесь — «Game over!». Почти каждая глава — это одна небольшая, но цельная игра: утраченный клад, угадай число, словомеска, виселица, безумные библиотекари, крестики-нолики, крестики-нолики 2.0, тамагочи и блек-джек.

Книга лёгкая. Автор постепенно вводит понятия — от простых к сложным, показывает типичные ошибки. Рано, но к месту знакомит с STL, использует современные инструменты (к примеру, srand(static_cast<unsigned int>(time(0))), а не приведение в стиле C).

Книга почти не учит ничему плохому, кроме глобальных статических переменных (на 200 странице) и коду без отступов между функциями. К сожалению, некоторые темы рассказаны слишком поверхностно, многого там вообще не найти. К примеру, побитовые операторы (спустя какое-то время изучающий язык возьмёт OpenGL и не поймёт запись glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);), шаблоны, исключения, умные указатели...

Приложения: создание первой программы (скриншоты из Visual Studio), приоритет операторов, ключевые слова, таблица символов ASCII, управляющие последовательности.

Стефан Рэнди Дэвис. C++ для «чайников»

336 страниц. Вильямс, 2018

Stephen Randy Davis. C++ for Dummies. IDG Books Worldwide, 2000

Автор также написал «C для чайников» (с забавными задачами) и «C♯ для чайников». Остаётся надеяться, что книги «„Watch You Bleed“: Сага о Guns N’ Roses», «Молот богов. Сага о Led Zeppelin» и другие написал его тёзка.

Многого от книги ждать не нужно. Все обычные темы, приправленные весёленькими фразами («Премудрости объявления переменных», «Защищённые члены класса: не беспокоить!»). Об STL и не думайте, тем более о современном взгляде на C++.

В приложении — словарь терминов.

Роджерс Кейденхед, Джесс Либерти. C++ за 24 часа

448 страниц. Диалектика, 2019

Rogers Cadenhead, Jesse Liberty. Teach Yourself C++ in 24 Hours. Sams, 2011

Один из авторов, Роджерс Кейденхед, также написал книги «Java за 24 часа» и «Absolute Beginner’s Guide to Minecraft Mods Programming».

Совершенно обычная книга, если не обращать внимания на слова «занятие» и «коллоквиум». Книга переиздаётся, меняет соавторов, но структура почти не меняется. Подойдёт для новичков, но даже поверхностного представления о современном C++ не даст, несмотря на надпись «C++14» на обложке.

Приложения: двоичные и шестнадцатеричные числа, словарь терминов, веб-сайт книги, работа с компилятором MinGW C++.

Роберт Лафоре. Объектно-ориентированное программирование в C++

928 страниц. Питер, 2018

Robert W. Lafore. Object-Oriented Programming in C++. Sams, 2001

Книга известная, регулярно переиздаётся, но вообще она довольно старая. Точно не для полных новичков: уже первые страницы усыпаны словами ООП и UML (к последнему автор возвращается в главах о перегрузке, наследовании, указателях, виртуальных функциях, шаблонах и исключениях, разработке объектно-ориентированного ПО).

После основ, циклов, ветвлений, структур, функций, классов, массивов, перегрузки и наследования в 10 главе наконец появляются указатели. Оттягивали до последнего. Сортировку методом пузырька именно здесь неожиданно видеть, как и оператор new (прошла половина книги). А вот классы для строк и связных списков вполне к месту.

Виртуальные функции, дружественные функции, статические функции — собраны в одной главе и почему-то под общим названием «Виртуальные функции». За ними наконец-то следуют потоки и файлы.

К автору вообще много вопросов по структуре книги. В главу «Многофайловые программы» вклинились (понятно) заголовочные файлы, пространства имён, (совершенно непредсказуемо) проектирование класса сверхбольших чисел и моделирование лифта.

Шаблоны и исключения тоже попали в одну главу, хотя никакой связи между ними нет. Завершают книгу главы про STL и разработку объектно-ориентированного ПО.

Отдельно посмотрим на последнюю главу, ведь ООП особо отмечено в названии книги. Сперва ждёт рассказ о водопаде (каскадном процессе разработки), переходящий в прицельный рассказ о языке UML: варианты использования, акторы, сценарии, преобразование картинок в код. С раздела «Предметная область» начинается проектирование программы для ведения дел взамен «старомодного гроссбуха»: список жильцов, доходы от аренды, расходы, годовой отчёт. Всё описано подробно, со всеми нужными картинками. Методика описана в деталях.

И как раз на эту главу пришёлся разгул самодеятельности переводчика. Beverly превратилась в Степана Маркеловича Печкина («племянник знаменитого почтальона Игоря Ивановича Печкина из деревни Простоквашино Вознесенского района Московской области»), появились некие Василий и Василиса и ПетроЭлектроСбыт. Harry Ellis, — кот Матроскин, Wanda Brown — пёс Шарик, Peter Quan — дядя Фёдор, Bill Vasquez — корова Мурка, Jane Garth — птица Говорун (?!).

Досталось и организациям: Bob’s Hardware, Big Electric Co — ПростоквашиноЭлектроСбыт, First MegaBank — УльтраМегаБанк, City Water — ПростоВодоканал, Steady State — СуперСтрах, P. G. & E. — ПЭС, Sam’s Hardware — «Хлам дяди Сэма», Ernie Glotz — «Подвал Мастерз», First MegaBank — УльтраМегаБанк.

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

int j;
for ( j=0 ; j<15 ; j++)

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

Приложения: таблица ASCII, таблица приоритетов операций, Microsoft Visual C++, Borland C++ Builder, упрощённый вариант консольной графики, алгоритмы и методы STL, ответы и решения (в конце каждый главы есть вопросы с прочерками, которые нужно заполнить), библиография.

Регулярно переиздаётся и книга «Структуры данных и алгоритмы на Java» того же автора (оригинал 2003 года). Много лет автор трудился над книгами по C, C++ и алгоритмам (по всей видимости, русских переводов нет): Microsoft C: Programming for the IBM (1987), Turbo C Programming for the PC (1988), C Programming Using Turbo C++ (1993), C++ Interactive Course (1996), Teach Yourself Data Structures and Algorithms in 24 Hours (1999).

Джесс Либерти и др. C++. Энциклопедия пользователя

590 страниц. ДиаСофт, 2001

Jesse Liberty. C++ Unleashed. Sams, 1998

У книги внушительный список авторов: Вишваджит Аклеча, Стив Хайнс, Стивен Митчел, Александр Николов, Чарльз Пейс, Дональд Кси, Стив Загибойло, Майкл Тоблер, Джесс Либерти, Мехрей Чаккар.

Ещё одно издание не для новичков, хотя и весьма добротное. Систематического описания языка как такового нет. Рассмотрим все главы, хоть и очень кратко, поскольку содержание у книги не совсем типичное. Тем не менее, эта книга не оказалась в разделе профессиональной литературы, потому что каких-то слишком сложных вещей из языка она не использует.

Часть I посвящена ООП в общем. В 1 главе много слов про UML (книгу открывают виды отношений между объектами), и нет ни одной строки кода.

Во 2 главе о проектировании классов в первом же листинге встречается доисторический (достандартный) артефакт: BOOL. Всё-таки год издания оригинала (1998) даёт о себе знать. Авторы используют венгерскую нотацию, что в наше время благодаря IDE потеряло актуальность: char *m_szBalance означает поле класса типа строки с завершающим нулевым символом (боюсь, что до C++98 никакого std::string ещё и не было).

Некоторые формулировки здесь и далее потребуют некоторых усилий от читателей:

«Служебный класс представляет собой класс, в котором содержатся сгруппированные функциональные средства, но в то же время отсутствуют постоянные данные-члены (атрибуты)».

Глава объясняет, как диаграммы (классов, взаимодействий, состояний, активности) прекращаются в код. Читателям подробно рассказывают про ассоциацию (1, 0..1, 0..*, 1..*, *, M..N), агрегацию, обобщение (наследование) и другие вещи.

В главе 3 «Наследование, полиморфизм и повторное использование программного кода» в качестве примера иерархии наследования авторы приводят классы MFC (Microsoft Foundation Classes), во многом устаревшие и ограниченные Windows. А основная цель главы — разработать односвязный список. И тут вызывает вопросы иерархия наследования узлов: от класса Node наследуются классы LinkedList, InternalNode и TailNode. На первый взгляд выглядит как проектирование ради проектирования. А в остальном глава представляет собой хорошее описание темы. Правда, нашёлся ещё один доисторический феномен — #include <iostream.h>.

У II части туманное название — «Вопросы реализации». В 4 главе авторы обстоятельно рассказывают об указателях и постепенно подводят к идее умных указателей («автоуказателей») auto_ptr, к нашему времени безнадёжно устаревшему (из-за ряда проблем с ними), разрабатывают класс строки с подсчётом ссылок на основе собственного умного указателя.

Глава 5 «Использование каркасов приложений» (по-современному — фреймворков) уже прицельно рассказывает об MFC: как создать многопоточное приложение, работать с документами и окнами. В тексте есть любопытное замечания о том, что некоторые вещи могут работать иначе в Windows 95. Седая древность.

Главы 6 и 7 очень адекватно описывают контейнеры, итераторы и алгоритмы STL, но только до C++98 (в C++11 появились новые интересные вещи). 8 глава о пространствах имён тоже очень хорошая.

9 глава «Манипулирование типами объектов» рассказывает про RTTI, dynamic_cast и до кучи — static_cast и reinterpret_cast. А в 10 главе примерно то же самое, а ещё встроенные функции и временные объекты под соусом производительности. Последнее уже устарело с выходом C++11 и его семантики перемещения.

III часть учит алгоритмам. С 11 по 14 главу читатели узнают про рекурсию и рекурсивные структуры данных, некоторые методы сортировки, алгоритмы поиска, хеширование и синтаксический анализ.

IV часть удивляет своим названием — «Живучесть объектов и шифрование». Главы с 15 по 18 сперва рассказывают про теорию хранения объектов на диске (B-деревья) и прозрачность их размещения, а потом — немного теории и практики работы с реляционными базами данных. Туда вошло описание технологий «поставки» данных (как ODBC), работа с базой данных в MFC.

На фоне остальных глав этого раздела 19 глава сильно выделяется. Но изложение основ криптографии довольно поверхностное, в чём авторы честно признаются.

Часть V «Распределённые вычисления» про технологию CORBA (Common Object Request Broker Architecture) для разработки распределённых приложений и технологию COM (Component Object Model, технология сильно привязана к Windows; на её основе, например, сделана DirectX) для создания программ на основе взаимодействующих компонентов, которые могут использоваться в нескольких программах одновременно.

22 глава сравнивает языки Java и C++. Интересно было бы почитать сравнение с современным C++.

Джесс Либерти, Брэдли Джонс. Освой самостоятельно C++ за 21 день

768 страниц. Вильямс, 2010

Jesse Liberty, Bradley L. Jones. Teach Yourself C++ in 21 Days. Sams, 2004

Если не изменяет память, это была первая большая книга по C++, которую я брал в руки. Толстая синяя книга.

Книга разбита на недели, недели — на дни. Во многом перекликается с книгой Роджерса Кейденхеда и Джесса Либерти «C++ за 24 часа».

Код оформлен неаккуратно. Основные темы изложены, но STL почти не уделяется времени. Понятно, что C++ просто невозможно объяснять линейно, то есть к каким-то темам придётся возвращаться, но, к примеру, в главе «Дополнительные возможности использования функции» свалено всё: перегрузка функций (в классах), аргументы по умолчанию, конструкторы, перегрузка операторов, указатель this, снова перегрузка. Классы были четыре главы назад, и между этими главами успели вклиниться циклы (заметим, после классов), указатели и ссылки.

Немного места уделено объектно-ориентированному проектированию, сравнению с языком Java в разрезе множественного наследования и интерфейсов. В книге нашлось место самописному классу для связного списка. Есть пара вопросов к переводу: «лист» (список), «конструктор-копировщик» (конструктор копирования).

Приложения: приоритеты операторов, ключевые слова C++, двоичные и шестнадцатеричные числа, ответы.

3 января
Книги Бьерна Страуструпа
Обзоры книг по C++