C++ для профи - Джош Лоспинозо - E-Book

C++ для профи E-Book

Джош Лоспинозо

0,0
13,99 €

-100%
Sammeln Sie Punkte in unserem Gutscheinprogramm und kaufen Sie E-Books und Hörbücher mit bis zu 100% Rabatt.
Mehr erfahren.
Beschreibung

С++ — популярный язык для создания ПО. В руках увлеченного программиста С++ становится прекрасным инструментом для создания лаконичного, эффективного и читаемого кода, которым можно гордиться. «C++ для профи» адресован программистам среднего и продвинутого уровней, вы продеретесь сквозь тернии к самому ядру С++. Часть 1 охватывает основы языка С++ — от типов и функций до жизненного цикла объектов и выражений. В части II представлена стандартная библиотека C ++ и библиотеки Boost. Вы узнаете о специальных вспомогательных классах, структурах данных и алгоритмах, а также о том, как управлять файловыми системами и создавать высокопроизводительные программы, которые обмениваются данными по сети.

Das E-Book können Sie in Legimi-Apps oder einer beliebigen App lesen, die das folgende Format unterstützen:

EPUB

Seitenzahl: 994

Veröffentlichungsjahr: 2023

Bewertungen
0,0
0
0
0
0
0
Mehr Informationen
Mehr Informationen
Legimi prüft nicht, ob Rezensionen von Nutzern stammen, die den betreffenden Titel tatsächlich gekauft oder gelesen/gehört haben. Wir entfernen aber gefälschte Rezensionen.



Джош Лоспинозо
C++ для профи

Технический редактор Е. Неволайнен

Литературные редакторы Е. Павлович, А. Руденко

Художник В. Мостипан

Корректоры М. Одинокова, Н. Сидорова, Г. Шкатова

Верстка Е. Неволайнен

Джош Лоспинозо

C++ для профи. — СПб.: Питер, 2021.

ISBN 978-5-4461-1730-7

© ООО Издательство "Питер", 2021

Все права защищены. Никакая часть данной книги не может быть воспроизведена в какой бы то ни было форме без письменного разрешения владельцев авторских прав.

Оглавление

