目录
1.static_cast
2.dynamic_cast
3.const_cast
4.reinterpret_cast
每种类型转换操作符都有其特定的应用场景和限制,应根据实际需求选择合适的转换方式。特别是
reinterpret_cast
,由于它的类型安全性很低,使用时需格外小心。
1.static_cast
- 用于执行在编译时已知的、相对安全的转换,例如基本数据类型之间的转换(如
int
转为double
)、父类与子类之间的转换(在继承关系中,但不涉及多态)、以及空指针和空类型之间的转换。 - 语法:
static_cast<new_type>(expression)
- 例子:
double d = 3.14;
int i = static_cast<int>(d); // d 被转换为 3
2.dynamic_cast
- 用于执行在运行时确定的类型安全的转换,主要用于处理多态(
polymorphic
)类型之间的转换。 - 只能用于具有虚函数的类(多态类型)之间的指针或引用转换。
- 如果转换失败,指针转换返回
nullptr
,引用转换抛出std::bad_cast
异常。 - 语法:
dynamic_cast<new_type>(expression)
- 例子:
class Base {
virtual void func() {}
};
class Derived : public Base {};
Base* basePtr = new Derived;
Derived* derivedPtr = dynamic_cast<Derived*>(basePtr); // 成功转换
3.const_cast
- 用于添加或移除
const
或volatile
属性。它是唯一可以移除const
限制的转换方式。 - 不能用于改变基本类型的
const
限定,尝试修改被const
限定的变量会导致未定义行为。 - 语法:
const_cast<new_type>(expression)
- 例子:
const int* p = new int(10);
int* modifiable = const_cast<int*>(p); // 移除了 `const` 属性
4.reinterpret_cast
- 用于执行低级别的、几乎没有类型安全保证的转换,例如指针类型之间的转换、指针与整数之间的转换。
- 通常用于硬件相关编程或处理底层数据结构。
- 语法:
reinterpret_cast<new_type>(expression)
- 例子:
int* p = new int(65);
char* ch = reinterpret_cast<char*>(p); // 将 int 指针转换为 char 指针