首先我们来了解一下c语言中的类型强转
#include<stdio.h>
int main()
{
int *p = NULL;
char *q = NULL;
q = p;
return 0;
}
不能直接转换,需要强转
#include<stdio.h>
int main()
{
int *p = NULL;
char *q = NULL;
q = (char*)p;
return 0;
}
OK,转换成功
下来看看c++中支持的类型转换
1、static_cast:强制将一种数据类型转换成另一种数据类型
用法:static_cast<类型>(变量或表达式)
主要有以下几种用法:
1.用于类层次结构中基类和派生类的指针或引用的转换(进行上行转换:把派生类指针或引用转成基类表示。是安全的;进行下行转换:把基类指针或引用转成派生类表示是不安全的,因为没有动态类型检查)
2.基本数据类型之间转换,如int到float
3.把空指针转换成目标类型的空指针
注意:如果涉及类的话,必须是两个相互联系的类型之间转换,不一定包含虚函数。
2、const_cast:去除对象的指针或引用的常性。
用法:const_cast<type_id>(expression)
该运算符用来修改类型的const或volatile属性。除了const 或volatile修饰之外, type_id和expression的类型是一样的。
常量指针被转化成非常量指针,并且仍然指向原来的对象;
常量引用被转换成非常量引用,并且仍然指向原来的对象;常量对象被转换成非常量对象。
3、reinterpret_cast:
主要有三种强制转换用途:改变指针或引用的类型、将指针或引用类型转换成一个足够长的整型、将整型转换成指针或引用类型。
用法:reinterpret_cast<type_id>(expression)type_id必须是指针、引用、函数指针或者成员指针。可以把一个指针转换成一个整型,也可以把一个整型转换成一个指针。
4、dynamic_cast:提供运行时类型检查
用法:dynamic_cast<type_id> (expression)
以上三种都是编译时完成的,而dynamic_cast是在运行时处理的,运行时会进行类型检查
不能用于内置类型的类型转换
dynamic_cast转换如果成功的话指向类的指针或引用,如果失败返回NULL
使用dynamic_cast转换时基类中一定要有虚函数,否则编译不通过。
原因:运行时类型检查需要运行时类型信息,而这个信息就是存在虚函数表中的。只有定义了虚函数才会产生虚函数指针只想虚函数表。
(5)在类的转换时,在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的。在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。
向上转换,即为子类指针指向父类指针(一般不会出问题);向下转换,即将父类指针转化子类指针。
向下转换的成功与否还与将要转换的类型有关,即要转换的指针指向的对象的实际类型与转换以后的对象类型一定要相同,否则转换失败。