C++ 四种强制类型转换

一、C++ 为什么要设计 4 种类型转换?C 语言只有一种强转:(类型)变量缺点:什么都能转,太暴力,不安全,代码可读性差。C++ 把转换分成 4 种专用转换:各司其职意图明确编译器能做更多安全检查代码可读性极高二、四种强制类型转换 速览表转换关键字用途最典型场景static_cast静态转换(编译期检查)基本类型转换、向上转型、有继承关系的安全转换dynamic_cast动态转换(运行期检查)多态子类转父类 / 父类转子类,安全向下转型const_cast常量转换(编译期检查)增删 const /volatile 限定reinterpret_cast重解释转换(编译期检查)指针互转、底层二进制重新解释(极度危险)三、逐个详解1. static_cast <静态转换>最常用、最安全编译期检查,没有运行时开销。用途基本类型转换(int ↔ double、int ↔ char 等)父类指针 → 子类指针(不安全,但允许)子类指针 → 父类指针(安全向上转型)void* 与其他指针互转示例 struct Base { virtual ~Base() {} }; struct Derived : Base {}; void run() { double d = 3.14; int i = static_cast<int>(d); std::cout << "double " << d << " -> int " << i << "\n"; Base* b = new Derived; Derived* derived = static_cast<Derived*>(b); // 不检查,直接转 std::cout << "static_cast 向下转型: " << derived << "\n"; delete b; }2. dynamic_cast <动态转换>唯一运行时检查的类型转换专门用于 多态继承结构 的安全转换。特点必须有虚函数父类 → 子类(向下转型)会检查是否合法转换失败:指针 → 返回 nullptr引用 → 抛出 bad_cast 异常用途安全的向下转型(父类指针 / 引用 转为 子类)示例 struct Base { virtual ~Base() {} }; struct Derived : Base {}; void run() { Base* b = new Derived; // 安全向下转型 Derived* d = dynamic_cast<Derived*>(b); if (d) { // 转换成功 } }3. const_cast <常量转换>唯一能修改 const/volatile 属性的转换用途去除 const添加 const只能修改限定符,不能改变类型最经典场景const 成员函数里修改成员兼容 const / 非 const 接口示例 void run() { int a = 42; const int* p = &a; int* q = const_cast<int*>(p); // 去除 const *q = 100; std::cout << "const_cast 修改后: " << a << "\n"; }4. reinterpret_cast <重解释转换>最暴力、最危险、最低级直接对二进制比特位重新解释。用途指针 ↔ 整数无关类型指针互转(如 int* ↔ char*)函数指针转换特点几乎无安全检查不可移植只有底层编程才用示例 void run() { int a = 0x12345678; char* p = reinterpret_cast<char*>(&a); // 把 int* 重解释为 char* std::cout << "reinterpret_cast 逐字节: "; for (size_t i = 0; i < sizeof(a); ++i) std::cout << std::hex << (static_cast<unsigned>(pi) & 0xFF) << " "; std::cout << std::dec << "\n"; }四、四种转换 核心区别一句话总结static_cast:日常通用转换,编译期安全检查dynamic_cast:多态类安全转换,运行时检查const_cast:只改 const/volatile,不改类型reinterpret_cast:底层暴力重解释,极度危险五、总结

优先使用 static_cast继承结构中向下转型 → 必须用 dynamic_cast只改 const → 用 const_cast不到万不得已,绝对不要用 reinterpret_cast永远避免 C 语言强转