Курс C++ Pro

Старт обучения
Дату уточните у администрации
108 час. по 2-3 раза в неделю

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

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

 

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

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

  • Использовать основные структуры данных для создания программ
  • Применять принципы ООП для разработки программ
  • Разрабатывать консольные приложения в ОС Linux
  • Работать со стандартной библиотекой С++ и библиотекой Qt
  • Писать GUI-приложения
  • Работать как в команде, так и соло на фрилансе
  • Владеть тайм-менеджментом для эффективного планирования и выполнения задач

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

1. Немного истории

  • Что такое язык программирования
  • Машинные языки
  • Низкоуровневые языки (язык ассемблера)
  • Высокоуровневые языки
  • Трансляторы
  • Компиляция
  • Интерпретация
  • Парадигмы программирования
  • Модульная парадигма программирования
  • Функциональная парадигма программирования
  • Обобщенная парадигма программирования
  • Объектно ориентированная парадигма программирования
  • История С++

2. Основы системы контроля версии GIT

  • Что такое система контроля версии и что она решает
  • Основные элементы git
  • Что такое коммит
  • Что такое ветка
  • Способы создания репозитория. Виды сервисов, позволяющие создать удаленный репозиторий
  • Базовые команды git
  • Практика. Создания репозитория локально. Создания репозитория на удаленном сервере

3. Состав языка С++

  • Пример простой программы С++
  • Базовые способы собрать приложение
  • Алфавит языка
  • Что такое лексемы
  • Что такое идентификатор как важная составляющая программы
  • Что такое ключевые слова
  • Комментарии (однострочные, многострочные)
  • Что такое литера. Виды литералов. И зачем они нужны в коде
  • Чем отличаются строковый литерал от остальных типов литералов
  • Что такое инструкции
  • Что значит синтаксическая ошибка. Пример простой синтаксической ошибки
  • Что такое семантическая ошибка. Пример семантической ошибки и возможные ее последствия

4. Переменные и типы данных

  • Что такое переменная. Синтаксис объявления переменной
  • Тип данных. Что такое строгая типизация. Зачем переменной нужен тип данных
  • Целочисленный тип данных
  • Символьные типы
  • Начиная с С++11, целочисленные типы с фиксированными размером, какие проблемы они решают
  • Что такое алиас на тип данных. Пример с описанием typedef.
  • Понимания типов size_t, time_t — это просто алиас на встроенный тип
  • Тип void как маркер разного контекста. Пример контекста использования этого типа
  • Логический тип данных
  • Вещественные типы данных. Возможные подводные камни представления в памяти
  • Простой пример на ассемблере способа представления целочисленных типов и вещественных типов
  • Способы объявления переменных. Инициализация переменных.
  • Проблема неинициализированных переменных
  • Оператор sizeof для получения размера переменных и типов
  • Способы инициализации переменных до С++11 и универсальная инициализация начиная с С++11 как средство решения проблем старой инициализации
  • Автоматический вывод типа. Ключевое слово auto и decltype
  • Константы
  • Способы объявления констант
  • Что такое свертка констант. Пример С++-кода с объявлением констант и оптимизированного ассемблерного кода

5. Основные операции С++

  • Виды операторов (унарный, бинарный, тернарный). Их синтаксис
  • Неявное преобразование при операторе присвоения. Что такое срезка.
  • Что такое сужающее преобразование. Проблема знакового и беззнакового преобразования
  • Явное преобразования типов (С-подход и С++-подход)
  • Арифметические операции
  • Проблема арифметических операций. Целочисленное деление на ноль, переполнение и т.д.
  • Смешанные выражения. Приоритет операций
  • Автоматический вывод типа как решение проблемы переполнения в арифметических выражениях
  • Временная переменная как результат промежуточного вычисления выражения. Как выглядит временная переменная в сгенерированном ассемблерном коде (простое описание)
  • Базовые понятия Rvalue и Lvalue
  • Составной оператор
  • Пост- и пре-инкремент и декремент. В чем отличие между пре- и пост- операцией
  • Операторы отношения между операндами. Возможные подводные камни
  • Логические операции
  • Битовые операции. Что такое установка бита, что такое сброс бита. Что такое little-endian и big-endian. Что такое битовые маски, пример битовых масок до С++11 и начиная с С++11
  • Описание разницы между логическим сравнением с применением логических операторов {|| &&} и битовыми операциями {| &}
  • Арифметические операции, применимые к типу char и разница с выводом на поток символьного типа и целочисленного типа
  • Целочисленный оператор «остаток от деления». Рассмотрения примера ошибочной путаницы между знаковыми и беззнаковыми типами на сгенерированном ассемблерном коде

