C++

ОБЪЯВЛЕНИЯ


Данный курс рассчитан на людей, хотя бы немного знакомых с языком С (нужно иметь базовое понимание, зачем нужны malloc и free, а также знание синтаксиса С) и ООП (нужно понимать, что такое объекты и как объявлять классы).


Каждая тема сопровождается конкретными примерами, которые могут встретиться на практике. После каждого занятия будет выдаваться домашняя работа - написание программы с заданными требованиями (например, с ограничениями по времени работы или с ограничениями в логике: например, может быть задание по работе с уже созданным классом, который нельзя копировать).


План курса:

  1. Шаблоны и ссылки

  1. Наводящий пример. Что такое шаблоны?

  2. Во что раскрываются шаблонные функции и классы? Флаг компилятора g++ -E.

  3. Сравнение шаблонов с перегрузкой функций.

  4. Специализации функций и классов.

  5. Вывод шаблонных типов.

  6. Вывод типа с помощью auto.

  7. Тип auto возвращаемого значения функции.

  8. Константные/неконстантные ссылки.

  9. Тонкости, связанные с ссылочными типами.

2. STL

  1. Range-based for.

  2. Различные контейнеры: std::string, std::vector, std::array, std::deque, std::map, std::set. Механизм их работы и сложность операций над ними.

  3. Итераторы.

  4. Библиотека algorithm.

3. ООП: инкапсуляция, полиморфизм, наследование

  1. Инкапсуляция (модификаторы доступа, константные методы).

  2. Типы наследования.

  3. Полиморфизм и виртуальные методы.

  4. Абстрактные классы.

  5. Таблица виртуальных методов.

  6. Пример использования полезных свойств полиморфизма.

  7. CTRP.

4. Move-семантика и механизм работы оператора присваивания в C++

  1. Как работает присваивание в C++.

  2. Конструктор копирования и оператор присваивания.

  3. Move-семантика: зачем, что и почему. Наводящий пример.

  4. Lvalue и rvalue.

  5. Конструкторы перемещения, оператор перемещающего присваивания.

  6. = delete функции.

  7. Copy elision, RVO, NRVO.

5. Ввод-вывод. Ввод-вывод своих классов. Механизм работы std::cout и std::cin. Stringstream

  1. std::cout, std::cin, std::(i/o)stream, std::(i/o)fstream.

  2. Почему std::cout выводит текст с “опозданием”?

  3. Связь std::cout с std::cin, влияние этой связи на скорость работы.

  4. Полезные свойства (i/o)stringstream.

6. Пространства имен. Using директива. Различные способы инициализации объектов. Приведения типов

  1. Необходимость пространства имен в больших проектах.

  2. Анонимные пространства имен.

  3. Использование using namespace - хорошо или плохо?

  4. Использование using в классах для сокращения и достижения большей читаемости кода.

  5. C++-style casts (static_cast, dynamic_cast, reinterpret_cast).

  6. Каст указателя на родителя к указателю на ребенка.

7. Идиома RAII, исключения и умные указатели

  1. Прекрасность идиомы RAII.

  2. Работа с исключениями (раскрутка стека, std::terminate, исключения в деструкторах и другие тонкости) и создание собственных.

  3. Пример использования сырых указателей, показывающий необходимость использования умных указателей.

  4. Как они решают обозначенную проблему? Как ими пользоваться?

  5. Виды умных указателей (std::shared_ptr, std::unique_ptr, std::weak_ptr, устаревший std::auto_ptr).

  6. Механизм их работы (особое внимание уделится std::shared_ptr) и проблемы std::shared_ptr, связанные с перекрестными ссылками.

  7. Разные способы создания указателей: std::make_shared или конструктор?

8. Лямбда-выражения

  1. Синтаксис и пример использования в различных алгоритмах STL (sort, find и т.д.) и не только.

  2. Во что раскрываются лямбда-выражения при компиляции?

  3. Захват переменных и передача аргументов.

  4. Какой тип имеют лямбда-выражения?

  5. Передача лямбда-выражений в функции.

9. Многопоточность

  1. Как работает многопоточность: понятие процесса, потока и т.д. Отличия многопоточности от асинхронности.

  2. std::thread.

  3. std::future, std::async.

  4. std::promise.

  5. Практика, практика, практика.

10. SFINAE и compile-time вычисления

  1. constexpr переменные.

  2. constexpr функции.

  3. constexpr if.

  4. SFINAE - что, зачем и почему.

  5. Compile-time числа Фибоначчи.