1.static_cast 基本的类型转换
用于进行比较“自然”和低风险的转换,如整型和浮点型、字符型之间的互相转换。另外,如果对象所属的类重载了强制类型转换运算符 T(如 T 是 int、int* 或其他类型名),则 static_cast 也能用来进行对象到 T 类型的转换。不能用于在不同类型的指针之
间互相转换,也不能用于整型和指针之间的互相转换,当然也不能用于不同类型的引用之间的转换
int i = 10;
auto ret1 = static_cast<float>(i); //ret1为float类型
2.const_cast 取消const限定(不能增加const限定)
不推荐使用,移除增加const限定可以使用:std::add_const或std::remove_const
const int i1 = 0;
auto ret1 = const_cast<int&>(i1);//ret1类型为int
int i2 = 0;
auto ret2 = const_cast<const int&>(i2);//ret2仍然为int类型
int i3 = 0;
auto ret3 = static_cast<const int&>(i3);
auto ret4 = static_cast<const int>(i3); //ret3和ret4都为int类型
std::cout << ret1 << i1; //00
ret1++; //i1不能执行自增操作
std::cout << ret1; //1
3.reinterpret_cast 指针类型转换
用于进行各种不同类型的指针之间、不同类型的引用之间以及指针和能容纳指针的整数类型之间的转换。转换时,执行的是逐个比特复制的操作。
int* p = nullptr;
auto ret1 = reinterpret_cast<float*>(p); //ret1类型为float*
auto ret2 = reinterpret_cast<void*>(ret1);//ret2类型为void*
4.dynamic_cast
reinterpret_cast 可以将多态基类(包含虚函数的基类)的指针强制转换为派生类的指针,但是这种转换不检查安全性,即不检查转换后的指针是否确实指向一个派生类对象。dynamic_cast专门用于将多态基类的指针或引用强制转换为派生类的指针或引用,而且能够
检查转换的安全性。对于不安全的指针转换,转换结果返回 NULL 指针。
dynamic_cast 是通过“运行时类型检查”来保证安全性的。dynamic_cast 不能用于将非多态基类的指针或引用强制转换为派生类的指针或引用——这种转换没法保证安全性,只好用 reinterpret_cast 来完成。
dynamic_cast 在进行引用的强制转换时,如果发现转换不安全,就会拋出一个异常,通过处理异常,就能发现不安全的转换。