9. Приведение типа в С++: static_cast, dynamic_cast, const_cast, reinterpret_cast.
«Умные указатели» в С++: unique_ptr, shared_ptr, weak_ptr. Контейнерные классы и итераторы. Работа с итераторами. Цикл for для работы с контейнерными объектами.
Приведение типа в C++
Основные типы приведения
static_castИспользуется для явного приведения типов. Безопасен при корректном использовании, но не проверяет типы во время выполнения.
Применим для приведения между базовым и производным классами (если гарантирована правильность приведения).
double a = 10.5; int b = static_cast<int>(a); // b = 10dynamic_castИспользуется для безопасного приведения между указателями или ссылками в иерархии классов с виртуальными методами.
Проверяет тип во время выполнения и возвращает
nullptr(для указателей) или выбрасывает исключениеstd::bad_cast(для ссылок), если приведение неудачно.
class Base { virtual void foo() {} }; class Derived : public Base {}; Base* b = new Derived(); Derived* d = dynamic_cast<Derived*>(b); // Успешное приведениеconst_castИспользуется для добавления или удаления квалификатора
constиз переменной.Безопасен, если используется для снятия
constс переменной, которая изначально не былаconst.
const int a = 10; int* b = const_cast<int*>(&a); *b = 20; // Поведение неопределено, поскольку `a` изначально `const`reinterpret_castИспользуется для низкоуровневого приведения типов.
Применяется для приведения указателей к несовместимым типам, но может быть небезопасным.
int a = 10; void* ptr = &a; int* intPtr = reinterpret_cast<int*>(ptr); // Приведение void* обратно к int*
«Умные указатели» в C++
Умные указатели из стандартной библиотеки C++ (C++11 и выше) помогают управлять динамическими ресурсами и предотвращать утечки памяти.
unique_ptrУправляет уникальным владением ресурсом. Ресурс освобождается при уничтожении
unique_ptr.Нельзя копировать
unique_ptr, но можно перемещать.
shared_ptrУправляет совместным владением ресурсом. Ресурс освобождается, когда последний
shared_ptrперестает им владеть.Поддерживает подсчет ссылок для отслеживания количества владельцев ресурса.
weak_ptrОтслеживает ресурс, управляемый
shared_ptr, но не влияет на его срок жизни.Используется для устранения циклических зависимостей между
shared_ptr.
Контейнерные классы и итераторы
Основные контейнеры STL
std::vectorДинамически изменяемый массив.
std::listДвусвязный список.
std::setМножество, содержащие уникальные элементы, упорядоченные по значению.
std::mapАссоциативный массив (словарь), хранящий пары ключ-значение.
Итераторы
Основные типы итераторов
InputIterator: Поддерживает чтение из последовательности.OutputIterator: Поддерживает запись в последовательность.ForwardIterator: Поддерживает однонаправленное перемещение.BidirectionalIterator: Поддерживает движение вперед и назад.RandomAccessIterator: Поддерживает произвольный доступ, аналогично указателям.
Использование итераторов
Итераторы позволяют абстрагироваться от конкретного контейнера и работать с элементами в стандартной манере.
Цикл for для контейнерных объектов (range-based for)
Упрощает итерацию по контейнерам, введенный в C++11.
Last updated