Несколько лет назад я
прочел и
прорешал учебник Роберта Лафоре «
Объектно-ориентированное программирование в C++», 4 редакция. Этот учебник Роберта Лафоре неплох... для 2001 года, когда он был впервые выпущен (его продолжают издавать чуть ли не ежегодно, но содержание не обновляют, так как Лафоре уже давно не пишет, вышел на пенсию).
Люди, которые следят за языком программирования C++, знают о множестве изменений, произошедших в этом языке с 2001 года. Так что сегодня учебника Лафоре для обучения языку C++ уже недостаточно, требуется что-то посовременнее, написанное с учетом нововведений в C++. Я немного поискал в интернете и решил, что один из лучших вариантов на сегодня - это известный учебник-сайт «
www.learncpp.com», я его еще называю просто «Learncpp.com».
Этот сайт полностью бесплатный и не требует регистрации. К страницам сайта можно оставлять комментарии. Сайт работает с 2007 года, автором содержимого и администратором сайта является человек,
называющий себя «Alex» (я его буду называть по-русски - Алекс). Учебник написан на английском языке. Я видел переводы этого учебника на русский в разных местах (не уверен, что эти переводы сделаны с разрешения автора), но сам я предпочитаю читать сайт в оригинале, это еще и улучшает знание английского языка, что помогает общаться с коллегами из других стран.
Алекс ежедневно занимается обновлением материалов сайта, исправляет ошибки, отвечает на комментарии, с ним можно легко связаться. На данный момент материалы сайта рассчитаны на версию C++20 стандарта языка C++ (это самая
свежая действующая версия; версия C++23 готовится, но пока еще не выпущена в свет).
Недостатки сайта
У этого сайта я пока что обнаружил только два крошечных недостатка, которые легко можно игнорировать. Во-первых, на сайте довольно много рекламных баннеров (логическое следствие того, что для пользователей сайт бесплатен). Меня смущает не наличие большого количества рекламы, а то, что эти баннеры мне по какой-то причине не видны (я пользуюсь браузерами «Microsoft Edge» на базе «Chromium» и «Google Chrome»). Из-за этого в тексте материалов сайта образуются большие пропуски в местах, где должны быть рекламные баннеры.
Поначалу кажется, что какие-то куски информации по какой-то причине скрыты, но это не так, это просто большие пропуски. В принципе, они не мешают освоению материала, даже наоборот - хорошо, что реклама не видна. Для проверки я заходил на сайт из браузера «
Tor Browser», через этот браузер реклама отлично видна. (Я не стал разбираться: может, это мои основные браузеры «режут» эту рекламу, либо это очередные «санкции».)
Во-вторых, иллюстрации на сайте сделаны некачественно: они загрязнены так называемыми «
артефактами сжатия». Мне кажется, изначально картинки были в формате PNG (сжатие без потерь), а потом автор преобразовал их в формат WebP (может быть как с потерями, так и без потерь, но в основном его используют ради уменьшения размера картинок, поэтому - в основном сжатие с потерями), в результате чего на картинках образовались артефакты. Опять же, этот недостаток не мешает освоению материала. Схемы на картинках хорошо различимы и понятны, хоть наличие артефактов несколько раздражает.
Вообще, дизайн сайта оставляет желать лучшего. Для меня эталоном дизайна сайта-учебника является «
learn.javascript.ru». Сравните с ним: это, как говорят в Одессе, две большие разницы.
Содержимое сайта «Learncpp.com»
Учебник-сайт разбит на 24 главы (с главы 0 по главу 23), каждая из которых разбита на множество именованных разделов. Имеется три приложения (appendix): A, B и C. Содержание учебника есть на первой (домашней) странице сайта:
https://www.learncpp.com Содержимое главы 0 (вводная глава)
Нулевая глава является вводной, то есть это еще не начало обучения, а только подготовка к нему; хотя несколько программ (в том числе «Hello, world!») в этой главе есть. Глава состоит из 12 разделов-статей, каждая из которых расположена на отдельной странице сайта. Разделы пронумерованы с 0.1 по 0.12.
В разделе 0.1 (введение к учебнику) рассказано о структуре уроков, целях, которые следует ставить при обучении, объясняется, как лучше практиковаться в написании кода и решении задач. Даны ответы на несколько часто задаваемых вопросов.
В разделе 0.2 (коротко о языках программирования вообще) рассказано о том, что такое программа, программирование, исходный код, аппаратное обеспечение (hardware), запуск и выполнение программы. Рассказано про машинный язык, язык ассемблера и высокоуровневые языки. Что такое компилятор и интерпретатор и чем они друг от друга отличаются. Рассказано о правилах, лучших практиках и предупреждениях, описываемых в учебнике.
В разделе 0.3 (введение в историю создания языка C++) рассказано о языке программирования Си и языке C++ и об их связи, а также о философии этих языков и версиях стандартов. В разделе 0.4 (первые этапы написания программы) рассказано про первые три этапа написания программы: определение задачи для решения, определение способа решения задачи (проектирование), написание исходного кода программы. В разделе 0.5 (завершающие этапы написания программы): компиляция исходного кода в объектные файлы, компоновка объектных файлов и файлов библиотек в исполняемый файл. Что такое компоновщик и что он делает, что такое библиотека и стандартная библиотека языка C++. Тестирование и отладка полученной программы. Что такое интегрированная среда разработки (IDE).
В разделе 0.6 (установка интегрированной среды разработки) объясняется, как выбрать и установить интегрированную среду разработки для работы над примерами и упражнениями учебника. Рассмотрены среда «Visual Studio» (для систем «Windows»), среда «Code::Blocks» (для систем «Linux» или «Windows»), редактор кода «VS Code» (для опытных пользователей систем «Linux», «macOS» или «Windows»). Упомянуты другие возможные варианты. Перечислены среды, которые рекомендуется избегать, так как они не поддерживают свежие версии стандарта языка C++.
В разделе 0.7 (компиляция первой программы) рассказано о том, что такое «проекты» в интегрированных средах разработки и о том, что учебник ориентирован на «консольные проекты». Также объяснены термины «решение» и «рабочее пространство». Показано, как создать первый проект из графического интерфейса разных интегрированных сред разработки, а также из командной строки. Дан исходный код первой программы. Рассказано, как выполнить компиляцию (сборку) проекта и запуск полученного исполняемого файла. Что делать, если при компиляции появляются сообщения об ошибках и предупреждениях. Что делать, если при запуске консольной программы окно консоли быстро закрывается, не давая просмотреть результат работы программы. Объяснено различие между терминами «компиляция», «сборка», «пересборка», «очистка» и «запуск».
Раздел 0.8 (самые частые ошибки начинающих) представляет собой список самых частых ошибок, которые могут совершить начинающие при компиляции и запуске своей первой программы на языке C++. Приведены короткие объяснения о том, что делать в этих случаях.
В заключительных разделах 0.9, 0.10, 0.11 и 0.12 рассказано о настройках компилятора, которые потребуются при работе над примерами и упражнениями учебника, и о том, как установить нужные настройки в разных интегрированных средах разработки (IDE) или при использовании компилятора из командной строки. В разделе 0.9 (конфигурации сборки) рассказано, что в интегрированных средах разработки обычно уже есть две настроенные конфигурации: для отладки программы и для окончательной сборки программы для выпуска в свет (релиза). Рассказано, чем отличаются эти две конфигурации и какую из них следует использовать при работе с примерами из учебника.
В разделе 0.10 (расширения стандарта языка в компиляторах) рассказано о расширениях стандарта, реализованных в разных компиляторах, и о том, как заставить компилятор работать строго по стандарту языка C++. В разделе 0.11 (уровни сообщений об ошибках и предупреждений) рассказано, чем «предупреждения» отличаются от «ошибок», а также рекомендуется исправлять не только ошибки, но и все предупреждения, даже если программа выполнилась успешно. Рассказано, какие бывают уровни предупреждений (более строгие и менее строгие). Рассказано, что можно заставить компилятор считать предупреждения за ошибки. Сказано о том, какие настройки рекомендуются для работы с учебником.
В разделе 0.12 (выбор версии стандарта языка C++) еще раз рассказано о разных версиях стандарта языка C++ и их названиях. Сказано, что для работы с учебником рекомендуется использовать компилятор, способный работать с версиями C++17 и C++20 стандарта языка C++. Описано, как это настроить в разных интегрированных средах разработки и из командной строки. Даны две небольшие программы для проверки компилятора на совместимость с версиями C++17 и C++20 стандарта языка C++ по отдельности. Рассказано, как экспортировать настройки предыдущего проекта в новый проект, показано, как создать шаблон проекта с нужными настройками в выбранной интегрированной среде разработки (IDE). Описано со ссылками, где можно посмотреть тексты разных версий стандарта языка C++.
Работа в командной строке
Я решил проходить этот учебник с компиляторами из командной строки, так что многое в главе 0 мне не подходило. Но всё равно было интересно взглянуть, как выполняются разнообразные настройки в графическом интерфейсе разных интегрированных сред разработки (IDE). В процессе чтения я написал два поста по теме:
1.
Learncpp.com: добавление ожидания в конец консольной программы на языке C++2.
Learncpp.com: проверка компилятора C++ на совместимость со стандартом