Курс C++ Pro
Вы будете писать программы любой сложности на одном из самых прогрессивных языков.
C++ — один из самых сложных языков, который потребует от вас усидчивости и терпения, но ваша востребованность всегда будет на высоте. Вы сможете создавать топовые продукты любой сложности, ведь на C++ можно писать всё: драйверы устройств, программы для устройств IoT, десктопные прикладные программы: игры, бизнес-приложения, серверы для сетевых служб и многое другое.
Вы научитесь различным приемам программирования на C++, познакомитесь с принципами объектно-ориентированной разработки, создания GUI-приложений на языке С++ с помощью библиотеки Qt. А еще вы узнаете все о контейнерах, алгоритмах и адаптерах, будете разбираться в архитектуре приложений и модульном тестировании ПО.
- Теории без практики
- Устаревших механик работы
- Пересказа чужих лекций и книг
- Вопросов без ответа
Это будет увлекательно и эффективно!
- Что такое язык программирования
- Машинные языки
- Низкоуровневые языки (язык ассемблера)
- Высокоуровневые языки
- Трансляторы
- Компиляция
- Интерпретация
- Парадигмы программирования
- Модульная парадигма программирования
- Функциональная парадигма программирования
- Обобщенная парадигма программирования
- Объектно ориентированная парадигма программирования
- История С++
- Что такое система контроля версии и что она решает
- Основные элементы git
- Что такое коммит
- Что такое ветка
- Способы создания репозитория. Виды сервисов, позволяющие создать удаленный репозиторий
- Базовые команды git
- Практика. Создания репозитория локально. Создания репозитория на удаленном сервере
- Пример простой программы С++
- Базовые способы собрать приложение
- Алфавит языка
- Что такое лексемы
- Что такое идентификатор как важная составляющая программы
- Что такое ключевые слова
- Комментарии (однострочные, многострочные)
- Что такое литера. Виды литералов. И зачем они нужны в коде
- Чем отличаются строковый литерал от остальных типов литералов
- Что такое инструкции
- Что значит синтаксическая ошибка. Пример простой синтаксической ошибки
- Что такое семантическая ошибка. Пример семантической ошибки и возможные ее последствия
- Что такое переменная. Синтаксис объявления переменной
- Тип данных. Что такое строгая типизация. Зачем переменной нужен тип данных
- Целочисленный тип данных
- Символьные типы
- Начиная с С++11, целочисленные типы с фиксированными размером, какие проблемы они решают
- Что такое алиас на тип данных. Пример с описанием typedef.
- Понимания типов size_t, time_t — это просто алиас на встроенный тип
- Тип void как маркер разного контекста. Пример контекста использования этого типа
- Логический тип данных
- Вещественные типы данных. Возможные подводные камни представления в памяти
- Простой пример на ассемблере способа представления целочисленных типов и вещественных типов
- Способы объявления переменных. Инициализация переменных.
- Проблема неинициализированных переменных
- Оператор sizeof для получения размера переменных и типов
- Способы инициализации переменных до С++11 и универсальная инициализация начиная с С++11 как средство решения проблем старой инициализации
- Автоматический вывод типа. Ключевое слово auto и decltype
- Константы
- Способы объявления констант
- Что такое свертка констант. Пример С++-кода с объявлением констант и оптимизированного ассемблерного кода
- Виды операторов (унарный, бинарный, тернарный). Их синтаксис
- Неявное преобразование при операторе присвоения. Что такое срезка.
- Что такое сужающее преобразование. Проблема знакового и беззнакового преобразования
- Явное преобразования типов (С-подход и С++-подход)
- Арифметические операции
- Проблема арифметических операций. Целочисленное деление на ноль, переполнение и т.д.
- Смешанные выражения. Приоритет операций
- Автоматический вывод типа как решение проблемы переполнения в арифметических выражениях
- Временная переменная как результат промежуточного вычисления выражения. Как выглядит временная переменная в сгенерированном ассемблерном коде (простое описание)
- Базовые понятия Rvalue и Lvalue
- Составной оператор
- Пост- и пре-инкремент и декремент. В чем отличие между пре- и пост- операцией
- Операторы отношения между операндами. Возможные подводные камни
- Логические операции
- Битовые операции. Что такое установка бита, что такое сброс бита. Что такое little-endian и big-endian. Что такое битовые маски, пример битовых масок до С++11 и начиная с С++11
- Описание разницы между логическим сравнением с применением логических операторов {|| &&} и битовыми операциями {| &}
- Арифметические операции, применимые к типу char и разница с выводом на поток символьного типа и целочисленного типа
- Целочисленный оператор «остаток от деления». Рассмотрения примера ошибочной путаницы между знаковыми и беззнаковыми типами на сгенерированном ассемблерном коде
- Условный оператор if. Пример возможных проблем с висячими else.
- Разные подходы с написаниям оператора if для избежания спагетти-кода
- Что такое область видимости. Что такое блок
- Оператор выбора switch. Проблема fall through. В чем отличие между оператором выбора switch и логическим оператором if
- Что такое compile time и run time-выражение. На примере case-веток оператора выбора switch
- Оператор цикла for. Способы объявления цикла for. Зачем нужен вечный цикл. Возможные проблемы знакового и беззнакового сравнения и их последствия
- Оператор цикла while
- Оператор цикла do while. Использования do while, для решения проблем с ветвлением кода с использованием оператора if
- Тернарный оператор
- Простое понимание точки следования на примере оператора запятой
- Что такое массив и в чем его преимущества
- Объявления массивов. Способы указания размера массива
- Инициализация массива. Возможные ошибки при инициализации массива
- Массив переменной длины как расширение компилятора. Флаг компиляции -pedantic
- Массив символов или строки. Способы объявления. Что такое нуль-терминальный символ. Возможные проблемы при инициализации символьного массива
- Доступ к элементам массива
- Что такое выход за границы массива. Что такое buffer overflow
- Циклы как способ обхода, обработки и вывода массива на экран
- Частые ошибки при выборе типа для переменной цикла при работе с массивом
- Размер массива. Как получить количество элементов массива
- С++11 range for как способ удобной работы с массивом. В чем отличие range for и других циклов и какие проблемы решает range for в отличии от других циклов
- Отличие символьного массива от других типов массивов. Как правильно обходить символьный массив в циклах. Как вывести символьный массив на экран. Как считывать символы введенные с клавиатуры в символьный массив и возможные проблемы
- Многомерные массивы. Примеры представления многомерного массива одномерным массивом
- Базовые понятия памяти стек
- Что такое локальные переменные и как переменные создаются на стеке.
- Что такое автоматическое управление памятью
- Базовое понятие указателя
- Объявление указателей
- Способы инициализации указателя. Что такое невалидный указатель.
- Что такое разыменования указателя и возможные проблемы. nullptr как правильный литерал для инициализации указателя. Что значит понятие «указатель на тип». Размер указателя, модели памяти разных ОС и платформ. Почему для указателя правильный тип есть void*
- Что такое константный указатель и указатель на const. Пример возможных ошибок
- Арифметика с указателями. Чем отличаются арифметика с указателями от арифметики с переменными
- Что общего между массивом и указателем. Как обходить массив с помощью указателя. Что означает указатель на элемент за последним элементом массива и зачем так делать
- Что такое функция и какие она решает проблемы в коде
- Синтаксис функции
- Базовое понятие что такое объявление и определение функции. Пример отличия
- Что такое списки параметров. Способ вызова функции. Задание значения по умолчанию для параметра
- Возвращаемое значение из функции. auto как автоматический вывод возвращаемого значения. Проблемы при автоматическом выводе типа.
- Тип void как маркер невозвращаемого значения функции
- Передача параметров по значению
- Что такое фактические и формальные параметры
- Неправильное использования auto в качестве параметров функции и последующее расширения компиляторов
- Что такое глобальные переменные. Проблема сокрытия имен глобальных и локальных переменных
- Передача по указателю. Способ возврата нескольких значений с функции
- Что такое ссылки. В чем отличие ссылки от указателя
- Ссылка как часть интерфейса функции
- Какие проблемы решает ссылка в сравнении с указателем как параметр функции. Какие преимущества константной ссылки. Почему можно передавать Rvalue как аргумент константной ссылки
- Пример как сделать ссылку невалидной
- Стек и вызов функций
- Соглашение о вызове функций
- Массивы как параметры функции. Способы объявления массива как параметра функции и частые ошибки. Проблема получения количества элементов массива в функции
- Рекурсия. Inline-функции
- Что такое перегрузка функций. Что такое mangling имен функции на примере генерации ассемблерного кода
- Почему перегрузка недоступна в языке С. Простое описания ключевого слово extern «C» как пример описания перегрузки
- Что такое указатель на функцию и какие решает проблемы передача функции как параметр функции на примере алгоритма сортировки
- Базовые понятия что такое lambda как замена указателю на функцию.
- Что такое std::function
- Проблемы при возврате локальных переменных с функции по ссылке или указателю
- Снятие константности с аргумента использования std::const_cast
- Что такое пространства имен
- Что такое вложенные пространства имен
- Новые возможности объявления вложенных пространств имен в С++17
- Что такое структуры. Какие они решают проблемы
- Объявление структур
- Способы доступа к полям структуры
- Способы инициализации структур до С++11
- Инициализация структур начиная с С++11
- Размер структур. Что такое выравнивание структур. Что такое padding в структурах
- Неименованные структуры
- Struct binding С++17. Какие проблемы решает
- Что такое перечисления и какие оно решает проблемы
- Что такое unscoped-перечисления и какие у него проблемы
- Что такое scoped-перечисления, начиная с С++11 и какие он решает проблемы
- Что такое объединения. Какие он решает проблемы
- Что такое каламбур типов и как объединение помогает в преобразовании несовместимых типов
- Базовые понятия о моделях памяти. Их особенности и отличия
- Отличие работы со стековой памятью и динамической памятью (куча)
- Что такое менеджер памяти или почему динамическое выделение памяти такое дорогое
- Работа с динамической памятью, используя С-функции
- Работа с динамической памятью, используя С++-подход
- Возможные проблемы при работе с динамической памятью
- Базовые понятия ООП
- Что есть недостатком функционального программирования и какие задачи решает ООП
- Основные киты ООП
- Синтаксис объявления класса
- Что такое поля класса
- Создание объекта класса
- Уровни доступа в классе
- Способы объявления константных полей в классе до С++11 и после
- Что такое статические поля
- Что такое метод класса. Чем отличается метод от обычной функции
- Что такое this. Что такое соглашение о вызове thiscall
- Способы объявления методов класса. Чем отличаются определение метода внутри класса от определения за пределами класса
- Что такое константные методы и какие они решают проблемы.
- Ключевое слово mutable
- Что такое статические методы и чем они отличаються от обычных методов
- Что такое конструктор и какие он решает проблемы
- Виды конструкторов до С++11
- Список инициализации. Способ инициализации полей класса, начиная с С++11. Подводные камни при инициализации полей класса
- Зачем нужен конструктор копирования и оператор присваивания
- Что такое деструктор и какие он решает проблемы
- Правильная сигнатура для конструкторов и оператора присваивания
- Перегрузка конструкторов
- Порядок инициализации полей при создании объекта
- Что такое наследование и какие оно решает проблемы
- Виды наследования
- Чем является наследование (public-наследования)
- Расположение объектов в памяти при наследовании
- Порядок инициализации при наследовании. Подводные камни
- Порядок вызовов при разрушении объекта
- Shadowing-методы при наследовании
- Множественное наследование. В чем отличие от одиночного наследования. Подводные камни множественного наследования
- Неоднозначность вызова метода при множественном наследовании
- Проблема ромбового наследования
- Что такое виртуальное наследование и зачем оно нужно в контексте наследования
- Ключевое слово final
- Что такое полиморфизм
- Что такое виртуальная функция
- Что такое динамический и статический полиморфизм и как он реализуется в языке С++
- Ключевое слово override и какие он решает проблемы в контексте виртуальных функций
- Что такое виртуальный деструктор и зачем он нужен
- Что такое чисто виртуальные функции. Что такое абстрактный класс
- Что такое vtable и vtpr. На что они влияют
- Что такое шаблоны и обобщенное программирование
- Что общего между макросом и шаблоном. Какие проблемы макроса
- Шаблоны класса
- Что такое инстанцирование шаблона
- Проблема раздувания кода
- Параметры шаблона. Передача значения в качестве шаблонного аргумента
- Специализация. Частичная специализация. Явная специализация
- Шаблонные функции
- Шаблонный метод. Шаблонный конструктор. Какие задачи они позволяют решить
- Разница в вызове шаблонного класса и шаблонной функции
- Явная специализация шаблона функции
- Что такое перегрузка операторов
- Когда стоит применять перегрузку операторов
- Какие операции разрешено перегружать
- В чем разница между перегрузкой оператора как методом класса и обычной функцией
- Базовые соглашения о перегрузке операторов
- Тонкости при перегрузке пре- и пост-инкремента и декремента
- Рекомендации по написанию интерфейса перегрузки операторов
- Что такое пространства имен. Их применения. Какие они решают проблемы
- Что такое неименованные пространства имен, что общего между static и неименованными пространствами имен
- Что такое препроцессинг
- Что такое компиляция
- Что такое линковщик
- Виды компиляторов и их особенности
- Что такое раздельная компиляция
- Что такое заголовочный файл
- Что такое стражи
- Что такое библиотеки
- Система сборки Make
- CMake как генератор системы сборки
- Что такое move семантика и какую ключевую роль она играет в современном С++?
- Что такое rvalue ссылка?
- Что такое value category и какие категории существуют в языке С++ (lvalue, prvalue т. д.)?
- Конструктор перемещения
- Оператор перемещения
- Сравнение производительности между классом, реализующим только копирующее поведение, и классом, реализующим перемещающее поведение
- std::move
- Советы о том, когда стоит корректно применять перемещающие операции (когда move семантика не помогает?)
- Правило вызовов конструкторов, операторов присвоения базового класса
- Правило 3-х до С++11
- Правило 0 или правило 5-ти после С++11
- Правила генерации конструкторов и операторов при разных полях
- Когда стоит писать класс, который поддерживает только копирующее поведение, а когда только перемещающее?
- Ключевое слово default для конструкторов и операторов, важность его написания в отличие от явного определения тела конструктора
- Ключевое слово delete при объявлении конструкторов, операторов и деструкторов
- Проблемы влияния пользовательского конструктора на неявное преобразование типов. Ключевое слово explicit
- Ключевое слово using при наследовании
- Разница между объявлением конструкторов и операторов присваивания (как приватные методы) и объявлением их с помощью ключевого слова delete
- Что такое delegating constructors?
- Reference-qualified методы класса
- Ошибочное применение move семантики при наследовании
- Copy elision, RVO NRVO
- Этапы компиляции
- Оптимизация компилятора (inline, const)
- Шаблоны как часть оптимизации на этапе компиляции
- constexpr и его важность в каждом стандарте С++
- Вывод типа с помощью ключевого слова auto: таков ли тип на самом деле?
- Ключевое слово decltype
- Ключевое слово typename в шаблонах и его важность
- Type traits свойства типа, выделение наиболее важных и рассмотрение их на примерах
- SFIANE. Применение std::enable_if и зачем его можно использовать в коде?
- std::enable_if как способ реализации частичной специализации для шаблонов функций
- if constexprt как возможность элегантной замены сложных конструкций std::enable_if
- Variadic template vs Fold expression
- Универсальные ссылки
- Perfect forwarding, важность функции std::forward
- Шаблонные методы и их отличие от шаблонного класса
- Особенности работы с динамическим полиморфизмом (virtual functions)
- Аргумент по умолчанию, какие он скрывает проблемы в контексте?
- static_cast vs dynamic_cast
- RTTI, структура type_info
- Пример динамического полиморфизма на одном из паттернов проектирования
- Virtual destructor для избегания memory leaks
- Указатель на функцию
- Функтор
- Лямбда, список захвата
- Применение auto в аргументах лямбды
- Ключевое слово mutable и зачем его необходимо объявить в сигнатуре лямбды?
- 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?
- Исключительные ситуации. Их важное применение
- Исключительные ситуации 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, который не кидает исключения
- Что такое пространства имен и какие проблемы они решают в большом коде?
- Inline namespace (provide library version)
- Вложенные пространства имен
- Using-directive, Using-declaration
- ADL (argument dependent lookup), правила поиска имен
- Основы мультипоточности
- 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 – это не механизм синхронизации потока
- Что такое библиотека STL? Что она позволяет решать в повседневном программировании?
- Контейнеры в STL. Их структура, особенности, и какие они решают задачи
- Итераторы. Что это? Зачем они нужны? Их свойства. Пример написания своего итератора
- Что такое компараторы? std::bind
- Алгоритмы. Важность итераторов при работе с алгоритмами. Рассмотрение категорий алгоритмов
- Псевдоконтейнеры
- STL – это не только контейнеры-итераторы-алгоритмы
- Т. е. выбор темы: или сетевое программирование с обзором библиотеки boost, или QT
- Network model OSI layers
- Понятие IPC (inter process communication)
- Что такое клиент-сервер?
- Что такое протоколы обмена данными?
- Что такое socket, endpoint?
- TCP протокол, реализация TCP клиента и сервера
- UDP протокол, реализация UDP клиента и сервера
- Написание pool thread в примере при работе с TCP сервером
- Форматы обмена данными (json и т. д.)
- GRPC. protobuf. Понятие сериализации и десериализации данными
- Meta object compiler
- Сигналы и слоты
- QObject
- Базовая работа с виджетами
- Event loop
- Структура QML-компонентов
- Базовые графические компоненты
- Взаимодействие C++ & QML
- Кастомизация компонентов
- Компоненты ListView, GridView
- Сигналы/слоты в QML
- Регистрация своих классов в метасистеме
- Понятие модели, их виды
- Понятие делегата
- Понятие роли
- Реализация своей модели, её регистрация, базовые методы
- QAbstractListModel
- Многопоточность в Qt
- Структура резюме
- Часто задаваемые вопросы
- Как вести себя на собеседовании
- Основные ошибки на собеседовании
- Бонусное занятие по английскому языку
- Урок поиска работы
- Обучение в формате просмотра стрима или записи занятий
- Личный кабинет с доступом к материалам курса
- Помощь ментора курса
- Актуальную программу обучения