C++ 类型强转
static_cast
- 基本概念
static_cast
主要用于在相关类型之间进行转换,这些类型之间存在某种隐式转换关系。它在编译时进行检查,是一种比较安全的类型转换方式。
- 适用场景
- 基本数据类型转换:例如将
int
转换为double
,或者double
转换为int
(会截断小数部分)。int numInt = 5; double numDouble = static_cast<double>(numInt); int newNumInt = static_cast<int>(3.14);
- 类层次结构中的向上转换(将派生类指针或引用转换为基类指针或引用):假设存在基类
Base
和派生类Derived
。class Base {}; class Derived : public Base {}; Derived d; Base* b = static_cast<Base*>(&d);
- 基本数据类型转换:例如将
- 基本概念
dynamic_cast
- 基本概念
dynamic_cast
主要用于在类的层次结构中进行安全的向下转换(将基类指针或引用转换为派生类指针或引用),它在运行时进行类型检查。
- 适用场景
- 当有一个基类指针指向一个派生类对象,想要将其转换回派生类指针时使用。如果转换成功,返回有效的派生类指针;如果转换失败(例如基类指针实际指向的不是目标派生类对象),则返回
nullptr
(对于指针类型)或者抛出std::bad_cast
异常(对于引用类型)。class Base { virtual void f() {} }; class Derived : public Base {}; Base* b = new Derived(); Derived* d = dynamic_cast<Derived*>(b); if (d!= nullptr) { // 转换成功,可以安全使用d } else { // 转换失败 }
- 当有一个基类指针指向一个派生类对象,想要将其转换回派生类指针时使用。如果转换成功,返回有效的派生类指针;如果转换失败(例如基类指针实际指向的不是目标派生类对象),则返回
- 基本概念
const_cast
- 基本概念
const_cast
用于去除或添加const
或volatile
限定符。它主要用于在一些特定情况下修改原本被定义为const
的对象,但这种操作应该谨慎使用,因为修改const
对象可能会违反程序的逻辑和语义。
- 适用场景
- 当有一个
const
对象,但需要调用一个非const
成员函数(该函数不会实际修改对象状态且这种操作是合理的情况下)。例如:class MyClass { public: void nonConstFunction() {} }; const MyClass myObj; // 以下代码通过const_cast将const对象转换为非const对象,以便调用nonConstFunction const_cast<MyClass&>(myObj).nonConstFunction();
- 当有一个
- 基本概念
reinterpret_cast
- 基本概念
reinterpret_cast
是一种比较危险的类型转换,它可以将一种类型的指针转换为另一种几乎完全不相关类型的指针,或者将一个整数转换为指针类型,反之亦然。这种转换不进行任何类型检查,几乎是对内存的重新解释。
- 适用场景
- 在一些与底层硬件交互或者特定的内存操作场景下可能会用到,但要非常小心。例如,将一个整数表示的内存地址转换为某种类型的指针(这种操作在某些特定的嵌入式系统或者内存管理代码中可能会出现)。
int num = 0x12345678; // 将整数转换为字符指针(这是一种危险操作,仅用于示例) char* ptr = reinterpret_cast<char*>(&num);
- 在一些与底层硬件交互或者特定的内存操作场景下可能会用到,但要非常小心。例如,将一个整数表示的内存地址转换为某种类型的指针(这种操作在某些特定的嵌入式系统或者内存管理代码中可能会出现)。
- 基本概念
- C - style类型转换(旧的、不推荐的方式)
- 基本概念
- 在C++中仍然可以使用C - style类型转换,它的形式为
(目标类型)表达式
。这种转换方式不区分转换的类型,可能会隐藏一些潜在的错误。
- 在C++中仍然可以使用C - style类型转换,它的形式为
- 缺点
- 例如,
(int)3.14
这种转换,看起来很简单,但它没有像C++新的类型转换那样明确的语义区分,在复杂的代码中可能会导致难以发现的错误。而且它不像dynamic_cast
那样在运行时进行类型检查,也不像static_cast
那样在编译时进行严格的类型关系检查。
- 例如,
- 基本概念