Об авторе
О научном редакторе
Предисловие
Благодарности
От издательства
Введение
Об этой книге
Кому будет интересна эта книга?
Структура книги
Увертюра для С-программистов
Обновление до Super C
Темы С++
Расслабьтесь и получайте удовольствие
Часть 1. Основы языка C++
1. Создаем и запускаем
Структура базовой программы на С++
Цепочка инструментов компилятора
Инициализация С++
Отладка
Итоги
2. Типы
Основные типы
Массивы
Пользовательские типы
Полнофункциональные классы в C++
Итоги
3. Ссылочные типы
Указатели
Ссылки
Использование указателей и ссылок
Вывод типов с помощью auto
Итоги
4. Жизненный цикл объекта
Длительность хранения объекта
Отслеживание жизненного цикла объекта
Исключения
Класс SimpleString
Семантика копирования
Семантика перемещения
Итоги
5. Полиморфизм во время выполнения
Полиморфизм
Пример для мотивации
Определение интерфейсов
Обновление банкового регистратора
Итоги
6. Полиморфизм во время компиляции
Шаблоны
Объявление шаблонов
Именованные функции преобразования
mean: пример функции шаблона
SimpleUniquePointer: пример класса шаблона
Проверка типов в шаблонах
Концепты
static_assert: полумеры до концептов
Нетиповые параметры шаблона
Вариативные шаблоны
Продвинутое использование шаблонов
Организация исходного кода шаблона
Полиморфизм во время выполнения и компиляции
Итоги
7. Выражения
Операторы
Пользовательские литералы
Преобразования типов
Постоянные выражения
Изменчивые выражения
Итоги
8. Инструкции
Инструкции-выражения
Составные операторы
Операторы объявлений
Операторы выбора
Операторы перебора
Итоги
9. Функции
Объявления функций
Возвращаемые типы auto
auto и шаблоны функций
Разрешение перегрузки
Вариативные функции
Вариативные шаблоны
Указатели функций
Оператор вызова функции
Пример подсчета
Лямбда-выражения
std::function
Пустые функции
Функция main и командная строка
Итоги
Часть 2. Библиотеки и фреймворки С++
10. Тестирование
Юнит-тестирование
Расширенный пример: AutoBrake
Фреймворки юнит-тестирования и имитации
Фреймворки имитации
Итоги
11. Умные указатели
Умные указатели
Владение умными указателями
Ограниченные указатели
Уникальные указатели
Общие указатели
Слабые указатели
Навязчивые указатели
Обзор вариантов умных указателей
Распределители
Итоги
12. Утилиты
Структуры данных
Дата и время
Числовые данные
Итоги
13. Контейнеры
Контейнеры последовательностей
Ассоциативные контейнеры
Графы и деревья свойств
Библиотека Boost Graph
Деревья свойств в Boost
Списки инициализаторов
Итоги
14. Итераторы
Категории итераторов
Вспомогательные функции итераторов
Дополнительные итераторные адаптеры
Итоги
15. Строки
std::string
Строковое представление
Регулярные выражения
Библиотека Boost String Algorithms
Boost Tokenizer
Локализация
Итоги
16. Потоки
Потоки
Итоги
17. Файловые системы
Концепты файловых систем
std::filesystem::path
Файлы и каталоги
Итераторы каталогов
Взаимосовместимость в fstream
Итоги
18. Алгоритмы
Сложность алгоритмов
Политика выполнения
Операции, не изменяющие последовательность
Операции, изменяющие последовательность
Сортировка и связанные операции
Бинарный поиск
Алгоритмы разбиения
Алгоритмы слияния
Алгоритмы предельных значений
Числовые операции
Boost Algorithm
19. Конкурентность и параллелизм
Конкурентное программирование
Параллельные алгоритмы
Итоги
20. Сетевое программирование с помощью Boost Asio
Модель программирования Boost Asio
Сетевое программирование с помощью Asio
Конкурентный режим в Boost Asio
Итоги
21. Создание приложений
Поддержка программ
Описание опций
Отдельные моменты компиляции
Итоги

#include <algorithm>

#include <iostream>

#include <string>

int main() {

    auto i{ 0x01B99644 };

    std::string x{ " DFaeeillnor" };

    while (i--) std::next_permutation(x.begin(), x.end());

    std::cout << x;

}

Об авторе

Джош Лоспинозо (Josh Lospinoso) — доктор философии и предприниматель, прослуживший 15 лет в армии США. Джош — офицер, занимающийся вопросами кибербезопасности. Написал десятки программ для средств информационной безо­пасности и преподавал C++ начинающим разработчикам. Выступает на различных конференциях, является автором более 20 рецензируемых статей и стипендиатом Родса, а также имеет патент. В 2012 году стал соучредителем успешной охранной компании. Джош ведет блог и активно участвует в разработке ПО с открытым исходным кодом.

О научном редакторе

Кайл Уиллмон (Kyle Willmon) — разработчик информационных систем с 12-летним опытом в C++. В течение 7 лет работал в сообществе по информационной безопасности, используя C++, Python и Go в различных проектах. В настоящее время является разработчиком в команде Sony Global Threat Emulation.

Предисловие

«C++ — сложный язык». Эту репутацию C++ заработал за несколько десятилетий, причем не совсем справедливо. Часто это утверждение считают поводом не изучать C++ или причиной, по которой стоит выбрать другой язык программирования. Такие аргументы трудно обосновать, ибо основная предпосылка неверна: C++ — не сложный язык. Первая проблема C++ — это его репутация. Вторая — отсутствие качественных учебных материалов для его изучения.

