1.static_cast
static_cast用于非多态类型转换(静态转换),编译器隐式执行的任何类型转换都可用static_cast,但它不能用于两个不相关类型的转换。
例如如下demo:
#include<iostream>
int main()
{
double i = 3.14;
int a = static_cast<int>(i);
std::cout << a << std::endl;
return 0;
}
//3
2.reinterpret_cast
reinterpret_cast操作符通常为操作数的位模式提供较低层次的重新解释,用于将一种类型转换为另一种不 同的类型
3.const_cast
const_cast最常用的用途就是删除变量的const属性,方便赋值
看如下demo:
int main ()
{
const int i = 10;
int *a = const_cast<int*>(&i);
*a = 100;
std::cout << i << std::endl;
return 0;
}
4.dynamic_cast
dynamic_cast用于将一个父类对象的指针转换为子类对象的指针或引用(动态转换)
但注意:
- dynamic_cast只能用于含有虚函数的类 。
- dynamic_cast会先检查是否能转换成功,能成功则转 换,不能则返回0。
看下面的demo:
class A{
public:
virtual void f(){}
};
class B :public A{
public:
virtual void f1(){}
};
void fun(A* p){
B*pb1 = static_cast<B*>(p);
B*pb2 = dynamic_cast<B*>(p);
std::cout << "pb1:" << pb1 << std::endl;
std::cout << "pb2:" << pb2 << std::endl;
}
int main()
{
A a;
B b;
fun(&a);
fun(&b);
return 0;
}
-----------------------------------------------------------------
pb1:0x7ffd41d29260
pb2:0
pb1:0x7ffd41d29250
pb2:0x7ffd41d29250
5.RTTI
RTTI:Run-time Type identification的简称,即:运行时类型识别。
C++通过以下方式来支持RTTI:
1.typeid运算符
2.dynamic_cast运算符