272 страницы. Бином, 2001
Allen I. Holub. Enough Rope to Shoot Yourself in the Foot. Rules for C and C++ Programming. McGraw–Hill, 1995
Сборник советов от программиста, консультанта и преподавателя — сначала на общие темы, затем по языку C и, наконец, языку C++. Несмотря на возраст, книгу трудно назвать устаревшей.
Содержание: процесс проектирования, общие проблемы разработки программ, форматирование и документация, имена и идентификаторы, правила программирования, препроцессор, правила, относящиеся к языку C, правила программирования на C++ (проектирование и реализация, проблемы сцепления, ссылки; конструкторы, деструкторы и operator=(); виртуальные функции, перегрузка, управление памятью, шаблоны, исключения).
Высказывание «C позволяет очень просто выстрелить себе в ногу. На C++ сделать это сложнее, но если получится, оторвёт всю ногу» (C makes it easy to shoot yourself in the foot; C++ makes it harder but when you do, it blows away your whole leg) приписывают Бьерну Страуструпу.
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.
Книга усыпана советами и замечаниями «по технике программирования» (они занимают целые страницы), но часть из них тоже устарели:
Авторы не следуют обычным рекомендациям из многих современных гайдлайнов: не инициализируют переменные, не оборачивают блоки в фигурные скобки, местами не делают отступы и используют магические числа.
В книге много классических примеров и упражнений (хотя «упражнения для самопроверки», где нужно вписать ответы на место пропусков, немного раздражают). Скорее всего, это касается только русского перевода, одинарные кавычки '\0' почему-то набраны неверно: ’\0’. Перед несколькими последними темами авторы прерывают свой рассказ о языке и показывают, как можно — хоть и не идеально — реализовать некоторые структуры данных: списки, стеки, очереди и деревья.
Приложения: стандартная библиотека, таблица приоритета операций, набор символов ASCII и системы счисления.
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++» (кроме прочего) странно видеть работу с файлами, аргументами командной строки, полиморфизм и исключения (по понятным причинам — с описанием устаревшей спецификации исключений). Урок про ассемблерные вставки и другие уроки больше подходят к тематике части.
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, управляющие последовательности.
336 страниц. Вильямс, 2018
Stephen Randy Davis. C++ for Dummies. IDG Books Worldwide, 2000
Автор (или кто-то другой под тем же именем) также написал «C для чайников» (с забавными задачами) и «C♯ для чайников». Остаётся надеяться, что книги «„Watch You Bleed“: Сага о Guns N’ Roses», «Молот богов. Сага о Led Zeppelin» и другие написал его тёзка.
Многого от книги ждать не нужно. Все обычные темы, приправленные весёленькими фразами («Премудрости объявления переменных», «Защищённые члены класса: не беспокоить!»). Об STL и не думайте, тем более о современном взгляде на C++.
В приложении — словарь терминов.
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++.
336 страниц. БХВ, 2023
Yashavant Kanetkar. Let Us C++. BPB Publications, 2021
Добавлено 27 июля 2023
Яшавант Канеткар — автор книг и видеокурсов уже «два с половиной десятилетия», обладатель награды «Выдающийся выпускник» Индийского технологического института Канпур и двух наград от корпорации Microsoft.
Оглавление:
Содержание главы «Расширенные возможности C++»:
Видно, что глава бессистемная. И не такие уж это и «расширенные возможности». Может, RTTI не та вещь, которой нужно без лишней необходимости пользоваться, и указатели на члены классов не каждый день встречаются, но остальное — это обычное дело.
Книга для начинающих программистов, поэтому в конце глав есть тесты и контрольные вопросы.
Во «Введении в ООП» автор рассказывает о шаблонном классе Stack.
В главе «Переходим на C++», помимо прочего, — рассказ про «пустой» (нетипизированный) указатель (void).
void *p ;
char *s ;
p = s ;
s = p ;
У C++ более строгая типизация, в примере присваивание s = p приводит к ошибке, которую предлагается исправить так:
s = ( char * ) p ;
Но скоро автор пишет:
«Любая программа на языке C также является корректной программой на C++».
Что, конечно же, не так. C++ не является надмножеством C.
Посмотрим на фрагмент кода из главы о наследовании (далее на базе класса Stack пишут производный класс):
#include <iostream>
using namespace std ;
const int MAX = 10 ;
class Stack // базовый класс
{
protected :
int arr[ MAX ] ;int top ;
public :
Stack( )
{
top = -1 ;
}
void push ( int num )
{
top++ ;
arr[ top ] = num ;
}
int pop( )
{
int num ;
num = arr[ top ] ;
top-- ;
return ( num ) ;
}
};
Надеюсь, вы тоже отметили стиль кодирования. Совершенно беспорядочный.
Приятно видеть, что в книге написано, как работать с Юникодом на примере деванагари и кириллицы.
Резюме. В повествовании нет логики. Код совершенно неряшливый. Многого из того, что было бы полезно начинающим, в книге нет.
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).
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++.
768 страниц. Вильямс, 2010
Jesse Liberty, Bradley L. Jones. Teach Yourself C++ in 21 Days. Sams, 2004
Если не изменяет память, это была первая большая книга по C++, которую я брал в руки. Толстая синяя книга.
Книга разбита на недели, недели — на дни. Во многом перекликается с книгой Роджерса Кейденхеда и Джесса Либерти «C++ за 24 часа».
Код оформлен неаккуратно. Основные темы изложены, но STL почти не уделяется времени. Понятно, что C++ просто невозможно объяснять линейно, то есть к каким-то темам придётся возвращаться, но, к примеру, в главе «Дополнительные возможности использования функции» свалено всё: перегрузка функций (в классах), аргументы по умолчанию, конструкторы, перегрузка операторов, указатель this, снова перегрузка. Классы были четыре главы назад, и между этими главами успели вклиниться циклы (заметим, после классов), указатели и ссылки.
Немного места уделено объектно-ориентированному проектированию, сравнению с языком Java в разрезе множественного наследования и интерфейсов. В книге нашлось место самописному классу для связного списка. Есть пара вопросов к переводу: «лист» (список), «конструктор-копировщик» (конструктор копирования).
Приложения: приоритеты операторов, ключевые слова C++, двоичные и шестнадцатеричные числа, ответы.