C++四种类型转换全解析,面试必考的类型转换题!
C++的四种类型转换是面试高频考点。本文系统讲解static_cast、dynamic_cast、const_cast、reinterpret_cast的使用场景和注意事项,附带大量代码示例!
1. 为什么需要类型转换
1.1 C风格类型转换的问题
// C风格转换:不安全,难以识别
int a = 10;
double b = (double)a; // 基本类型转换
char* p = (char*)"hello"; // 指针转换,危险!
Base* base = new Derived;
Derived* d = (Derived*)base; // 向下转型,不安全
C风格转换的问题:
- 转换意图不明确
- 编译器难以检查
- 代码可读性差
- 所有转换混在一起,难以区分
1.2 C++四种类型转换
| 转换类型 | 用途 | 运行时检查 | 安全性 |
|---|---|---|---|
| static_cast | 编译期类型转换 | 否 | 中 |
| dynamic_cast | 安全的向下转型 | 是 | 高 |
| const_cast | 去除const/volatile | 否 | 低 |
| reinterpret_cast | 低级别位转换 | 否 | 极低 |
2. static_cast
2.1 基本用法
// 1. 基本类型转换
int a = 10;
double b = static_cast<double>(a); // int -> double
// 2. 指针向上转型(安全)
class Base {
};
class Derived : public Base {
};
Derived* d = new Derived;
Base* b = static_cast<Base*>(d); // 向上转型,安全
// 3. 指针向下转型(不安全,需要程序员保证)
Base* base = new Derived;
Derived* d2 = static_cast<Derived*>(base); // 向下转型,不安全
// 4. void* 与其他指针互转
void* p = nullptr;
int* ip = static_cast<int*>(p); // void* -> int*
2.2 使用场景
// 场景1:显式类型转换,提高代码可读性
double result = static_cast<double>(numerator) / denominator;
// 场景2:类层次结构中的向上转型
class Animal {
public:
virtual void speak() {
cout << "Animal" << endl; }
};
class Dog :


381

被折叠的 条评论
为什么被折叠?