Сам язык за последние четыре десятилетия эволюционировал из языка C. Он начинался как ответвление C (с небольшими дополнениями) и предкомпилятор под названием Cfront, компилирующий ранний код C++ в код C, который затем обрабатывался с помощью компилятора C. Отсюда и название Cfront — «перед C». Спустя несколько лет оказалось, что это решение слишком ограничивает язык, и была предпринята работа по созданию фактического компилятора. Компилятор, написанный Бьёрном Страуструпом (Bjarne Stroustrup) (изобретатель языка), мог компилировать программу на C++ отдельно. Другие компании также были заинтересованы в продолжении базовой поддержки C и создали свои собственные компиляторы C++, в основном совместимые с Cfront или более новым компилятором.

Такой подход оказался несостоятельным, так как язык был непереносимым и абсолютно несовместимым между компиляторами, не говоря уже о том, что хранение всех решений и указаний в руках одного человека не способствовало созданию международного стандарта между компаниями — для этого существуют стандартные процедуры и организации, которые ими управляют. Таким образом, C++ стал стандартом ISO. После нескольких лет разработки в 1998 году вышел первый официальный стандарт C++, и люди возрадовались.

Но радовались недолго: хотя C++ 98 и был хорошим определением, он включал в себя несколько новых неожиданных разработок и имел пару функций, которые между собой весьма странно взаимодействовали. В некоторых случаях сами функции были хорошо написаны, но взаимодействие между общими функциями просто отсутствовало: например, возможность иметь имя файла в виде std::string и затем открывать файл с ним.

Другим запоздалым дополнением стала поддержка шаблонов — основная базовая технология, поддерживающая библиотеку стандартных шаблонов, одну из самых важных частей C++ на сегодняшний день. Только после ее выпуска люди обнаружили, что она сама по себе является полной по Тьюрингу и что многие сложные конструкции могут быть вычислены во время компиляции. Это значительно расширило возможности авторов библиотек при написании универсального кода, который мог бы произвольно обрабатывать сложные выводы, что было не похоже на то, что могли делать другие существующие в то время языки.

Последняя сложность заключалась в том, что хотя C++ 98 и был хорош, многие компиляторы не подходили для реализации шаблонов. Два главных компилятора того времени, GNU GCC 2.7 и Microsoft Visual C++ 6.0, не смогли выполнить двухэтапный поиск имени, требуемый шаблонами. Единственным способом реализовать это право стало бы полное переписывание компилятора...

GNU пытался и дальше добавлять функции в существующую кодовую базу, но в конце концов перешел к переписыванию компилятора в версии 2.95. Долгие годы новых функций или релизов не было, и многие были недовольны этим. Некоторые компании взяли кодовую базу и попытались продолжить ее разработку, создав 2.95.2, 2.95.3 и 2.96 — все три версии известны своей нестабильностью. Наконец, вышел полностью переписанный GCC 3.0. Первоначально этот релиз был не очень успешным. Он собирал шаблоны и код C++ намного лучше, чем когда-либо делал 2.95, но не собирал ядро Linux в работающий двоичный файл. Сообщество Linux возражало против изменения своего кода для адаптации к новому компилятору, настаивая на том, что сам компилятор не работает. В конце концов, ко времени версии 3.2 сообщество сдалось и мир Linux снова сконцентрировался вокруг GCC 3.2 и выше.

Microsoft как мог старался избежать переписывания своего компилятора. Он добавлял граничные случаи к граничным случаям и эвристику, чтобы угадать, должно ли что-то быть разрешено в первом или втором проходе поиска имени шаблона. Такой подход почти сработал, но библиотеки, написанные в начале 2010-х годов, показали, что никакого возможного способа заставить их всех работать не было — даже с изменениями исходного кода. Корпорация Microsoft наконец-то переписала свой парсер и выпустила обновленную версию в 2018 году, но многие пользователи новый парсер не активировали. В 2019 году новый парсер был окончательно включен по умолчанию для новых проектов.

