1120 страниц. Вильямс, 2014
Stanley B. Lippman, Josée Lajoie, Barbara E. Moo. C++ Primer. Addison-Wesley, 2013
Стенли Липпман и Барбара Му приложили руку к созданию первых версий компилятора C++ Cfront в 1980-х (как пишет Бьерн Страуструп в книге «Дизайн и эволюция C++», глава 3.3.4).
В книге четыре части: основы, библиотека, инструменты для разработчиков классов (копирование, перегрузка, ООП, шаблоны) и дополнительные темы (tuple, bitset, регулярные выражения, случайные числа, исключения, пространства имён, множественное и виртуальное наследование, перегрузка new и delete, RTTI и dynamic_cast, перечисления, указатели на члены класса, вложенные классы, объединения, локальные классы, снижающие переносимость возможности — битовые поля, volatile, extern "C"). Авторы сначала рассказывают о современном состоянии языка, например, об std::string, только затем — о массивах char. В общем, изложение довольно полное, вопросы только к структуре. Так, и довольно старые вещи типа extern, и вещи из новых стандартов наподобие decltype — появляются рано, когда читателю они ещё не слишком нужны. В целом часть, совместимая с C, описана слабо.
Книга включает стандарт C++11. Удивительно, как быстро всё может поменяться. Во второй главе приводятся разные способы инициализации, введённые этим стандартом.
int units_sold = 0;
int units_sold = {0};
int units_sold{0};
int units_sold(0);
Но уже в C++17 всё ещё немного поменялось.
Приложение — библиотека: имена и заголовки стандартной библиотеки, краткий обзор алгоритмов, случайные числа.
256 страниц. Вильямс, 2002
Stanley B. Lippman, Essential C++. Addison-Wesley, 2000
Хорошая серия, хорошая книга, но устаревшая. Возьмите поновее.
432 страницы. Триумф, 2005
Brian Overland. C++ Without Fear, Pearson Education, 2005
Странная книжица. Автор долго работал в Microsoft и некой лаборатории. Описание многообещающее: «Вы научитесь думать „как программист“ и станете настоящим „асом“ программирования C++», но это, конечно, не так. Уже в предисловии автор честно говорит, что не будет битовых полей и операций с битами, GUI, шаблонов и STL. Исключения тоже будут освещены крайне скупо. То есть не будет даже C++98.
Трудно найти причину, по которой языки Visual Basic и FORTRAN вообще нашли место на страницах книги. И странно видеть в 2005 инструкции по работе со средой RHIDE (в оболочке DOS). Код в книге написан в плохом стиле (объявление без инициализации, скобки), проскакивает <iostream.h>.
Во всей книге примеры похожи на классические университетские задачи, а классы автор показывает на примере дроби, точки на плоскости, синтаксического анализатора (примитивного, на базе строковых функций) и строки.
Приложения: операторы, встроенные типы данных, краткий обзор синтаксиса, коды ASCII, основные библиотечные функции, глоссарий.
464 страницы. Бином, 2001
Ira Pohl. Object-Oriented Programming Using C++. Addison-Wesley, 1997
Обычная книга. Начинается она с главы «Зачем нужно объектно-ориентированное программирование на C++?» с кратким обзором языка и ООП, а первый фрагмент кода использует устаревшие <iostream.h> и <iomanip.h>. Книга учит устаревшим вещам (вроде старой спецификации исключений).
Имена всех файлов в формате 8.3, как в файловой системе FAT16 для DOS, например, printabl.cpp.
Автор проектирует классы массива (vect, фи), односвязного списка (slist, self-referring list), матрицы, полинома (на списках), рациональной дроби, времени (для демонстрации перегрузки), стека, бинарного дерева поиска.
Книга демонстрирует абсолютно плохой стиль (0 вместо NULL — лишь небольшой пример). Перевод тоже не блещет: например, «штампы проектирования» (шаблоны проектирования).
Приложения: коды символов ASCII, приоритет операторов, руководство по языку (50 страниц про всё на свете: sizeof, типы, new, ветвления, циклы и многое другое), ввод-вывод, STL и строковые библиотеки.
1244 страницы. Диалектика, 2018
Stephen Prata. C++ Primer Plus. Addison-Wesley, 2012
У книги необычная вёрстка в две колонки. В ней много иллюстраций и каких-то объяснений (например, про числа с плавающей запятой).
Наверное, подойдёт для новичков. Часть, совместимая с C, показана плохо. Но у автора есть отдельная книга по языку С.
Приложения: системы счисления, ключевые слова, таблица ASCII, приоритет операций, другеи операции, класс шаблона STRING, методы и функции библиотеки STL, рекомендуемая литература.
752 страницы. Диалектика, 2017
Siddhartha Rao. Teach Yourself C++ in One Hour a Day. Sams, 2017
Практически безупречный шедевр. Части, совместимой с C, не нашлось места на страницах книги, но в остальном всё очень хорошо, приводится много справок.
Придраться можно разве что к оформлению кода (#include<algorithm>, но не везде, фигурные скобки, поля структур с прописной, пробелы).
В отличие от многих других книг, автор сразу показывает, как правильно пользоваться стандартным пространством имён.
int main()
{
using namespace std;
...
Либо так.
int main()
{
using std::cout;
...
Хотя дальше пользуется типичным вариантом.
using namespace std;
int main()
{
...
Приложения: двоичные и шестнадцатеричные числа, ключевые слова, приоритет операторов, коды ASCII, ответы.
781 страница. Питер, 2004
Walter Savitch. Problem Solving with C++. Addison-Wesley, 2003
На первый взгляд, нормальная книга с советами и предупреждениями о ловушках, но ей не хватает глубины. Часть языка, совместимая с C, проходит мимо.
Изложение в основном последовательное, но есть исключения. Потоку управления программы (ветвлениям и циклам) посвящена 7 глава, и это странно, потому что до того уже были классы. Указатели и динамические массивы идут сразу после векторов. Это как минимум означает, что читатели не узнают про особенности аллокации и реаллокации элементов (и о том, что нельзя хранить указатели на элементы массива).
В дополнение к основным темам автор предлагает реализовать связный список и стек.
Немного устаревшая книга (<iostream.h> — первый звоночек). Тема библиотеки и современного (хотя бы на тот момент) языка практически не раскрыта. Для каких-то новичков может и подойти для начала, в конце концов, в книге есть интересные задачи.
784 страницы. Питер, 2005
Walter Savitch. Absolute C++, 2003
См. «Программирование на C++».
651 страница. Питер, 2012
Paulo Franca. C++: No Experience Required. Sybex, 1997
Странный нулевой урок про каталоги и компиляторы. Настораживает обилие скриншотов разных окон. Всё очень сильно устарело (старый друг <iostream.h>).
На обложке русского издания 2012 года странный код. И это очень показательно. Это код из раздела «Первый этап великого похода», где проектируют робота в лабиринте.
#include "franca.h"
//с1robot1.срр
Robot Tracer;
void mainprog()
{
Tracer.face(3);
Tracer.step();
}
На протяжении всей книги используется заголовочный файл "franca.h".
«На самом деле основная последовательность действий в C++ обозначается функцией main() или winmain(). Имя mainprog() используется только в программном обеспечении книги. В следующих уроках об этих различиях будет рассказано более подробно».
За функцией mainprog() скрывается winmain(), о чём автор честно предупреждает.
Настораживает многое. Название экземпляра Tracer с прописной буквы, сам факт, что он глобальный статический, нулевые вертикальные отступы, магическое число 3 для кодирования направления (север, запад, юг, восток) вместо элемента перечисления (например, Direction::East).
Вся книга сводится не к тому, что такое C++, а к тому, как пользоваться библиотекой автора. Сначала это создание экземпляра класса и последовательный вызов его методов. Проектирование функций начинается с передачи в них именно объектов (по ссылке и по значению). И только потом наступает черёд числовых переменных и простейших операторов (типа =).
Но долго это не длится. Когда автор возвращается к функциям, просто предлагается пользоваться готовыми функциями для рисования линий. И где-то после этого найдётся место циклам, ещё позднее — ветвлениям. В середине книги.
Дальше автор рассказывает о классах, наследовании (поверхностно), массивах, структурах, строках (и типе char как таковом), вводе и выводе с помощью std::cin и std::cout (вместо функций из библиотеки автора), файлах и препроцессоре.
Вот странное упражнение из книги: предлагается определить значения переменной k после выполнения каждого присваивания. В первом и последнем случаях неопределённое поведение (undefined behavior), то есть результат непредсказуем. В предпоследнем случае вообще должна происходить ошибка компиляции.
int i=1, j=2, k=3;
k=++k+j;
k=i+j++;
k=i-j;
i+j=k;
k++=j;
Урок «Дополнительные возможности» объясняет, что такое указатель, перегрузка операторов, шаблоны, дружественные функции и классы, множественное наследование, выделение памяти и логические операторы (&&, || и !). Всё экстремально коротко.
Очень слабая книга и устаревшая. Стоит похвалить идею показывать всё наглядно (например, когда автор объясняет сортировку, в окне отображаются человечки), но реализация подкачала.