C++语法

强制类型转换

static_cast

用于基本数据类型之间的转换,以及在类层次结构中基类和派生类之间的指针或引用的转换。它在编译时执行,不提供运行时类型检查

如果对象所属的类重载了强制类型转换运算符 T(如 T 是 int、int* 或其他类型名),则 static_cast 也能用来进行对象到 T 类型的转换。

static_cast 不能用于在不同类型的指针之间互相转换,也不能用于整型和指针之间的互相转换,当然也不能用于不同类型的引用之间的转换。因为这些属于风险比较高的转换。

例:

1
2
3
int a = 10;
int b = 3;
double result = static_cast<double>(a) / static_cast<double>(b);

dynamic_cast

用于类层次结构中的指针和引用的转换,它在运行时检查类型的安全性。它要求转换的类型必须包含至少一个虚函数。

如果转换失败,dynamic_cast会返回nullptr

例:

1
2
3
4
class Base {};
class Derived : public Base {};
Base* basePtr = new Derived();
Derived* derivedPtr = dynamic_cast<Derived*>(basePtr); // 安全的转换

dynamic_cast与reinterpret_cast的区别:

  • 用 reinterpret_cast 可以将多态基类(包含虚函数的基类)的指针强制转换为派生类的指针,但是这种转换不检查安全性,即不检查转换后的指针是否确实指向一个派生类对象。
  • dynamic_cast专门用于将多态基类的指针或引用强制转换为派生类的指针或引用,而且能够检查转换的安全性。对于不安全的指针转换,转换结果返回 nullptr 指针。

const_cast

仅用于去除变量的const属性。它主要用于操作指向常量对象的指针或引用的const属性。

例:

1
2
3
4
const int a = 10;
const int* p = &a;
int* q = const_cast<int*>(p);
*q = 20; // 现在*q可以被修改

reinterpret_cast

用于低级的强制类型转换,如改变指针类型或将指针转换为足够长度的整型。它仅仅复制位模式,不改变值本身

[!warning]

这种转换是不安全的,因为它不保证转换结果的有效性:

例如,执意把一个 int* 指针、函数指针或其他类型的指针转换成 string* 类型的指针也是可以的,至于以后用转换后的指针调用 string 类的成员函数引发错误,则需要程序员自行承担查找错误的烦琐工作

例:

1
2
int* a = new int;
double* d = reinterpret_cast<double*>(a);

主题