Что такое явное приведение типа в C++ и какие его виды существуют?

«Что такое явное приведение типа в C++ и какие его виды существуют?» — вопрос из категории C++ Core, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Явное приведение типа (explicit type casting) — это инструкция программиста компилятору преобразовать значение из одного типа в другой. В современном C++ следует избегать C-style cast (type)value в пользу более безопасных и конкретных операторов:

1. static_cast — для «разумных» преобразований, проверяемых на этапе компиляции.

double d = 3.14159;
int i = static_cast<int>(d); // Преобразование с потерей дробной части

class Base {};
class Derived : public Base {};
Derived* derived = new Derived();
Base* base = static_cast<Base*>(derived); // Восходящее преобразование (upcast) - безопасно

2. dynamic_cast — для безопасного нисходящего преобразования (downcast) в иерархиях с полиморфизмом.

Base* base = new Derived(); // Base должен иметь хотя бы одну виртуальную функцию
Derived* derived = dynamic_cast<Derived*>(base);
if (derived != nullptr) { // Проверка во время выполнения
    // Успешное преобразование
}

3. const_cast — для добавления или удаления квалификаторов const и volatile.

void print(char* str); // Функция, принимающая не-const указатель
const char* greeting = "Hello";
// print(greeting); // Ошибка компиляции: несовпадение типов
print(const_cast<char*>(greeting)); // Явное снятие const (опасно, если строка действительно константная)

4. reinterpret_cast — для низкоуровневого, зависящего от реализации преобразования (например, указатель в целое).

int* p = new int(42);
uintptr_t addr = reinterpret_cast<uintptr_t>(p); // Преобразование указателя в целое число

Рекомендация: Всегда используйте наиболее специфичный и безопасный оператор приведения.