static_cast和dynamic_cast和reinterpret_cast和const_cast

说明:记录一下强制类型转换的关键字

概况:

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实现函数地址的转换.

总结:以上就是关于强制类型转换的几个关键字用法。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值