Продвинутый курс C++

Старт обучения
Берестейская 06.02.2020
Позняки Дату уточните у администрации
ВДНХ Дату уточните у администрации
51 час. по 2-3 раза в неделю

Описание курса

Продвинутый курс C++ поможет усовершенствовать навыки ООП. Вы научитесь работать со стандартной библиотекой C++, освоите основные возможности библиотеки Qt, получите практический опыт разработки GUI-приложений. Мы обучим вас приемам разработки ПО, решениям типичных задач программирования и разработки GUI-приложений на языке С++ с помощью библиотеки Qt. Вы узнаете о контейнерах, алгоритмах и адаптерах, разберетесь в архитектуре приложений и базах данных, поработаете с многопоточностью и модульным тестированием ПО.

После курса вы сможете:

  • Усовершенствуете навыки объектно-ориентированного программирования, анализа и проектирования
  • Работать со стандартной библиотекой С++ и библиотекой Qt
  • Разрабатывать GUI-приложения
  • Претендовать на получение высокооплачиваемой работы

Программа курса:

  • Конструкторы/деструкторы
    • Правила генерации конструкторов до С++11
    • Что такое rvalue ссылки
    • Перемещающий конструктор и перемещающий оператор присвоения
    • Правила генерации конструкторов и операторов присваивания после С++11 
    • Функция std::move. Неправильное применение функции std::move в качестве возвращаемого значения
    • Разница между объявлением конструкторов и операторов присваивания как приватные методы и объявление их с помощью ключевого слова delete
    • Зачем вообще нужно писать конструкторы и операторы присваивания как недоступные
    • Важность объявления конструкторов с помощью  ключевого слова default
    • Что такое delegating constructors
    • Простое понимание что такое NRVO и RVO 
    • Проблемы влияния пользовательского конструктора на неявное преобразования типов. Ключевое слово explicit
    • Reference-qualified методы класса
  • Статический полиморфизм
    • Более детальное понимание перегрузки функции. Ключевое понятие mangling и рассмотрение примера перегрузки на примере таблицы символов
    • Шаблоны и шаблоны класса. Правила вывода типов для шаблонных параметров. Trailing return type
    • Проблематика шаблонов. Проблемы инстанцирования. Способы явного инстанцирования
    • Пример написания класса array, как аналог замены встроенного статического массива
  • Динамический полиморфизм
    • Особенности работы с динамическим полиморфизмом (virtual functions)
    • Важные нововведения, начиная с С++11 для безопасной работы с динамическим полиморфизмом
    • Ключевое слово final в контексте виртуальных функций
    • Аргумент по умолчанию и какие он скрывает проблемы в контексте виртуальных функций
    • Структура type_info
    • Когда именно полезен динамический полиморфизм
  • Более сложные применение шаблонов
    • Структура std::enable_if, зачем это может пригодиться. Элегантная замена сложности std::enable_if, начиная с С++17 
    • Метапрограммирование, рассмотрение заголовочного файла <type_traits> как способ получения метаинформации о типе. Его применения на примере простого шаблона
    • Функция std::forward
    • Шаблоны с переменным числом параметров, понятие свертки
    • Шаблонные конструкторы
    • Вспомогательные шаблоны std::pair, шаблон std::tuple. Какие проблемы они решают 
  • Написание библиотек на языке С++
    • Что такое разделяемые библиотеки
    • Что такое статические библиотеки
    • Разница в написании статических и динамических библиотек
    • Пример написания двух видов библиотек
    • Написание С++ библиотеки для подключения ее в С код и С++ код
    • Возможные проблемы при написании библиотек
    • Раздельная компиляция (многомодульность) и линковка
  • Вывод типа в С++ (type deduction)
    • Вывод типа с помощью ключевого слова auto: такой ли тип на самом деле?
    • Ключевое слово decltype
    • Константные ссылки как средство пролонгации времени жизни объекта и подводные камни
  • Исключительные ситуации
    • Простое понимание исключительных ситуаций. Что такое раскрутка стека
    • Ключевое слово noexcept. Его особенности
    • Висячие ссылки и висячие указатели
    • Исключительные ситуации в конструкторе и деструкторе.
      noexcept деструкторы и конструкторы
    • Нужны ли исключительные ситуации. то такое обработка ошибок в стиле С, нужна ли она и какие ее преимущества в сравнении с исключительными ситуациями
  • Умные указатели
    • Паттерн проектирования RAII
    • Проблемы при использовании С-подхода динамического выделения памяти для объектов
    • Что такое менеджер памяти и простое понимание выделения памяти.
    • Виды умных указателей. Какую проблему они решают
    • Зачем нужны вспомогательные функции (make_unique и т.д.). Какую проблематику они решают
    • Всегда ли стоит применять умные указатели, возможные проблемы производительности
    • std::static_pointer_cast, std::dynamic_pointer_cast. В чем их отличие от static_cast и dynamic_cast
    • Стоит ли проверять созданные умные указатели на nullptr. Когда умные указатели кидают исключения, а когда возвращают nullptr
  • Введение в STL
    • Что такое STL
    • Немного о структуре STL
    • Стоит ли знать всю библиотеку STL
  • Контейнеры в библиотеке STL
    • Последовательные контейнеры. Виды последовательных контейнеров, их отличие. Особенности работы с каждым из контейнеров
    • Рассмотрение основного функционала последовательных контейнеров
    • Ассоциативные контейнеры. Виды ассоциативных контейнеров, их основные отличия. Особенности работы. Рассмотрение основного функционала ассоциативных контейнеров
    • Какие задачи решают последовательные контейнеры и ассоциативные контейнеры
    • В каких случаях не стоит применять контейнеры. Накладные расходы на применения контейнеров
    • Возможные подводные камни работы как с последовательными, так и с ассоциативными контейнерами
    • Классы адаптеры контейнеров. Виды и их особенности
    • Что такое аллокатор в качестве параметра контейнера. Когда стоит писать свой аллокатор, а когда нет
  • Класс std::string
    • Рассмотрение основных возможностей класса std::string. Ошибки при создании и инициализации класса std::string
    • Рассмотрения основных методов работы с классом std::string 
  • Итераторы
    • Виды итераторов
    • Применение итераторов для каждого вида контейнера
    • Способ работы с итераторами
    • Вспомогательные функции для работы с итераторами
    • Что означает begin-итератор  и end-итератор
    • Range for C++ как элегантный способ обхода контейнеров
  • Алгоритмы STL
    • Виды алгоритмов
    • Рассмотрение самых часто используемых алгоритмов
    • Итераторы как клей между контейнером и алгоритмом
    • Все ли виды алгоритмы применимы ко всем типам контейнеров. Что нужно понимать в интерфейсе алгоритма
    • Преимущества применения методов контейнеров над алгоритмами
    • Преимущества применения алгоритмов над методами контейнеров
  • Компаратор
    • Что такое компаратор и его специфика применения в алгоритмах и некоторых контейнерах
    • Что такое указатель на функцию
    • Что такое функциональный объект
    • Описание функции std::bind
    • Что такое лямбда и что общего между функциональным объектом. Что такое список захвата и зачем он нужен. Особенности захвата переменных. Ключевое слово mutable и его применение к захваченным параметрам лямбды. Как передать лямбду в С-функцию. Отличие лямбды в С++11 и C++14
    • Способ генерации лямбды-функции. Типичные ошибки в написании лямбды
    • Класс std::function
  • Процессы и потоки
    • Что такое процесс. Описание работы процесса, выделение памяти, и связанные с ним расходы.Что такое поток. Проблемы связанные с многопоточностью
    • Что такое планировщик
  • Потоки в С++
    • std::thread и способы работы. Передача параметров в потоки
    • Проблемы, связанные с классом std::thread. Что такое join и detach
    • Что такое асинхронное выполнение потока и синхронное выполнение
    • std::async. Какие его преимущества в сравнении с std::thread
    • Параметры при создании std::async
    • Что такое std::future
    • Что такое разделяемые данные. Стоит ли использовать подход «разделение данных»
    • Ошибочное понимание volatile-переменных в контексте потоков. Что такое барьеры памяти. Класс std::atomic, для чего он нужен, связанные с ним накладные расходы
    • Ошибочное понимание std::shared_ptr в многопоточном программировании
    • Что такое race condition и data race, причины их получения
    • Объекты синхронизации потоков, доступных в стандартной библиотеке
    • Что такое дедлок и механизмы его решения в стандартной библиотеке
    • std::promise: что это такое. Его применение в контексте многопоточности. std::future + std::promise vs conditional variable
    • Исключительные ситуации в потоках
    • Что такое пул потоков и какие он решает проблемы
  • Сетевое программирование
    • Что такое сетевое программирование
    • Виды часто используемых протоколов. Что такое TCP и UDP протоколы 
    • Когда их стоит применять
    • Что такое сокеты, их виды и применение
    • Что такое межпроцессорное взаимодействия (IPC). Зачем нужно межпроцессорное взаимодействие. Какие оно решает проблемы
    • Рассмотрение часто используемых подходов IPC
  • Введение в Qt
    • Meta object compiler
    • Сигналы и слоты
    • QObject
    • Базовая работа с виджетами
    • Event loop
    • Структура фреймворка
  • Введение в QML
    • Структура QML компонентов
    • Компоненты QtObject, Item
    • Базовые графические компоненты
    • Best practices в QML
    • Взаимодействие C++ & QML
    • - Q_PROPERTY
    • - Q_INVOKABLE
    • Компоненты ListView, GridView
    • Кастомизация компонентов
    • Attached properties
    • Scalability-приложения
    • Сигналы/cлоты в QML
    • Свойства, алиасы
    • Регистрация своих классов в метасистеме
  • Model View в Qt
    • Понятие модели, их виды
    • Понятие делегата
    • Понятие роли
    • Понятие view, их виды
    • Реализация своей модели, её регистрация, базовые методы
    • QAbstractListModel
    • Создание кастомных компонентов-делегатов с использованием ролей
      qmldir, разбивка приложения на модули
    • Использование стилей в QML
    • QVariant
  • Работа с базами данных в Qt
    • Подключение к базе данных
    • Классы QDir, QStandardPaths
    • Выполнение SQL запросов
    • Создание SQL-таблиц
    • Обработка ошибок
    • Привязка значений
    • QVariantList
    • Qt контейнеры, их преимущества и недостатки
    • Copy-on-write
    • Java style iterators vs stl style iterators
  • Многопоточность в Qt
    • Сравнение C++ потоков и многопоточности в Qt
    • Многопоточность на сигналах и слотах
    • QEventLoop
    • QThread
    • QtConcurrent

Минимальные требования:

  • Наличие собственного ноутбука для занятий в аудиториях
  • Знание основ программирования
  • Основы С++

* Примечание: указанные скидки не суммируются с другими действующими акциями и специальными предложениями. Скидка применяется только к новым заявкам и при условии полной оплаты. Если у Вас возникли вопросы, обращайтесь за консультацией к нашим менеджерам!

spinner-it