static_cast和reinterpret_cast有什么区别?
可能重复:
什么时候应该使用static_cast,dynamic_cast和reinterpret_cast?
我在c ++中使用c函数,在c中作为voidtypesparameter passing的结构直接存储在相同的结构types中。
例如在C.
void getdata(void *data){ Testitem *ti=data;//Testitem is of struct type. }
在c ++中做同样的事情我使用static_cast:
void foo::getdata(void *data){ Testitem *ti = static_cast<Testitem*>(data); }
当我使用reinterpret_cast
它做同样的工作,铸造结构
当我使用Testitem *it=(Testitem *)data;
这也是同样的事情。 但是如何利用三者来影响结构呢?
一个static_cast
是从一个types到另一个types的转换,(直觉上)是一个可以在某种情况下成功并且在没有危险演员的情况下有意义的演员。 例如,你可以static_cast
一个void*
到一个int*
,因为void*
实际上可能指向一个int*
,或者一个int
指向一个char
,因为这样的转换是有意义的。 然而,你不能static_cast
一个int*
到一个double*
,因为这个转换只有在int*
已经被改为指向一个double*
时才有意义。
reinterpret_cast
是一个表示不安全转换的强制转换,可能会将一个值的位重新解释为另一个值的位。 例如,将int*
转换为double*
对于reinterpret_cast
是合法的,尽pipe结果是未指定的。 类似地,将int
转换为void*
与reinterpret_cast
完全合法,虽然它是不安全的。
static_cast
和reinterpret_cast
都不能删除const
。 你不能使用这些强制转换将const int*
转换为int*
。 为此,您可以使用const_cast
。
(T)
forms的C风格转换被定义为尽可能地尝试做一个static_cast
如果不行的话,会回落到reinterpret_cast
。 如果绝对必要,它也会应用const_cast
。
一般来说,你应该总是喜欢static_cast
来保证应该是安全的。 如果你不小心尝试了一个没有定义好的转换,那么编译器会报错。 只有使用reinterpret_cast
才能真正改变机器中某些位的解释,如果你愿意冒一个reinterpret_cast
风险,只使用C-style。 对于你的情况,你应该使用static_cast
,因为在某些情况下void*
的downcast是很好定义的。