C++ Primer, пятый выпуск
Полное и авторитетное руководство по C++, полностью переработанное для стандарта C++11. Этот курс охватывает все — от базовых элементов языка до сложных библиотечных возможностей и продвинутых инструментов создания классов.
Обзор курса
📚 Краткое содержание
Полное и авторитетное руководство по C++, полностью переписанное для стандарта C++11. Этот курс охватывает всё — от базовых элементов языка до сложных возможностей библиотеки и продвинутых инструментов разработки классов.
Окончательный стандарт отрасли для освоения современного программирования на C++11.
Авторы: Стэнли Б. Липпман, Жоссе Лажуа, Барбара Э. Му
Благодарности: Дэйв Абрахамс, Энди Коениг, Стефан Т. Лававей, Джейсон Меррилл, Джон Спайсер, Херб Саттер, Бьярне Страуструп, Алекс Степанов и члены комитета по стандартизации.
🎯 Цели обучения
- Определить и реализовать функцию
main, понимая её взаимодействие с операционной системой. - Выполнять компиляцию из командной строки и управлять базовыми потоками ввода-вывода (
cin,cout). - Применять операторы управления потоком для решения задач итеративной логики, таких как подсчёт количества вхождений.
- Реализовывать логические структуры для подсчёта и обработки последовательных вхождений входных данных.
- Различать операторы присваивания (
=) и равенства (==) внутри условных конструкций. - Использовать объекты классов (
Sales_item), обращаться к методам через точечную нотацию и подключать пользовательские заголовочные файлы. - Различать различные примитивные типы и предсказывать результаты преобразований типов и переполнения беззнаковой арифметики.
- Реализовывать возможности C++11, включая списковую инициализацию,
nullptr,constexprи спецификаторы вывода типа. - Различать объявления и определения переменных, применять правила области видимости для управления доступностью идентификаторов.
- Различать ссылки и указатели, использовать
void*для универсального управления памятью.
🔹 Урок 1: Введение в C++ и базовый ввод-вывод
Обзор: В этом уроке рассматриваются основные структурные элементы программы на C++, с акцентом на функцию main, базовые типы данных и процесс компиляции. Изучается ключевая работа с вводом-выводом (I/O) с помощью библиотеки iostream, реализация логики с помощью циклов while и for, а также введение в концепции объектно-ориентированного программирования через класс Sales_item.
Результаты обучения:
- Определить и реализовать функцию
main, понимая её взаимодействие с операционной системой. - Выполнять компиляцию из командной строки и управлять базовыми потоками ввода-вывода (
cin,cout). - Применять операторы управления потоком для решения задач итеративной логики, таких как подсчёт количества вхождений.
🔹 Урок 2: Управление потоком и основы классов
Обзор: В этом уроке происходит переход от базового управления потоком к фундаментальной мощи C++ — классам. Учащиеся освоят логику обработки потоков данных (подсчёт последовательных вхождений) и научатся использовать класс Sales_item для работы с комплексными структурами данных так же легко, как со встроенными типами. Урок завершается реализацией функциональной программы книжного магазина, включающей перенаправление файлов и отчёт об ошибках.
Результаты обучения:
- Реализовывать логические структуры для подсчёта и обработки последовательных вхождений входных данных.
- Различать операторы присваивания (
=) и равенства (==) внутри условных конструкций. - Использовать объекты классов (
Sales_item), обращаться к методам через точечную нотацию и подключать пользовательские заголовочные файлы.
🔹 Урок 3: Примитивные типы и переменные
Обзор: В этом уроке закладываются основные блоки программирования на C++, исследуя арифметические типы, жизненные циклы переменных и модель памяти. Учащиеся освоят тонкости преобразований типов (особенно беззнаковых), синтаксис списковой инициализации в C++11, а также важные различия между указателями и ссылками. Урок завершается изучением расширенных систем типов, включая квалификаторы const, вывод типов (auto, decltype) и создание надёжных пользовательских структур данных с использованием директив препроцессора.
Результаты обучения:
- Различать различные примитивные типы и предсказывать результаты преобразований типов и переполнения беззнаковой арифметики.
- Реализовывать возможности C++11, включая списковую инициализацию,
nullptr,constexprи спецификаторы вывода типа. - Различать объявления и определения переменных, применять правила области видимости для управления доступностью идентификаторов.
🔹 Урок 4: Составные типы и современные квалификаторы типов
Обзор: В этом уроке рассматриваются сложные механизмы системы типов в C++11, с акцентом на взаимодействие составных типов (указателей и ссылок) с квалификаторами типов, такими как const и constexpr. Учащиеся освоят тонкости вывода типов с помощью auto и decltype, а также научатся инкапсулировать данные в пользовательских структурах, защищённых директивами препроцессора.
Результаты обучения:
- Различать ссылки и указатели, использовать
void*для универсального управления памятью. - Классифицировать и применять верхний и нижний уровни квалификаторов
constиconstexprдля констант времени компиляции. - Реализовывать вывод типов в C++11 (
autoиdecltype) для написания гибкого и поддерживаемого кода.
🔹 Урок 5: Строки и векторы стандартной библиотеки
Обзор: В этом уроке рассматриваются фундаментальные типы стандартной библиотеки C++ — string и vector, которые предлагают более гибкие и безопасные альтернативы встроенным типам. Учащиеся узнают, как управлять доступом к пространствам имён с помощью директив using, инициализировать и управлять строками переменной длины и контейнерами, а также эффективно обрабатывать коллекции данных с помощью циклов с диапазоном и итераторов.
Результаты обучения:
- Упрощать код с помощью директив
usingв пространствах имён, избегая распространённых ошибок в заголовочных файлах. - Производить надёжную инициализацию строк и векторов, включая списковую инициализацию в C++11.
- Реализовывать обработку символов на уровне текста и динамическое увеличение контейнеров с помощью
push_back, циклов с диапазоном и базовых операций итераторов.
🔹 Урок 6: Итераторы и встроенные массивы
Обзор: В этом уроке рассматриваются фундаментальные механизмы навигации и управления последовательностями в C++11. Переход от современных высокоуровневых инструментов, таких как итераторы для string и vector, к низкоуровневым встроенным массивам, арифметике указателей и строкам в стиле С. Учащиеся научатся интегрировать устаревший код, использующий массивы, с современными контейнерами стандартной библиотеки, а также управлять сложными многомерными структурами.
Результаты обучения:
- Использовать итераторы и арифметику итераторов для навигации и изменения контейнеров
stringиvector. - Определять, инициализировать и перемещаться по встроенным массивам с помощью арифметики указателей и функций библиотеки
begin/end. - Реализовывать операции со строками в стиле С и безопасно интегрировать встроенные массивы с современными типами библиотеки.
🔹 Урок 7: Выражения, операторы и преобразования
Обзор: В этом уроке рассматриваются фундаментальные строительные блоки выражений в C++, с акцентом на то, как язык оценивает операции и управляет типами данных. Учащиеся освоят различие между левыми значениями (lvalues) и правыми значениями (rvalues), правила приоритета и ассоциативности операторов, а также механику арифметических, логических и побитовых операций. Кроме того, урок глубоко погружает в управление типами в C++, включая неявные арифметические преобразования и безопасное применение явных именованных приведений типов.
Результаты обучения:
- Различать левые значения (идентификация объекта) и правые значения (значение объекта) и понимать их роль в выражениях.
- Предсказывать порядок вычисления сложных выражений с учётом приоритета, ассоциативности и логики короткого замыкания.
- Выполнять низкоуровневую манипуляцию данными с помощью побитовых операторов и обеспечивать безопасность типов с помощью неявных преобразований и явных именованных приведений.
🔹 Урок 8: Расширенные операторы и обработка исключений
Обзор: В этом уроке рассматриваются ключевые структуры управления потоком в C++, от базовых типов операторов и правил лексической области видимости до продвинутой условной и итеративной логики. Также вводятся надёжные техники обработки ошибок с помощью механизмов обработки исключений в C++ и иерархии исключений стандартной библиотеки.
Результаты обучения:
- Различать пустые, простые и составные операторы, управлять областью видимости переменных внутри этих структур.
- Реализовывать сложное принятие решений с помощью операторов
ifиswitch, разрешая логические ошибки, такие как «висящее else». - Выбирать и применять подходящий итеративный конструктив (
while,for,range for,do while) для конкретных задач программирования.
🔹 Урок 9: Проектирование функций и передача аргументов
Обзор: В этом уроке рассматриваются архитектурные принципы функций в C++, с акцентом на то, как данные передаются внутрь и возвращаются из модульных блоков кода. Изучается жизненный цикл локальных объектов, механика передачи аргументов (по значению против по ссылке) и стандарт C++11 для обработки переменного числа параметров. Освоение этих концепций позволяет программистам писать эффективный, повторно используемый и безопасный по памяти код.
Результаты обучения:
- Различать методы инициализации параметров и их влияние на производительность и целостность данных.
- Реализовывать надёжные интерфейсы функций с использованием квалификаторов
const,initializer_listи способов передачи массивов. - Эффективно управлять временем жизни объектов с помощью автоматического и статического хранения.
🔹 Урок 10: Расширенные возможности и перегрузка функций
Обзор: В этом уроке рассматриваются тонкие механизмы функций в C++, с акцентом на передачу параметров, время жизни объектов и сложности перегрузки функций. Учащиеся освоят возможности C++11, такие как initializer_list для переменного числа параметров, функции constexpr и объявление и использование указателей на функции для создания гибкого, модульного кода.
Результаты обучения:
- Различать передачу по значению и по ссылке, определять, когда использовать параметры
const. - Применять правила разрешения перегрузки для определения «наилучшего соответствия» среди кандидатов и допустимых функций.
- Реализовывать и управлять указателями на функции, включая их использование в контейнерах, таких как
vector, и как возвращаемые типы.
🔹 Урок 11: Инкапсуляция классов и конструкторы
Обзор: В этом уроке рассматривается переход от простых структур данных к абстрактным типам данных (АТД) в C++. Акцент делается на механике проектирования классов, включая методы, неявный указатель this и критическую роль конструкторов в инициализации объектов. Кроме того, изучается инкапсуляция через контроль доступа (public/private) и использование «друзей» для поддержания чистого интерфейса при скрытии деталей реализации.
Результаты обучения:
- Проектировать и реализовывать классы на C++ (например,
Sales_data), отделяя интерфейс от реализации. - Освоить правила инициализации объектов с помощью конструкторов по умолчанию, перегруженных и явных.
- Применять спецификаторы доступа и дружбу для обеспечения инкапсуляции и управления областью видимости класса.
🔹 Урок 12: Область видимости класса и управление преобразованиями
Обзор: В этом уроке рассматриваются продвинутые механизмы проектирования классов в C++, с акцентом на переход от простых структур данных к надёжным абстрактным типам данных (АТД). Основные темы: управление инициализацией объектов с помощью различных типов конструкторов, контроль неявных преобразований типов с помощью ключевого слова explicit, а также понимание элементов уровня класса, таких как static-члены и литеральные классы.
Результаты обучения:
- Проектировать и реализовывать инкапсулированные классы (АТД) с использованием спецификаторов доступа и объявлений друзей.
- Управлять неявными преобразованиями типов классов и подавлять их с помощью ключевого слова
explicit. - Реализовывать и инициализировать
static-члены класса для управления данными на уровне всего класса.
🔹 Урок 13: Потоки ввода-вывода и основы последовательных контейнеров
Обзор: В этом уроке рассматриваются фундаментальные механизмы системы ввода-вывода стандартной библиотеки C++ и последовательных контейнеров. Учащиеся научатся управлять состоянием потока и буферами вывода, выполнять ввод-вывод с файлами и строками, а также навигироваться по последовательным контейнерам библиотеки. Урок акцентирует внимание на ключевых концепциях диапазонов итераторов, инициализации контейнеров и последствиях управления памятью контейнеров.
Результаты обучения:
- Опросить и сбросить состояние потока, контролировать сброс буфера вывода для обеспечения целостности потока.
- Использовать
fstreamиsstreamдля постоянного и оперативного хранения данных с различными режимами файлов. - Выбирать подходящие последовательные контейнеры в зависимости от паттернов доступа и затрат на память для оптимизации выбора.
🔹 Урок 14: Операции с контейнерами и универсальные алгоритмы
Обзор: В этом уроке рассматриваются управление последовательными контейнерами в C++ и применение универсальных алгоритмов для обработки данных независимо от типа контейнера. Исследуется, как контейнеры управляют ростом памяти и жизненным циклом элементов, а также использование лямбда-выражений и функциональных связок для настройки алгоритмов библиотеки. Учащиеся освоят архитектуру библиотеки, включая категории итераторов и специализированные алгоритмы.
Результаты обучения:
- Управлять жизненным циклом контейнеров с помощью специализированных операций для
forward_list, техник изменения размера и управления ёмкостьюvector. - Выполнять сложные манипуляции со строками и преобразования чисел с использованием расширенной библиотеки
stringи адаптеров контейнеров. - Реализовывать универсальные алгоритмы для чтения, записи и перестановки данных, настраивая поведение с помощью предикатов, лямбда-выражений и
std::bind.
🔹 Урок 15: Ассоциативные контейнеры и умные указатели
Обзор: В этом уроке рассматриваются стандарты C++11 для ассоциативных контейнеров и динамического управления памятью. Подробно описывается использование упорядоченных и неупорядоченных контейнеров для эффективного поиска по ключам, а также реализация надёжного, безопасного по исключениям кода с помощью умных указателей. Урок завершается проектированием реального приложения для поиска текста, интегрирующего эти сложные структуры данных.
Результаты обучения:
- Реализовывать и управлять ассоциативными контейнерами с использованием эффективных методов поиска, вставки и индексирования.
- Освоить управление динамической памятью, переходя от ручного
new/deleteк умным указателям на основе RAII и классуallocator. - Проектировать сложные системы, совместно использующие данные между классами с помощью подсчёта ссылок и владения умными указателями.
🔹 Урок 16: Управление ресурсами и семантика перемещения
Обзор: В этом уроке рассматривается, как классы в C++ управляют жизненным циклом своих ресурсов через «Пять больших» специальных членов. Учащиеся научатся управлять динамической памятью с помощью стратегий, похожих на значение и на указатель, реализовывать безопасный по исключениям идиомы копирования и обмена, а также оптимизировать производительность с помощью семантики перемещения и ссылок на временные объекты в C++11.
Результаты обучения:
- Реализовывать и объяснять правило трёх/пяти для обеспечения правильного управления ресурсами и предотвращения утечек памяти.
- Различать поведение классов по типу значения и по типу указателя, реализовывать подсчёт ссылок.
- Применять семантику перемещения с помощью ссылок на временные объекты и
std::moveдля устранения ненужных глубоких копий больших объектов.
🔹 Урок 17: Перегрузка операторов и наследование (ООП)
Обзор: В этом уроке рассматриваются расширение синтаксиса языка через перегрузку операторов и построение масштабируемых систем с помощью объектно-ориентированного программирования (ООП). Учащиеся научатся проектировать классы, интегрируемые с встроенными операциями, а также освоят механику наследования, динамическое связывание и полиморфные иерархии классов.
Результаты обучения:
- Проектировать и реализовывать перегруженные операторы, следуя конвенциям стандартной библиотеки C++.
- Создавать и использовать объекты-функции и обёртки типа
functionдля унификации вызываемых сущностей. - Конструировать надёжные иерархии наследования с использованием виртуальных функций, абстрактных базовых классов и спецификаторов доступа в C++11.
🔹 Урок 18: Шаблоны и генерическое программирование
Обзор: В этом уроке рассматриваются фундаментальные и продвинутые механизмы шаблонов в C++, обеспечивающие основу для генерического программирования. Учащиеся переходят от определения базовых функций и классов-шаблонов к мастерству специфических возможностей C++11, таких как переменные шаблоны, идеальное перенаправление и специализация шаблонов.
Результаты обучения:
- Определять и инстанциировать функции и классы-шаблоны с использованием как типовых, так и нетиповых параметров.
- Управлять моделью компиляции шаблонов и контролировать инстанцирование в разных файлах с помощью
extern template. - Реализовывать продвинутые техники вывода, включая вывод возвращаемого типа и идеальное перенаправление с помощью
std::forward.
🔹 Урок 19: Специализированные инструменты библиотеки и крупные системы
Обзор: В этом уроке рассматриваются продвинутые компоненты стандартной библиотеки C++11 и языковые особенности, предназначенные для разработки сложных систем. Охватываются специализированные структуры данных, надёжная проверка шаблонов с помощью библиотеки regex, архитектурные инструменты для крупномасштабного программирования. Кроме того, исследуются продвинутые техники обработки исключений, управление пространствами имён и сложности множественного наследования.
Результаты обучения:
- Использовать
tupleдля возврата нескольких значений иbitsetдля эффективного управления флагами на уровне битов. - Реализовывать сложное соответствие шаблонов, проверку и трансформацию строк с помощью библиотеки
regex. - Генерировать высококачественные случайные числа с помощью генераторов и распределений, сохраняя правильное состояние и начальные значения.