您的位置:首页 > 其它

reinterpret_cast const_cast dynamic_cast static_cast 区别使用【zhuan】

2009-09-08 16:48 246 查看
reinterpret_cast可以转换任意一个32bit整数,包括所有的指针和整数。可以把任何整数转成指针,也可以把任何指针转成整数,以及把指针转化为任意类型的指针,威力最为强大!但不能将非32bit的实例转成指针。总之,只要是32bit的东东,怎么转都行!
static_cast和dynamic_cast可以执行指针到指针的转换,或实例本身到实例本身的转换,但不能在实例和指针之间转换。static_cast只能提供编译时的类型安全,而dynamic_cast可以提供运行时类型安全。举个例子:
class A;class B:A;class C。
上面三个类A是基类,B继承A,C和AB没有关系。
有一个函数void function(A&a);
现在有一个对象是B的实例b,一个C的实例c。
function(static_cast<A&>(b)可以通过而function(static<A&>(c))不能通过编译,因为在编译的时候编译器已经知道c和a的类型不符,因此static_cast可以保证安全。
下面我们骗一下编译器,先把c转成类型a
B& ref_b = reinterpret_cast<B&>c;
然后function(static_cast<A&>(ref_b))就通过了!因为从编译器的角度来看,在编译时并不能知道ref_b实际上是c!
而function(dynamic_cast<A&>(ref_b))编译时也能过,但在运行时就失败了,因为dynamic_cast在运行时检查了ref_b的实际类型,这样怎么也骗不过去了。
在应用多态编程时,当我们无法确定传过来的对象的实际类型时使用dynamic_cast,如果能保证对象的实际类型,用static_cast就可以了。至于reinterpret_cast,我很喜欢,很象C语言那样的暴力转换:)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: