Dyzzet|
C++ Data Science Алгоритмы Темы · Блог · YouTube
Обзоры книг по C++
Русскоязычная литература. Часть I

Здесь перечислена базовая литература по языку C++ русскоязычных авторов, кроме книг, опубликованных издательствами университетов, и книг по конкретным технологиям (C++ Builder, Visual C++, Qt). Русскоязычная литература для профессионалов, специальная литература и книги по STL — в соответствующих разделах.

Аверкин В. П., Бобровский А. И., Веснич В. В., Радушинский В. Ф., Хомоненко Анатолий Дмитриевич. Программирование на C++

256 страниц. Корона-Принт, 1999

Книгу сопровождает комментарий «Под редакцией профессора А. Д. Хомоненко», ему же принадлежит и предисловие. Этот автор написал и другие книги — по языку Delphi и базам данных.

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

#include “f:\POS_C\PRIMER\point.cpp“

А некоторые — просто ошибочны. Здесь вместо delete[] авторы написали delete (к тому же используется транслит и неоправданное сокращение).

int *mas=new int[n];
 . . .
delete mas;

Хотя в этой части нет книг, полностью посвящённых конкретным технологиям, последняя глава этой книги с кучей скриншотов показывает работу с Borland C++ Builder.

Акимова А. В., Кольцов Д. М. 100 примеров на С++

256 страниц. Наука и техника, 2018

Книга с банальным слоганом на обложке. На которой, кстати, не нашлось места для второго автора (он также написал «100 примеров на C»).

Это тот самый решебник, который мечтали бы найти первокурсники. Обмен значений, обмен без третьей переменной, максимум среди трёх, проверка, является ли число палиндромом, числа Армстронга и т. д.

В самом начале — небольшая справка, как компилировать программы с помощью GNU С++ и довольно странные для 2018 года предупреждения:

«Можно встретить ранние реализации С++, где ещё указывалось расширение файла #include <iostream.h>».

Пора бы отказаться от столь старых компиляторов.

Астахова Ирина Фёдоровна, Власов Сергей Васильевич, Фертиков Вадим Валериевич, Ларин Александр Вадимович. Язык C++. Учебное пособие

203 страницы. Новое знание, 2003

Уже введение удивляет своими пассажами: «Популярность C++ привела к тому, что язык Java, разработанный для программирования в интернете, основан на C++».

Оформление кода и типографика ничем не объяснимы.

#include <iostream.h>
void main()
{  enum color {red, green, blue} Nu;
  int i,j;
  char ch;
 Nu = blue; // Присвоение переменной Nu значения blue.
/* Ввод-вывод через стандартные потоки:
     cout – поток вывода на экран монитора;
     cin – поток ввода с клавиатуры.         */

  cout < “Введите два целых числа и символ: ”;
  cin > i > j > ch;
  cout < “Nu=” < Nu < “; i+j=” < i+j < “; ch: ” < ch;
}

Где-то в самом начале в таблице для типа unsigned int приведён только один пример — 0xFFFF. Так можно подумать, что это единственный правильный вариант литерала для такого типа.

Даже если не считать таких мелких придирок, книга в целом всё равно совершенно беспорядочная. Сначала идут случайные темы, а потом — полиморфизм и классы.

Ашарина Ирина Владимировна. Объектно-ориентированное программирование в C++: лекции и упражнения. Учебное пособие

336 страниц. Горячая линия — Телеком, 2015

Что должно быть в книге про ООП в C++? Начать, конечно же, нужно с «алфавита языка».

Показать «Hello, world». Но не обычный.

#include "stdafx.h"
#include <iostream>
#include <conio.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{ cout<<" Hello, World!\n";
  return 0;
}

Отбросим детали оформления и доисторический <conio.h> и посмотрим на _tmain. Это макрос, доступный в некоторых компиляторах, который разворачивается либо в main, либо в wmain (для так называемых Unicode-программ). То же и с макросом _TCHAR, он разворачивается в char либо wchar_t.

Ещё из доисторических артефактов встретится _getch(), в коде будет транслит, глобальные константы, в тексте — грамматические ошибки («может изменится»).

В учебнике по ООП в C++ найдётся место всему: численным методам (интегрирование методом прямоугольников, метод дихотомии для решения уравнений), устройству магнитных носителей (файловые системы FAT и NTFS). А код для работы с файлами будет непременно в стиле C (FILE*, fopen() и т. д. вместо fstream). Каким-то невероятным образом сюда же затесались архитектура процессора IBM PC и система адресации в MS-DOS.

Что объяснимо — это двусвязные списки и деревья. Но даже стрелки на картинках непонятные (с. 182).

Приложения: системы счисления, схемы алгоритмов.

Ашарина Ирина Владимировна, Крупская Жанета Фёдоровна. Язык C++ и объектно-ориентированное программирование в C++. Лабораторный практикум. Учебное пособие

232 страницы. Горячая линия — Телеком, 2016

Пара предыдущей книги. Набор задач с ужасными формулами, иллюстрациями и примерами кода.

Березин Борис Иванович, Березин Сергей Борисович. Начальный курс C и C++

288 страниц. ДИАЛОГ-МИФИ, 2001

Обложка обещает практически «два в одном», но не наберётся и половины. Всё-таки C и C++ — это разные языки, и трудно критиковать вещи, подобные этой.

main(void)

Стандарт C++ прямо запрещает просто писать main, нельзя писать даже void main — только int main. И если в начале книги, где описывается часть, общая для обоих языков, это отчасти уместно, то к середине книги это окончательно теряет актуальность.

В названии заявлен C, и в тексте упоминается так называемый нелокальный переход — функции setjmp() и longjump() (с. 121). Книги по C++ обычно игнорируют такие вещи, хотя они сохраняются со времён C.

Первая глава посвящена Borland C++ — тому, что с синим окном. Авторы очень подробно всё описывают и показывают. Одна из последующих глав будет посвящена графическому режиму (с. 152), где доисторический заголовочный файл <conio.h>, в отличие от большинства других книг, имеет хоть какое-то оправдание.

Книга совершенно посредственная, с плохой типографикой (неправильные кавычки в коде), транслитом и — самое удивительное — опечатками в коде.

Приложения: примеры использования языка C++, использование встроенного отладчика.

Бондарев Владимир Михайлович. Программирование на C++

284 страницы. Компания СМИТ, 2005

Книга написана конспективно, концентрированно, порой весьма поверхностно освещает те или иные темы. Часть про STL подробная, но напоминает документацию.

Что-то в коде устарело.

void main()

Стиль вызывает вопросы, есть опечатки и ошибки, которые могут сбить новичков с толку.

struct magazin {
   char* tittle;
   int year;
   int number;
};
 
magazin mag = {"Nature", 3, 1995};

Приложение: введение в программирование.

Васильев Алексей Николаевич. Объектно-ориентированное программирование на C++

544 страницы. Наука и техника, 2016

Разговор начинается с «принципов ООП». А дальше читателей ждёт ужасное форматирование, неинициализированные переменные, формулы, свёрстанные, наверное, в Word’е, и плохие приёмы программирования.

system ("PAUSE");

Проверять аргумент оператора delete на NULL/nullptr не нужно.

if(next!=NULL){
delete next;
}

В книге про ООП в C++ правило трёх лишь один раз коротко упоминается (с. 240). Правило нуля и правило пяти, появившееся в C++11, не упоминаются вовсе.

Судя по всему, книга не ставит целью подготовить будущих профессионалов. Она не рассказывает подробно о расположении объектов в памяти, не учит даже таким банальностям, как проверка, выделилась ли память с помощью оператора new. C++, видимо, представляется автору как некая Java.

Что бросается в глаза — так это многочисленные эпиграфы с цитатами из советской киноклассики. В подавляющем большинстве случаев — совсем не в тему. И часто — по две цитаты из одного фильма на странице.

Фильм
Цитат
Фильм
Цитат
«Покровские ворота»
14
«Чародеи»
5
«Гостья из будущего»
11
«31 июня»
4
«Приключения Шерлока Холмса и доктора Ватсона»
10
«Приключения принца Флоризеля»
3
«Старики-разбойники»
10
«Служебный роман»
3
«Кавказская пленница»
9
«Безумный день инженера Баркасова»
2
«Бриллиантовая рука»
8
«Усатый нянь»
2
«Иван Васильевич меняет профессию»
8
«Айболит 66»
1
«Семнадцать мгновений весны»
7
«Слёзы капали»
1
«Девчата»
6
«Сталкер»
1
«Ирония судьбы, или С лёгким паром!»
5
 
 

Так какая кинолента у автора любимая?

Васильев Алексей Николаевич. Самоучитель C++ с примерами и задачами

480 страниц. Наука и техника, 2016

Почти с самого начала книга удивляет (с. 26).

«Если после означенных выше команд выполнить команду n=(--i)*(i--), получим для переменной i значение 2, а для переменной n значение 9. Алгоритм вычисления значений переменных при этом следующий. Поскольку выражение, на основе которого вычисляется значение переменной n, является произведением двух выражений (то есть (--i) и (i--)), то предварительно рассчитываются эти выражения. Результатом выражения (--i) является число 3 (значение i уменьшено на единицу), причём это же значение присваивается переменной i. Такое же значение возвращается выражением (i--), а после присваивания значения переменной n переменная i будет уменьшена ещё на единицу».

Это попросту неверно. Выражение n = (--i) * (i--) ведёт к неопределённому поведению программы. Компилятором гарантируется приоритет операций, но не порядок их выполнения. То есть может получиться и 9, как пишет автор, и 8 (если бы порядок вычисления был обратным).

В следующем примере тоже ошибка: результат побитового смещения вправо для отрицательного числа зависит от реализации (implementation-defined).

«Например, результатом выражения -6>>5 является число -1».

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

state?(cout<<b/a<<endl,exit(0)):state=(a==0)&&(b==0);

Порой автор отходит от традиций. Обычно (хотя бы в книгах) аргументы функции main() называются argc иargv.

int main(int size,char *str[]) {

«Многократное наследование» обычно называют множественным, «статический массив» также не добавляет ясности: можно посчитать, что речь идёт о размещении в статической области памяти.

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

Из хорошего в книге — только задачи (но не код решений). Здесь и простые задачи: маятник, комплексные числа, решение уравнений, вычисление рядов, объёма методом Монте — Карло и т. д. И более хитрые: комплексная экспонента, матричная экспонента, преобразование Фурье. Многие важные темы по C++, к сожалению, даже не упоминаются.

Автор продолжает усыпать страницы цитатами. На этот раз — всё реже из фильмов. Частый пример — Йоги Берра, американский бейсболист, известный своими яркими абсурдными высказываниями. Если меня спросят, сколько раз в самоучителе по C++ можно процитировать Виктора Степановича Черномырдина, я отвечу: четыре.

Автор высказывания
Количество цитат
Й. Берра
5
В. С. Черномырдин
4
И. Гёте
3
У. Черчилль
3
П. Буаст
2
Дж. Буш (ст.)
2
Вольтер
2
Ф. Ларошфуко
2
Омар Хайям
2

Одного упоминания удостоились: Вольтер, Э. Ренан, Ф. Левальд, Артур Конан Дойл, К. Вейерштрасс, Сенека, Н. С. Хрущёв, Линдон Джонсон, Марк Твен, К. Вебер, Уолт Дисней, Карел Чапек, А. Моруа, М. Жванецкий, Э. Резерфорд, Дж. Буш (мл.), Б. Ельцин, Н. В. Гоголь, Р. Рейган, П. Капица, Д. Локк, В. Клинтон, Вудро Вильсон, Сунь-цзы, Проперций, П. Лаплас, У. Шекспир, Ш. Монтень, Г. Бокль, Аристотель, Л. ван Бетховен, Ж. Левис, Ш. Бодлер, Данте Элигьери, П. Мариво, И. И. Герцен, П. Л. Лавров, Соломон, Акутагава Рюноскэ, В. Буш, Д. Локк и ВВС США (их девиз).

Но не волнуйтесь, фильмы автор тоже цитирует.

Фильм
Количество цитат
«Гараж»
5
«Карнавальная ночь»
4
«Семнадцать мгновений весны»
3
«Сильва»
3
«Чародеи»
3
«Свадьба в Малиновке»
2

По одной цитате: «Айболит 66», «Бриллиантовая рука», «Гибель Империи», «Операция „Ы“ и другие приключения Шурика», «Падал прошлогодний снег», «Плутовство», «Приключения принца Флоризеля», «Следопыт», «Старики-разбойники», «Трое из Простоквашино», «Человек с бульвара Капуцинов».

Васильев Алексей Николаевич. Программирование на C++ в примерах и задачах

368 страниц. Издательство «Э», 2017

Из аннотации: «Книга включает в себя полный набор сведений о языке C++, необходимых для успешного анализа и составления эффективных программных кодов». Конечно же, это не так. И опыт подсказывает, что «программные коды» часто говорят любители.

«Автор книги — доктор физико-математических наук, профессор кафедры теоретической физики физического факультета Киевского национального университета имени Тараса Шевченко. Автор книг по программированию и математическому моделированию. Сфера научных интересов: физика жидкостей, биофизика, синергетика, математические методы в экономике, моделирование социально-политических процессов, математическая лингвистика».

Этот же автор написал книги по языкам C, C♯, Java, JavaScript и Python, а также программам MATLAB, Mathcad и Excel. О качестве книг по C++ мы поговорили, об остальном судить вам.

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

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

Уже «Hello, world» содержит странный вызов. Новички могут подумать, что так всегда и нужно писать.

system("chcp 1251>nul");

Некоторые примеры — просто ради примеров. Снова закроем глаза на оформление и зададимся вопросом: зачем выделять память под одну переменную? Новички опять же могут посчитать, что это повседневная практика.

int* size;
size=new int;
// ...
char* symbs;
symbs=new char[*size];
delete [] symbs;
delete size;

Видно, что редактор держал автора в узде и не давал ставить по два эпиграфа из одного фильма на странице и по эпиграфу возле каждого списка вопросов в конце главы.

Фильм
Количество цитат
«31 июня»
3
«Кин-дза-дза»
2
«Ирония судьбы, или С лёгким паром!»
2
«Приключения Шерлока Холмса и доктора Ватсона»
2
«Приключения титулованной особы»
1
«Семнадцать мгновений весны»
1

Глушаков Сергей Владимирович, Коваль Александр Викторович, Смирнов Сергей Викторович. Язык программирования C++

500 страниц. АСТ, Фолио, 2001

Книга во многом противоречивая и, конечно, в чём-то устаревшая. Но если вам нравится читать про DOS и PDP, то она будет интересной.

Среди достоинств — описание строк и файлового ввода-вывода в стиле C и C++, а также new(nothrow) и глава про STL.

Некоторые приёмы откровенно странные. Задержка выполнения (delay) с помощью цикла for и макроопределение endl.

#define  endl  '\n'

Переменную типа float авторы без тени сомнения сравнивают с нулём (что некорректно для типа с плавающей запятой).

if(D == 0)

В коде есть опечатки, где-то не хватает освобождения памяти, а реализация структур данных весьма и весьма странная.

Остаётся совершенно непонятным, что имели в виду, когда аргументы функции для обмена значений объявляли не как ссылки или указатели.

int     swap(int, int);

А писать функцию main() с именами аргументов, но без типов — похоже на древний стиль, где типы аргументов отдельно описывали между заголовком и телом.

int main(argc, argv)

В книге есть глава с загадочным названием «Модификаторы», посвящённая организации памяти. Это рассказ о регистрах процессора, моделях памяти (Tiny, Small, Medium, Compact, Large, Huge), модификаторах функций cdecl, pascal и ассемблерных вставках. Кажется, что глава откуда-то взята целиком, потому что в 2001 году упоминаются DOS и Windows 3.11.

Приложение: Unicode-строки.

Глушаков Сергей Владимирович, Дуравкина Татьяна Викторовна. Программирование на C++

685 страниц. АСТ, 2008

Что-то напрямую заимствовано из книги Глушакова С. В., Коваля А. В. и Смирнова С. В. «Язык программирования C++» 2001 года, и это заметно. У кода в книге плохой стиль и ужасное форматирование, местами с транслитом. Где-то на первых же страницах «Standard C++» превратился в «Standart C++».

Есть откровенные ошибки.

long double* lptr;
if(lptr = new long double[999999])
{
  cout << "\nOK!";
  delete[] lptr;
}
else
  cout << "\nERROR";

Реализация new, соответствующая стандарту, не возвращает NULL, а выбрасывает исключение std::bad_alloc. Чтобы добиться поведения, ожидаемого в примере, следовало использовать new (nothrow).

Авторы заявляют о неверных фактах.

«Язык C++ позволяет определять имена новых типов данных с помощью ключевого слова typedef».

И тут же поправляются и говорят, что новые типы не создаются. К чему два противоречащих друг другу утверждения подряд?

Главы про STL подробные, хотя и немного формальные. Последняя глава — практикум. Довольно безынтересный.

3 мая 2021
C++ книги
Зарегистрируйтесь и войдите, чтобы оставлять комментарии и голосовать.

Книги по C++
Книги Бьерна Страуструпа
Учебная литература. Часть I / Часть II / Часть III. Книги Герберта Шилдта / Часть IV
Русскоязычная литература. Часть I / Часть II / Часть III / Часть IV
Стандартная библиотека шаблонов
Структуры данных, алгоритмы, решение задач
Что выбрать? (Обновляется)
Также может быть интересным
© MMXI—MMXXIII. RSS. Поддержать сайт
Светлая тема / тёмная тема