Приведение типов
std::bit_cast
Определение и назначение
std::bit_cast используется для приведения одного типа к другому путем побитового копирования. Он доступен с C++20 и является безопасным способом приведения типов, который не изменяет представление данных.
Синтаксис
#include <bit>T target = std::bit_cast<T>(source);Пример использования
#include <bit>#include <iostream>
int main() { float f = 3.14f; int i = std::bit_cast<int>(f); std::cout << i << std::endl; // вывод: 1078523331 return 0;}const_cast<>
Определение и назначение
const_cast<> используется для добавления или удаления квалификаторов const и volatile. Это единственный способ изменить константность объекта.
Синтаксис
T* nonConstPtr = const_cast<T*>(constPtr);Пример использования
#include <iostream>
void print(const int& x) { std::cout << x << std::endl; int& y = const_cast<int&>(x); y = 10;}
int main() { int a = 5; print(a); std::cout << a << std::endl; // вывод: 10 return 0;}dynamic_cast<>
Определение и назначение
dynamic_cast<> используется для безопасного приведения указателей и ссылок в иерархии наследования. Он может выполнять приведение вниз и проверку типов во время выполнения.
Синтаксис
T* derivedPtr = dynamic_cast<T*>(basePtr);Пример использования
#include <iostream>
class Base {public: virtual ~Base() = default;};
class Derived : public Base {public: void show() { std::cout << "Derived class" << std::endl; }};
int main() { Base* basePtr = new Derived; Derived* derivedPtr = dynamic_cast<Derived*>(basePtr); if (derivedPtr) { derivedPtr->show(); // вывод: Derived class } delete basePtr; return 0;}reinterpret_cast<>
Определение и назначение
reinterpret_cast<> используется для приведения указателей и целых чисел друг к другу. Это самый низкоуровневый и потенциально опасный способ приведения типов.
Синтаксис
T* ptr = reinterpret_cast<T*>(intPtr);Пример использования
#include <iostream>
int main() { int a = 65; char* ch = reinterpret_cast<char*>(&a); std::cout << *ch << std::endl; // вывод: A (зависит от архитектуры) return 0;}static_cast<>
Определение и назначение
static_cast<> используется для выполнения явного приведения типов, которые связаны друг с другом, например, приведение числовых типов или приведение вверх по иерархии наследования.
Синтаксис
T target = static_cast<T>(source);Пример использования
#include <iostream>
class Base {public: virtual ~Base() = default;};
class Derived : public Base {public: void show() { std::cout << "Derived class" << std::endl; }};
int main() { Derived d; Base* basePtr = static_cast<Base*>(&d); Derived* derivedPtr = static_cast<Derived*>(basePtr); derivedPtr->show(); // вывод: Derived class return 0;}Резюме
std::bit_cast<>: используется для безопасного побитового копирования одного типа в другой.const_cast<>: изменяет константность объекта.dynamic_cast<>: выполняет безопасное приведение в иерархии наследования с проверкой типов во время выполнения.reinterpret_cast<>: выполняет низкоуровневое приведение указателей и целых чисел.static_cast<>: выполняет явное приведение типов, связанных друг с другом.
Каждый из этих способов приведения типов имеет свое назначение и область применения, что помогает управлять типами и их преобразованием в C++.