6. Операторы, управляющие ходом выполнения программы

  • Условный оператор if. Пример возможных проблем с висячими else.
  • Разные подходы с написаниям оператора if во избежание спагетти-кода
  • Что такое область видимости. Что такое блок
  • Оператор выбора switch. Проблема fall through. В чем отличие между оператором выбора switch и логическим оператором if
  • Что такое compile time и run time-выражение на примере case-веток оператора выбора switch
  • Оператор цикла for. Способы объявления цикла for. Зачем нужен вечный цикл. Возможные проблемы знакового и беззнакового сравнения и их последствия
  • Оператор цикла while
  • Оператор цикла do while. Использование do while, для решения проблем с ветвлением кода с использованием оператора if
  • Тернарный оператор
  • Простое понимание точки следования на примере оператора запятой

7. Массивы

  • Что такое массив и в чем его преимущества
  • Объявления массивов. Способы указания размера массива
  • Инициализация массива. Возможные ошибки при инициализации массива
  • Массив переменной длины, как расширение компилятора. Флаг компиляции — pedantic
  • Массив символов vs строки. Способы объявления. Что такое символ «терминальный ноль». Возможные проблемы при инициализации символьного массива
  • Доступ к элементам массива
  • Что такое выход за границы массива. Что такое buffer overflow
  • Циклы как способ обхода, обработки и вывода массива на экран
  • Частые ошибки при выборе типа для переменной цикла при работе с массивом
  • Размер массива. Как получить количество элементов массива
  • С++11 range for как способ удобной работы с массивом. В чем отличие range for и других циклов и какие проблемы решает range for в отличии от других циклов
  • Отличие символьного массива от других типов массивов. Как правильно обходить символьный массив в циклах. Как вывести символьный массив на экран. Как считывать символы введенные с клавиатуры в символьный массив и возможные проблемы
  • Многомерные массивы. Примеры представления многомерного массива одномерным массивом

8. Указатели

  • Базовые понятия памяти стек
  • Что такое локальные переменные и как переменные создаются на стеке.
  • Что такое автоматическое управление памятью
  • Базовое понятие указателя
  • Объявление указателей
  • Способы инициализации указателя. Что такое невалидный указатель.
  • Что такое разыменования указателя и возможные проблемы. nullptr как правильный литерал для инициализации указателя. Что значит понятие «указатель на тип». Размер указателя, модели памяти разных ОС и платформ. Почему для указателя правильный тип есть void*
  • Что такое константный указатель и указатель на const. Пример возможных ошибок
  • Арифметика с указателями. Чем отличаются арифметика с указателями от арифметики с переменными
  • Что общего между массивом и указателем. Как обходить массив с помощью указателя. Что означает указатель на элемент за последним элементом массива и зачем так делать