Ранее, в 2011 году, произошло важное событие: релиз C++ 11. После выхода C++ 98 были предложены и разработаны новые важные функции. Но из-за того, что одна функция работала не совсем так, как ожидалось, новый релиз был отложен до 2009 года. За это время были предприняты попытки заставить его работать с новой функцией. В 2009 году она была окончательно удалена, все остальное было исправлено, а версия C++ 1998 года была обновлена. Было добавлено множество новых функций и улучшений библиотеки. Компиляторы снова медленно догоняли релизы, и большинство компиляторов смогло скомпилировать большую часть C++  11 только к концу 2013 года.

Комитет C++ извлек уроки из собственного раннего провала и представил план создания нового релиза каждые три года. План состоял в том, чтобы продумать и протестировать новые функции в течение одного года, как следует интегрировать их в следующем, стабилизировать и официально выпустить на третий год, а затем повторять этот процесс каждые три года. C++ 11 был первым экземпляром, а 2014 год — предполагаемым годом для второго выпуска. К своей чести, комитет выполнил то, что обещал, подготовив серьезное обновление по сравнению с C++ 11 и сделав функционал C++ 11 намного более удобным, чем ранее. В большинстве случаев, где были введены осторожные ограничения, их перенесли на то, что тогда считалось приемлемым, в частности на ограничения вокруг constexpr.

Авторы компиляторов, которые все еще пытались заставить работать все функции C++ 11 хорошо, поняли, что нужно сменить темп, иначе они рискуют остаться позади. К 2015 году все компиляторы поддерживали практически всё в C++ 14, что можно счесть за подвиг, учитывая историю C++ 98 и C++ 11. Это также повлияло на возобновление участия в комитете по С++ всех основных авторов компиляторов — если вы знаете о функции до ее релиза, то можете стать ведущим компилятором, поддерживающим ее. Если вы обнаружите, что определенная функция не соответствует дизайну компилятора, то можете повлиять на комитет C++, настроив функцию так, чтобы ее было легче поддерживать, — таким образом вы дадите людям шанс использовать ее как можно раньше.

C++ переживает второе рождение, что началось примерно в 2011 году, когда был представлен C++ 11 и использован добавленный им стиль программирования «Modern C++». Однако он улучшился только потому, что все идеи из C++ 11 были точно настроены в C++ 14 и C++ 17, и компиляторы стали полностью поддерживать все ожидаемые функции. Более того, скоро будет выпущен новый стандарт для C++ 20 и все компиляторы в его самых современных версиях уже поддерживают его основные части.

Современный C ++ позволяет разработчикам избавиться от большинства первоначальных проблем, связанных с попытками сначала изучить C, затем C ++ 98, затем C ++ 11, а затем отучиться от всех исправленных частей C и C ++ 98. Большинство курсов начиналось с истории C++, так как было важно понять, почему что-то в нем кажется таким странным. Что касается этой книги, я включил эту информацию в предисловие, потому что Джош по праву не затронул ее.

Больше не нужно знать эту историю, чтобы начать изучать C++. Современный стиль C++ позволяет полностью пропустить ее и писать хорошо спроектированные программы, зная только основные принципы C++. Лучшее время для изучения C++ — сейчас.

Теперь вернемся к раннее упомянутому моменту — отсутствию качественных образовательных возможностей и материалов для изучения C++. В самом комитете C++ предоставляется высококачественное обучение C++ — есть учебная группа, занимающаяся исключительно преподаванием C++!

В отличие от всех других книг по C++, которые я читал, эта книга учит основам и принципам. Она учит принципам мышления, которые позволят решать задачи и учитывать возможности библиотеки стандартных шаблонов. Возможно, результаты вы получите не сразу, но когда увидите, как компилируются и запускаются первые программы, а вы полностью понимаете, как работает C++, то степень удовлетворенности будет выше. Эта книга включает в себя даже такие темы, которые большинство книг по C++ игнорирует: настройка среды и тестирование кода перед запуском целой программы.

Наслаждайтесь чтением этой книги, делайте упражнения. А я желаю вам удачи в путешествии по C++!

