1、const_cast(常量转化)
用于将const变量转化为非const。这里需要注意:如果一个变量被定义为const,通过const_cast转化函数转化后,这个值还是不能改变的。这里我们需要记住一句话:const_cast不是为了改变const变量的值而设计的,在函数参数的传递上const_cast的作用才显示出来。
void fun(int* n)
{
cout << n << endl;
}
int main()
{
const int n = 5;
//fun(&n);类型不匹配
fun(const_cast<int*>(&n));
return 0;
}
2、static_cast(静态转化,不作安全性检查)
- (1)用于基础类型之间的转换。
- (2)把空指针转化成目标类型的空指针。
- (3)把任何类型的表达式转化为void类型。
- (4)用于类层次结构中基类和派生类的之间指针和引用的转化。
- (5)用于多态向上转化(派生类转基类),如果向下(基类转派生类)转化可以转成功,但结果未知(因为派生类中可能会新增加其他成员,转化过去就会导致这一部分的数据不确定)。
//Test1为派生类,Test为基类
Test1 t1(4,2);
Test t = static_cast<Test1>(t1);
static_cast在转化失败后不会返回空,而是返回那个转换的未知的东西,这就存在一定的安全性。
3、dynamic_cast(动态转化)
dynamic_cast主要用于类层次中的基类和派生类之间的指针和引用的转化,在运行时会进行类型检查,因此可以保证向下转化的安全性。
它通过判断在执行到该语句的时候变量的运行时的类型和要转化的类型是否相同来判断是否能够进行向下转化。
4、reinterpret_cast(重新解释转化)
和它的名字一样,这个几乎什么都可以转,但会出问题。