9. Функции

  • Что такое функция и какие она решает проблемы в коде
  • Синтаксис функции
  • Базовое понятие что такое объявление и определение функции. Пример отличия
  • Что такое списки параметров. Способ вызова функции. Задание значения по умолчанию для параметра
  • Возвращаемое значение из функции. auto как автоматический вывод возвращаемого значения. Проблемы при автоматическом выводе типа.
  • Тип void как маркер невозвращаемого значения функции
  • Передача параметров по значению
  • Что такое фактические и формальные параметры
  • Неправильное использования auto в качестве параметров функции и последующее расширения компиляторов
  • Что такое глобальные переменные. Проблема сокрытия имен глобальных и локальных переменных
  • Передача по указателю. Способ возврата нескольких значений с функции
  • Что такое ссылки. В чем отличие ссылки от указателя
  • Ссылка как часть интерфейса функции
  • Какие проблемы решает ссылка в сравнении с указателем как параметр функции. Какие преимущества константной ссылки. Почему можно передавать Rvalue как аргумент константной ссылки
  • Пример как сделать ссылку невалидной
  • Стек и вызов функций
  • Соглашение о вызове функций
  • Массивы как параметры функции. Способы объявления массива как параметра функции и частые ошибки. Проблема получения количества элементов массива в функции
  • Рекурсия. Inline-функции
  • Что такое перегрузка функций. Что такое mangling имен функции на примере генерации ассемблерного кода
  • Почему перегрузка недоступна в языке С. Простое описания ключевого слово extern «C» как пример описания перегрузки
  • Что такое указатель на функцию и какие решает проблемы передача функции как параметр функции на примере алгоритма сортировки
  • Базовые понятия что такое lambda как замена указателю на функцию.
  • Что такое std::function
  • Проблемы при возврате локальных переменных с функции по ссылке или указателю
  • Снятие константности с аргумента использования std::const_cast

10. Пространства имен

  • Что такое пространства имен
  • Что такое вложенные пространства имен
  • Новые возможности объявления вложенных пространств имен в С++17

11. Простые пользовательские типы данных

  • Что такое структуры. Какие они решают проблемы
  • Объявление структур
  • Способы доступа к полям структуры
  • Способы инициализации структур до С++11
  • Инициализация структур начиная с С++11
  • Размер структур. Что такое выравнивание структур. Что такое padding в структурах
  • Неименованные структуры
  • Struct binding С++17. Какие проблемы решает
  • Что такое перечисления и какие оно решает проблемы
  • Что такое unscoped-перечисления и какие у него проблемы
  • Что такое scoped-перечисления, начиная с С++11 и какие он решает проблемы
  • Что такое объединения. Какие он решает проблемы
  • Что такое каламбур типов и как объединение помогает в преобразовании несовместимых типов

12. Работа с динамической памятью

  • Базовые понятия о моделях памяти. Их особенности и отличия
  • Отличие работы со стековой памятью и динамической памятью (куча)
  • Что такое менеджер памяти или почему динамическое выделение памяти такое дорогое
  • Работа с динамической памятью, используя С-функции
  • Работа с динамической памятью, используя С++-подход
  • Возможные проблемы при работе с динамической памятью

13. Классы и объекты (ООП)

  • Базовые понятия ООП
  • Что есть недостатком функционального программирования и какие задачи решает ООП
  • Основные киты ООП
  • Синтаксис объявления класса
  • Что такое поля класса
  • Создание объекта класса
  • Уровни доступа в классе
  • Способы объявления константных полей в классе до С++11 и после
  • Что такое статические поля
  • Что такое метод класса. Чем отличается метод от обычной функции
  • Что такое this. Что такое соглашение о вызове thiscall
  • Способы объявления методов класса. Чем отличаются определение метода внутри класса от определения за пределами класса
  • Что такое константные методы и какие они решают проблемы.
  • Ключевое слово mutable
  • Что такое статические методы и чем они отличаються от обычных методов

14. Конструкторы и деструкторы

  • Что такое конструктор и какие он решает проблемы
  • Виды конструкторов до С++11
  • Список инициализации. Способ инициализации полей класса, начиная с С++11. Подводные камни при инициализации полей класса
  • Зачем нужен конструктор копирования и оператор присваивания
  • Что такое деструктор и какие он решает проблемы
  • Правильная сигнатура для конструкторов и оператора присваивания
  • Перегрузка конструкторов
  • Порядок инициализации полей при создании объекта

