К курсам
AI037 Undergraduate

C++ Primer, пятый выпуск

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

5.0
57.0h
601 учеников
0 лайки
Искусственный интеллект
Начать обучение

Обзор курса

📚 Краткое содержание

Полное и авторитетное руководство по C++, полностью переписанное для стандарта C++11. Этот курс охватывает всё — от базовых элементов языка до сложных возможностей библиотеки и продвинутых инструментов разработки классов.

Окончательный стандарт отрасли для освоения современного программирования на C++11.

Авторы: Стэнли Б. Липпман, Жоссе Лажуа, Барбара Э. Му

Благодарности: Дэйв Абрахамс, Энди Коениг, Стефан Т. Лававей, Джейсон Меррилл, Джон Спайсер, Херб Саттер, Бьярне Страуструп, Алекс Степанов и члены комитета по стандартизации.

🎯 Цели обучения

  1. Определить и реализовать функцию main, понимая её взаимодействие с операционной системой.
  2. Выполнять компиляцию из командной строки и управлять базовыми потоками ввода-вывода (cin, cout).
  3. Применять операторы управления потоком для решения задач итеративной логики, таких как подсчёт количества вхождений.
  4. Реализовывать логические структуры для подсчёта и обработки последовательных вхождений входных данных.
  5. Различать операторы присваивания (=) и равенства (==) внутри условных конструкций.
  6. Использовать объекты классов (Sales_item), обращаться к методам через точечную нотацию и подключать пользовательские заголовочные файлы.
  7. Различать различные примитивные типы и предсказывать результаты преобразований типов и переполнения беззнаковой арифметики.
  8. Реализовывать возможности C++11, включая списковую инициализацию, nullptr, constexpr и спецификаторы вывода типа.
  9. Различать объявления и определения переменных, применять правила области видимости для управления доступностью идентификаторов.
  10. Различать ссылки и указатели, использовать 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.
  • Генерировать высококачественные случайные числа с помощью генераторов и распределений, сохраняя правильное состояние и начальные значения.