说明:记录一下强制类型转换的关键字
概况:
static_cast
定义类型:static_cast<new_type>(expression).new_type为目标类型,expression为原始数据类型变量或者表达式。用于强制类型转换。编译时检查,运行时不能保证转换的安全性。主要使用情况:1:基类与派生类之间类型转换,2:常规类型之间转换。注意事项:关于const的转换。
下行转换(基类转换成派生类),不安全,如下:利用static_cast可以实现转换,但是在运行时会出错。
class CBase {
public:
virtual void Test() { printf("in CBase\n"); };
};
class CTest :public CBase {
public:
virtual void Test() { printf("in CTest\n"); };
virtual void Test2() { printf("in CTest Test2\n"); };
};
CBase *p = new CBase();
CTest *q = static_cast<CTest *>(p);//可以看出q不为nullptr.
q->Test2();//运行出错.
而且static_cast不能将const转换成non-cast.如下:
int j2 = 2;
const int *i = &j;
int *q = static_cast<int*>(i);//编译出错.无法丢掉常量.此时就用到了const_cast
为了实现避免下行转换不安全的问题,故提出了dynamic_cast。
dynamic_cast:
定义dynamic_cast<new_type>(expression).new_type必须为指针,引用和void*,而且表达式也必须为对应的指针,引用和void*,故可以看出没有常规类型转换。而且上变换和static_cast一样都是安全的,而下变化会和static_cast不同如下:此时利用dynamic_cast转换后,如果失败会返回nullptr.这样就保证了安全性。
CBase *p = new CBase();
CTest *q = dynamic_cast<CTest *>(p);//可以看出q为nullptr.
q->Test2();
而针对static_cast关于const转换的问题,提出了const_cast。
const_cast:
const_cast<type_id> (expression)
主要将const指针转换成非const指针,将const引用转换成非const引用。如下:
int j2 = 2;
const int *i = &j;
int *q = static_cast<int*>(i);//编译出错.无法丢掉常量.此时就用到了const_cast
int *q2 = const_cast<int *>(i);//成功.
reinpreter_cast:
reinpreter_cast<new_type>(expression).new_type为指针,引用,常规类型,或者函数指针。通过reinpreter_cast可以将任何指针都可以转换成常规类型。也可以将任何常规类型转换成指针。实现了相互转换,而且也满足了字节安全。主要使用环境为函数指针的相互转换。如下:
int Test_reinpreter(int i)
{
printf("i=%d",i);
return i;
}
typedef int(*reinpreter)(int);
reinpreter p;
int p1 = reinterpret_cast<int>(Test_reinpreter);//成功
int p2 = static_cast<int>(Test_reinpreter);//编译失败,类型转换无效
int p3 = dynamic_cast<int>(Test_reinpreter);//编译失败,类型必须为void*
p = reinterpret_cast<reinpreter>(p1);//将int转换成函数指针
p(2);//运行成功
在动态加载dll时,通过reinterpret_cast实现函数地址的转换.
总结:以上就是关于强制类型转换的几个关键字用法。