15. Наследование

  • Что такое наследование и какие оно решает проблемы
  • Виды наследования
  • Чем является наследование (public-наследования)
  • Расположение объектов в памяти при наследовании
  • Порядок инициализации при наследовании. Подводные камни
  • Порядок вызовов при разрушении объекта
  • Shadowing-методы при наследовании
  • Множественное наследование. В чем отличие от одиночного наследования. Подводные камни множественного наследования
  • Неоднозначность вызова метода при множественном наследовании
  • Проблема ромбового наследования
  • Что такое виртуальное наследование и зачем оно нужно в контексте наследования
  • Ключевое слово final

16. Виртуальные функции

  • Что такое полиморфизм
  • Что такое виртуальная функция
  • Что такое динамический и статический полиморфизм и как он реализуется в языке С++
  • Ключевое слово override и какие он решает проблемы в контексте виртуальных функций
  • Что такое виртуальный деструктор и зачем он нужен
  • Что такое чисто виртуальные функции. Что такое абстрактный класс
  • Что такое vtable и vtpr. На что они влияют

17. Шаблоны

  • Что такое шаблоны и обобщенное программирование
  • Что общего между макросом и шаблоном. Какие проблемы макроса
  • Шаблоны класса
  • Что такое инстанцирование шаблона
  • Проблема раздувания кода
  • Параметры шаблона. Передача значения в качестве шаблонного аргумента
  • Специализация. Частичная специализация. Явная специализация
  • Шаблонные функции
  • Шаблонный метод. Шаблонный конструктор. Какие задачи они позволяют решить
  • Разница в вызове шаблонного класса и шаблонной функции
  • Явная специализация шаблона функции

18. Перегрузка операторов

  • Что такое перегрузка операторов
  • Когда стоит применять перегрузку операторов
  • Какие операции разрешено перегружать
  • В чем разница между перегрузкой оператора как методом класса и обычной функцией
  • Базовые соглашения о перегрузке операторов
  • Тонкости при перегрузке пре- и пост-инкремента и декремента
  • Рекомендации по написанию интерфейса перегрузки операторов
  • Особенности перегрузки вывода на поток

19. Пространства имен

  • Что такое пространства имен. Их применения. Какие они решают проблемы
  • Что такое неименованные пространства имен, что общего между static и неименованными пространствами имен

20. Базовые понятия о компиляции и системах сборки

  • Что такое препроцессинг
  • Что такое компиляция
  • Что такое линковщик
  • Виды компиляторов и их особенности
  • Что такое раздельная компиляция
  • Что такое заголовочный файл
  • Что такое стражи
  • Что такое библиотеки
  • Система сборки Make
  • CMake как генератор системы сборки

21. Move семантика

  • Что такое move семантика и какую ключевую роль она играет в современном С++?
  • Что такое rvalue ссылка?
  • Что такое value category и какие категории существуют в языке С++ (lvalue, prvalue т. д.)?
  • Конструктор перемещения
  • Оператор перемещения
  • Сравнение производительности между классом, реализующим только копирующее поведение, и классом, реализующим перемещающее поведение
  • std::move
  • Советы о том, когда стоит корректно применять перемещающие операции (когда move семантика не помогает?)

22. Конструкторы и деструкторы

  • Правило вызовов конструкторов, операторов присвоения базового класса
  • Правило 3-х до С++11
  • Правило 0 или правило 5-ти после С++11
  • Правила генерации конструкторов и операторов при разных полях
  • Когда стоит писать класс, который поддерживает только копирующее поведение, а когда только перемещающее?
  • Ключевое слово default для конструкторов и операторов, важность его написания в отличие от явного определения тела конструктора
  • Ключевое слово delete при объявлении конструкторов, операторов и деструкторов
  • Проблемы влияния пользовательского конструктора на неявное преобразование типов. Ключевое слово explicit
  • Ключевое слово using при наследовании
  • Разница между объявлением конструкторов и операторов присваивания (как приватные методы) и объявлением их с помощью ключевого слова delete
  • Что такое delegating constructors?
  • Reference-qualified методы класса
  • Ошибочное применение move семантики при наследовании
  • Copy elision, RVO NRVO

