Перейти к содержимому

Приведение типов

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++.