Питер Биндельс (Peter Bindels), главный инженер-программист, TomTom

Благодарности

Прежде всего благодарю свою семью за предоставленное мне творческое пространство. Написание книги заняло вдвое больше времени, чем я планировал, и я неизмеримо благодарен вам за ваше терпение.

Я в долгу перед Кайлом Уилмоном и Аароном Бреем (Aaron Bray), которые научили меня C++; Тайлеру Ортману (Tyler Ortman), который вел эту книгу от замысла до реального результата; Биллу Поллоку (Bill Pollock), который «причесал» мой стиль изложения; Крису Кливленду (Chris Cleveland), Патрику Де Хусто (Patrick De Justo), Энн Мари Уокер (Anne Marie Walker), Энни Чой (Annie Choi), Мег Снирингер (Meg Sneeringer) и Райли Хоффман (Riley Hoffman), чья первоклассная работа над текстом принесла огромную пользу этой книге, и многим первым читателям, оставившим неоценимые комментарии к сырым главам.

И наконец, я благодарю Джеффа Лоспинозо (Jeff Lospinoso), который завещал своему наивному десятилетнему племяннику зачитанную, испачканную кофе верблюжью книгу1, с которой все и началось.

1Уолл Л., Кристиансен Т., Орвант Д. Программирование на Perl / Пер. с англ. — СПб.: Символ Плюс, 2002. — 1152 с.

От издательства

Ваши замечания, предложения, вопросы отправляйте по адресу [email protected] (издательство «Питер», компьютерная редакция).

Мы будем рады узнать ваше мнение!

На веб-сайте издательства www.piter.com вы найдете подробную информа­цию о наших книгах.

Введение

Хватай кисть и рисуй вместе с нами.

Боб Росс

Спрос на программирование систем огромен. Возможно, никогда еще не было лучшего времени, чтобы стать системным программистом, учитывая распространенность веб-браузеров, мобильных устройств и интернета вещей. Эффективный, поддерживаемый и правильный код желателен во всех случаях, и я твердо убежден, что C++ является подходящим языком для работы в целом.

В руках опытного программиста C++ может создавать меньший, более эффективный и более читаемый код, чем любой другой язык системного программирования на планете. Это язык, который стремится к абстракциям с нулевыми издержками. Вы сможете быстро программировать и вместе с простым прямым сопоставлением с аппаратным обеспечением иметь низкоуровневый контроль в любой момент. Программируя на C++, вы стоите на плечах гигантов, которые десятилетиями создавали невероятно мощный и гибкий язык.

Огромным преимуществом изучения C++ является бесплатный доступ к стандартной библиотеке C++, stdlib. Stdlib состоит из трех взаимосвязанных частей: контейнеров, итераторов и алгоритмов. Если вы когда-либо писали свой собственный алгоритм быстрой сортировки вручную или программировали системный код и столкнулись с переполнением буфера, висячими указателями, освобождением после использования и двойными освобождениями, то stdlib придется вам по душе. Она предоставляет непревзойденную комбинацию безопасности, правильности и эффективности типов. Кроме того, вам понравится то, насколько компактным и выразительным может быть код.

В основе модели программирования C++ лежит жизненный цикл объекта, который дает надежные гарантии того, что ресурсы, используемые программой: файлы, память и сетевые сокеты, освобождаются правильно даже в случае возникновения ошибок. При эффективном использовании исключения могут убрать из кода большое количество помех, связанных с проверкой условий. Кроме того, семантика перемещения/копирования обеспечивает безопасность, эффективность и гибкость для управления владением ресурсами так, как не могли предоставить ранние языки системного программирования, такие как C.

С++ — живой язык. Спустя более 30 лет комитет Международной организации по стандартизации (ISO) по C++продолжает регулярно вносить улучшения в язык. За последнее десятилетие было выпущено несколько обновлений стандарта: C++11, C++14 и C++17 — в 2011, 2014 и 2017 годах соответственно. В 2020 году вышел С++20.