23. Оптимизация

  • Этапы компиляции
  • Оптимизация компилятора (inline, const)
  • Шаблоны как часть оптимизации на этапе компиляции
  • constexpr и его важность в каждом стандарте С++

24. Вывод типа в C++ (Type Deduction)

  • Вывод типа с помощью ключевого слова auto: таков ли тип на самом деле?
  • Ключевое слово decltype

25. Шаблоны

  • Ключевое слово typename в шаблонах и его важность
  • Type traits свойства типа, выделение наиболее важных и рассмотрение их на примерах
  • SFIANE. Применение std::enable_if и зачем его можно использовать в коде?
  • std::enable_if как способ реализации частичной специализации для шаблонов функций
  • if constexprt как возможность элегантной замены сложных конструкций std::enable_if
  • Variadic template vs Fold expression
  • Универсальные ссылки
  • Perfect forwarding, важность функции std::forward
  • Шаблонные методы и их отличие от шаблонного класса

26. Динамический полиморфизм

  • Особенности работы с динамическим полиморфизмом (virtual functions)
  • Аргумент по умолчанию, какие он скрывает проблемы в контексте?
  • static_cast vs dynamic_cast
  • RTTI, структура type_info
  • Пример динамического полиморфизма на одном из паттернов проектирования
  • Virtual destructor для избегания memory leaks

27. Лямбды

  • Указатель на функцию
  • Функтор
  • Лямбда, список захвата
  • Применение auto в аргументах лямбды
  • Ключевое слово mutable и зачем его необходимо объявить в сигнатуре лямбды?

28. Умные указатели

  • new vs malloc
  • RAII
  • std::unique_ptr vs std::shared_ptr. Move vs Copy
  • Вспомогательные функции (make_unique и т. д.).
  • Пользовательские deleter объекты как аргументы std::unique_ptr и std::shared_ptr. decltype как вывод сигнатуры функции
  • Советы по корректному написанию custom deleter для unique_ptr
  • Control block в std::shared_ptr. Зачем он нужен, какие он решает задачи, и каковы возможные подводные камни при выделении ресурса с помощью std::make_shared?
  • std::weak_ptr, его применение и влияние на блок управления в std::shared_ptr
  • Выделение динамического массива с помощью std::unique_ptr и std::shared_ptr. Специализация
  • Производительность std::unique_ptr и std::shared_ptr
  • std::static_pointer_cast, std::dynamic_pointer_cast. В чем их отличие от static_cast и dynamic_cast?

29. Исключительные ситуации

  • Исключительные ситуации. Их важное применение
  • Исключительные ситуации vs код возврата ошибки. Когда полезно применять код возврата ошибки?
  • Блоки try catch
  • throw как генерация исключения
  • Класс std::exception. Виртуальный метод what
  • Порядок написания блоков catch
  • Что такое раскрутка стека при генерации исключения? Что будет, если при генерации исключения не будет найден подходящий блок catch?
  • Что такое инвариантность при генерации исключения в конструкторе? Пример при написании operator =
  • Smart pointers как способ избежать утечки ресурсов при генерации исключения
  • Исключение не должно покидать деструктор
  • Ключевое слово noexcept
  • Оптимизация при написании функций как noexcept. Важность написания перемещающего конструктора как noexcept (на примере std::vector). Почему std::vector выбирает при реалокации копирующее поведение как дефолтное вместо перемещающей семантики (правило инвариантности)?
  • Компиляция кода с флагом -fno-exceptions, возможные опасности
  • new(std::nothrow) как способ использования оператора new, который не кидает исключения

