C++
ОБЪЯВЛЕНИЯ
Данный курс рассчитан на людей, хотя бы немного знакомых с языком С (нужно иметь базовое понимание, зачем нужны malloc и free, а также знание синтаксиса С) и ООП (нужно понимать, что такое объекты и как объявлять классы).
Каждая тема сопровождается конкретными примерами, которые могут встретиться на практике. После каждого занятия будет выдаваться домашняя работа - написание программы с заданными требованиями (например, с ограничениями по времени работы или с ограничениями в логике: например, может быть задание по работе с уже созданным классом, который нельзя копировать).
План курса:
Шаблоны и ссылки
Наводящий пример. Что такое шаблоны?
Во что раскрываются шаблонные функции и классы? Флаг компилятора g++ -E.
Сравнение шаблонов с перегрузкой функций.
Специализации функций и классов.
Вывод шаблонных типов.
Вывод типа с помощью auto.
Тип auto возвращаемого значения функции.
Константные/неконстантные ссылки.
Тонкости, связанные с ссылочными типами.
2. STL
Range-based for.
Различные контейнеры: std::string, std::vector, std::array, std::deque, std::map, std::set. Механизм их работы и сложность операций над ними.
Итераторы.
Библиотека algorithm.
3. ООП: инкапсуляция, полиморфизм, наследование
Инкапсуляция (модификаторы доступа, константные методы).
Типы наследования.
Полиморфизм и виртуальные методы.
Абстрактные классы.
Таблица виртуальных методов.
Пример использования полезных свойств полиморфизма.
CTRP.
4. Move-семантика и механизм работы оператора присваивания в C++
Как работает присваивание в C++.
Конструктор копирования и оператор присваивания.
Move-семантика: зачем, что и почему. Наводящий пример.
Lvalue и rvalue.
Конструкторы перемещения, оператор перемещающего присваивания.
= delete функции.
Copy elision, RVO, NRVO.
5. Ввод-вывод. Ввод-вывод своих классов. Механизм работы std::cout и std::cin. Stringstream
std::cout, std::cin, std::(i/o)stream, std::(i/o)fstream.
Почему std::cout выводит текст с “опозданием”?
Связь std::cout с std::cin, влияние этой связи на скорость работы.
Полезные свойства (i/o)stringstream.
6. Пространства имен. Using директива. Различные способы инициализации объектов. Приведения типов
Необходимость пространства имен в больших проектах.
Анонимные пространства имен.
Использование using namespace - хорошо или плохо?
Использование using в классах для сокращения и достижения большей читаемости кода.
C++-style casts (static_cast, dynamic_cast, reinterpret_cast).
Каст указателя на родителя к указателю на ребенка.
7. Идиома RAII, исключения и умные указатели
Прекрасность идиомы RAII.
Работа с исключениями (раскрутка стека, std::terminate, исключения в деструкторах и другие тонкости) и создание собственных.
Пример использования сырых указателей, показывающий необходимость использования умных указателей.
Как они решают обозначенную проблему? Как ими пользоваться?
Виды умных указателей (std::shared_ptr, std::unique_ptr, std::weak_ptr, устаревший std::auto_ptr).
Механизм их работы (особое внимание уделится std::shared_ptr) и проблемы std::shared_ptr, связанные с перекрестными ссылками.
Разные способы создания указателей: std::make_shared или конструктор?
8. Лямбда-выражения
Синтаксис и пример использования в различных алгоритмах STL (sort, find и т.д.) и не только.
Во что раскрываются лямбда-выражения при компиляции?
Захват переменных и передача аргументов.
Какой тип имеют лямбда-выражения?
Передача лямбда-выражений в функции.
9. Многопоточность
Как работает многопоточность: понятие процесса, потока и т.д. Отличия многопоточности от асинхронности.
std::thread.
std::future, std::async.
std::promise.
Практика, практика, практика.
10. SFINAE и compile-time вычисления
constexpr переменные.
constexpr функции.
constexpr if.
SFINAE - что, зачем и почему.
Compile-time числа Фибоначчи.