Когда я использую термин современный C++, то имею в виду последний релиз C++, который включает в себя функции и парадигмы, представленные в этих дополнениях. Эти обновления внесли серьезные улучшения в язык, усовершенствовав его выразительность, эффективность, безопасность и общее удобство использования. По некоторым параметрам язык никогда не был более популярным, и он не исчезнет в ближайшее время. Если вы решите инвестировать в изучение C++, он будет приносить дивиденды долгие годы.

Об этой книге

Современные программисты на C++ имеют доступ к ряду очень качественных книг, например «Эффективный современный C++» Скотта Мейерса2 и «Язык программирования C++» Бьёрна Страуструпа, 4-е издание3. Однако эти книги написаны для достаточно продвинутых программистов. Доступны также некоторые вводные тексты о C++, но они часто пропускают важные детали, потому что ориентированы на абсолютных новичков в программировании. Опытному программисту непонятно, где можно погрузиться в язык C++.

Я предпочитаю изучать сложные темы осознанно, выстраивая концепции из их основных элементов. Язык C++ имеет пугающую репутацию, потому что его фундаментальные элементы тесно связаны друг с другом, что затрудняет построение полной картины языка. Когда я изучал C++, то изо всех сил пытался сосредоточиться на языке, перескакивая от книг к видео и измученным коллегам. Поэтому и написал такую книгу, которую сам хотел бы иметь пять лет назад.

Кому будет интересна эта книга?

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

Примечание

Если вы опытный программист на C или начинающий системный программист, задающийся вопросом, стоит ли вкладывать средства в изучение C++, обязательно прочитайте «Увертюру для C-программистов».

Структура книги

Книга разделена на две части. Часть I охватывает основной язык C++. Здесь не будет истории  языка C++ (от старого стиля C++ 98 до современного C++ 11/14/17). Вы изучите непосредственно идиоматический современный C++. Часть II познакомит вас с миром стандартной библиотеки C++ (stdlib), где вы узнаете самые важные понятия.

Часть I. Основы языка C++

• Глава 1. Создаем и запускаем. Эта вводная глава поможет настроить среду разработки C++. Вы скомпилируете и запустите свою первую программу и узнаете, как ее отладить.

• Глава 2. Типы. Здесь вы познакомитесь с системой типов в C++. Вы узнаете об основных типах — фундаменте, на котором строятся остальные типы. Затем узнаете о старых простых типах данных и полнофункциональных классах, изучите роль конструкторов, инициализации и деструкторов.

• Глава 3. Ссылочные типы. В этой главе вы познакомитесь с объектами, которые хранят адреса других объектов в памяти. Эти типы являются краеугольным камнем многих важных паттернов программирования и позволяют создавать гибкий и эффективный код.

• Глава 4. Жизненный цикл объекта. Обсуждение инвариантов класса и конструктора продолжается в контексте продолжительности хранения. Деструктор вводится вместе с парадигмой инициализации ресурсов (RAII). Вы узнаете об исключениях и о том, как они реализуют инварианты классов и дополняют RAII. После обсуждения семантики перемещения и копирования вы узнаете, как их реализовать с помощью конструкторов и операторов присваивания.

• Глава 5. Полиморфизм во время выполнения. Рассказывает об интерфейсах — концепции программирования, которая позволяет писать код, являющийся полиморфным во время выполнения. Вы изучите базис наследования и композиции объектов, которые лежат в основе использования интерфейсов в C++.

• Глава 6. Полиморфизм во время компиляции. В этой главе представлены шаблоны — языковая конструкция, позволяющая писать полиморфный код. Вы также изучите концепции, которые будут добавлены в будущем выпуске C++, и именованные функции преобразования, позволяющие преобразовывать объекты из одного типа в другой.

• Глава 7. Выражения. Здесь речь пойдет об операндах и операторах. Хорошо разбираясь в типах, жизненном цикле объектов и шаблонах, вы будете готовы погрузиться в основные компоненты языка C++. Инструкции — первая остановка на этом пути.