30. Пространства имен

  • Что такое пространства имен и какие проблемы они решают в большом коде?
  • Inline namespace (provide library version)
  • Вложенные пространства имен
  • Using-directive, Using-declaration
  • ADL (argument dependent lookup), правила поиска имен

31. Потоки в C++

  • Основы мультипоточности
  • concurrency vs parallelism
  • std::thread. Что такое join и detach, и зачем их стоит вызывать?
  • Передача параметров в потоки и возможные подводные камни
  • Возвращаемое значение с потока при работе с std::thread. std::future and std::promise
  • Исключительные ситуации в потоках
  • std::async vs std::thread. Особенность std::future в std::async
  • Понятия data race, race conditions. Возможные проблемы при работе в многопоточном коде
  • Что такое объекты синхронизации в многопоточном коде? Важность их применения
  • strong memory model vs weak memory model
  • std::mutex. Почему std::mutex – это иногда плохо?
  • Важность RAII подхода при работе с std::mutex
  • std::recursive_mutex. Read-write mutex (std::shared_mutex)
  • Thread-safe variable Initialisation. std::call_once. Способы написания потокобезопасного singleton. Подводные камни с применением static initialization
  • std::condition_variable. Что такое spears wakeup и lost wakeup?
  • strong memory model vs weak memory model
  • Std::atomic
  • Ошибочное понимание std::shared_ptr в многопоточном программировании
  • Volatile – это не механизм синхронизации потока

32. Библиотека STL

  • Что такое библиотека STL? Что она позволяет решать в повседневном программировании?
  • Контейнеры в STL. Их структура, особенности, и какие они решают задачи
  • Итераторы. Что это? Зачем они нужны? Их свойства. Пример написания своего итератора
  • Что такое компараторы? std::bind
  • Алгоритмы. Важность итераторов при работе с алгоритмами. Рассмотрение категорий алгоритмов
  • Псевдоконтейнеры
  • STL – это не только контейнеры-итераторы-алгоритмы

33. Опциональные темы

  • Т. е. выбор темы: или сетевое программирование с обзором библиотеки boost, или QT

34. Сетевое программирование и библиотека Boost.asio

  • Network model OSI layers
  • Понятие IPC (inter process communication)
  • Что такое клиент-сервер?
  • Что такое протоколы обмена данными?
  • Что такое socket, endpoint?
  • TCP протокол, реализация TCP клиента и сервера
  • UDP протокол, реализация UDP клиента и сервера
  • Написание pool thread в примере при работе с TCP сервером
  • Форматы обмена данными (json и т. д.)
  • GRPC. protobuf. Понятие сериализации и десериализации данными

35. Обзор библиотеки Boost в Qt

  • Meta object compiler
  • Сигналы и слоты
  • QObject
  • Базовая работа с виджетами
  • Event loop
  • Структура QML-компонентов
  • Базовые графические компоненты
  • Взаимодействие C++ & QML
  • Кастомизация компонентов
  • Компоненты ListView, GridView
  • Сигналы/слоты в QML
  • Регистрация своих классов в метасистеме
  • Понятие модели, их виды
  • Понятие делегата
  • Понятие роли
  • Реализация своей модели, её регистрация, базовые методы
  • QAbstractListModel
  • Многопоточность в Qt

36. Как составить резюме и пройти собеседование

  • Структура резюме
  • Часто задаваемые вопросы
  • Как вести себя на собеседовании
  • Основные ошибки на собеседовании
  • Бонусное занятие по английскому языку
  • Урок поиска работы

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

  • Вы — новичок и хотите начать кодить на С++ как можно скорее
  • Вы хотите поменять сферу деятельности, освоив перспективную профессию
  • Вы уже программист, но хотите освоить еще одно направление
  • Вы изучали направление самостоятельно, но хотите придать знаниям системности

Лекторы:


Курс C++ Pro в Ташкенте

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

spinner-it

На жаль, у звязку з війною ІТЕА завершила свою діяльності в Україні.

This will close in 20 seconds