• Глава 8. Инструкции. В этой главе рассматриваются элементы, составляющие функции. Вы узнаете об операторах выражений, составных операторах, операторах объявлений, операторах итерации и операторах перехода.

• Глава 9. Функции. В последней главе части I подробно рассматривается группировка утверждений в единицы работы. Вы узнаете подробности об определениях функций, типах возвращаемых данных, разрешении перегрузки, переменных функциях, переменных шаблонах и указателях функций. Вы также узнаете, как создавать вызываемые пользовательские типы, используя оператор вызова функции и лямбда-выражения. Вы изучите std::function, класс, который предоставляет единый контейнер для хранения вызываемых объектов.

Часть II. Библиотеки и фреймворки С++

• Глава 10. Тестирование. Эта глава познакомит с удивительным миром фреймворков юнит-тестирования и имитации (мокирования). Вы попрактикуетесь в разработке через тестирование на примере автономной системы вождения, изучая такие фреймворки, как Boost Test, Google Test, Google Mock и другие.

• Глава 11. Умные указатели. Здесь описываются специальные служебные классы, которые предоставляет stdlib для управления владением динамическими объектами.

• Глава 12. Утилиты. Здесь вы найдете обзор типов, классов и функций, имеющихся в библиотеках stdlib и Boost для решения распространенных проблем программирования. Вы узнаете о структурах данных, числовых функциях и генераторах случайных чисел.

• Глава 13. Контейнеры. В этой главе рассматриваются специальные структуры данных из библиотек Boost и stdlib, которые помогают организовать данные. Вы узнаете о контейнерах последовательностей, ассоциативных контейнерах и неупорядоченных ассоциативных контейнерах.

• Глава 14. Итераторы. Это интерфейс между контейнерами, о которых вы узнали в предыдущей главе, и строками из следующей главы. Вы узнаете о различных видах итераторов и о том, как их дизайн обеспечивает невероятную гибкость.

• Глава 15. Строки. В этой главе рассказывается, как обрабатывать данные на естественном языке в одном семействе контейнеров. Также узнаете о специальных средствах, встроенных в строки, которые позволяют решать общие задачи.

• Глава 16. Потоки. Здесь вы познакомитесь с основной концепцией, лежащей в основе операций ввода и вывода. Вы узнаете, как обрабатывать потоки ввода и вывода с помощью форматированных и неформатированных операций, а также как использовать манипуляторы. Вы узнаете, как читать и записывать данные из файлов и в файлы.

• Глава 17. Файловые системы. Здесь вы получите обзор возможностей stdlib для управления файловыми системами. Вы узнаете, как создавать и управлять путями, проверять файлы и каталоги и перечислять структуры каталогов.

• Глава 18. Алгоритмы. Эта глава представляет собой краткий справочник по десяткам задач, которые можно легко решить с помощью stdlib. Вы узнаете о впечатляющих возможностях высококачественных алгоритмов.

• Глава 19. Конкурентность и параллелизм. В этой главе рассказывается о некоторых простых методах конкурентного программирования, которые являются частью stdlib. Вы узнаете о фьючерсах, мьютексах, условных переменных и атомарности.

• Глава 20. Сетевое программирование с помощью Boost Asio. Здесь вы узнаете, как создавать высокопроизводительные программы, которые взаимодействуют по сетям. Вы увидите, как использовать Boost Asio с блокирующим и неблокирующим вводом и выводом.

• Глава 21. Создание приложений. Последняя глава завершает книгу обсуждением нескольких важных тем. Вы узнаете о средствах поддержки программ, которые позволяют подключиться к жизненному циклу приложения. Также вы узнаете о Boost ProgramOptions — библиотеке, которая делает написание консольных приложений, принимающих ввод данных пользователем, простым.

Примечание

На сайте ccc.codes вы можете найти фрагменты кода из этой книги.

2Мейерс С. М45 Эффективный и современный С++: 42 рекомендации по использованию С++ 11 и С++14 / Пер. с англ. — М.: ООО «ИЛ. Вильямс», 2016. — 304 с. — Примеч. ред.

3 На русском языке можно найти перевод специального издания книги: Страуструп Б. Язык программирования С++. Специальное издание. М: Бином, 2020. — 1136 с. — Примеч. ред.

Часть 1. Основы языка C++

Сначала мы просто ползаем. А потом ползаем по битому стеклу.

Скотт Мейерс, «Эффективный STL»

Часть 1 посвящена важнейшим основным концепциям языка C++. Глава 1 расскажет, как настроить рабочую среду и запустить некоторые языковые конструкции, включая основы объектов, базовую абстракцию, использующуюся для программирования на C++.

В следующих пяти главах рассматриваются объекты и типы — сердце и душа C++. В отличие от некоторых других книг по программированию, вам не придется с нуля строить веб-серверы или запускать ракетные корабли. Все программы в первой части просто печатаются в командной строке. Основное внимание уделяется построению ментальной модели языка.

В главе 2 подробно рассматриваются типы — языковая конструкция, определяющая объекты.

Глава 3 на базе главы 2 рассматривает концецию ссылочных типов, которые описывают объекты, ссылающиеся на другие объекты.

Глава 4 описывает жизненный цикл объекта, один из самых мощных аспектов C++.

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

Вооружившись основами объектной модели C++, вы будете готовы погрузиться в главы с 7 по 9. В этих главах представлены выражения, операторы и функции, которые используются для выполнения работы в языке. Может показаться странным, что эти языковые конструкции появляются в конце первой части, но без глубокого знания объектов и их жизненных циклов, не считая самых основных особенностей этих языковых конструкций, их было бы невозможно понять.

Как всеобъемлющий, амбициозный и мощный язык C++ может ошеломить новичка. Чтобы этого не произошло, повествование части 1 ведется последовательно и связно, и ее можно читать как увлекательную историю.

Часть 1 — вступительный взнос. Проделав эту тяжелую работу по изучению основ языка C++ , вы получаете пропуск к «шведскому столу» библиотек и фреймворков, которые можно опробовать во второй части.

1. Создаем и запускаем

…я с такой силой грохнулся вниз, на нашу родную землю, что был совсем оглушен. Благодаря тяжести моего тела, летевшего с такой высоты, я пробил в земле яму глубиной по меньшей мере в девять сажен.

Рудольф Распе, «Удивительные приключения барона Мюнхгаузена»

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

Затем вы изучите основные компоненты среды разработки, а также роль, которую они играют в создании вашего первого приложения. В следующих главах будет описано достаточно основ C++ для создания полезных примеров программ.

Язык С ++ имеет репутацию трудного в изучении. Это правда: C++ — большой, сложный и амбициозный язык, и даже опытные программисты на C++ регулярно изучают новые шаблоны, функции и способы использования.

Главная причина в том, что в C++существуют весьма тесные связи. К сожалению, это часто вызывает некоторое беспокойство у новичков. Поскольку концепции C++ тесно связаны между собой, просто непонятно, к чему стремиться. В первой части этой книги я помогу вам пройти через тернии С++, но наш путь должен с чего-то начинаться. Эта глава охватывает достаточно концепций для старта. Пока не углубляйтесь в деатали!

Структура базовой программы на С++

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

Начнем погружение и создадим первый исходный файл на C++.

Создание первого исходного файла на С++

Откройте свой любимый текстовый редактор. Если у вас еще нет любимых, попробуйте Vim, Emacs или gedit в Linux; TextEdit на macOS или Блокнот (Notepad) в Windows. Введите код из листинга 1.1 и сохраните полученный файл на рабочий стол под именем main.cpp.

Листинг 1.1. Ваша первая программа на C++ выводит Hello, world! на экран

#include <cstdio> 

int main(){

  printf("Hello, world!"); 

  return 0; 