静态有什么区别
可能重复:
什么时候应该使用static_cast,dynamic_cast和reinterpret_cast?
我在c ++中使用c函数,其中在c中作为void类型参数传递的结构直接存储在相同的结构类型中。
例如在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
是从一个类型到另一个类型的转换,(直觉上)是一个可以在某种情况下成功并且在没有危险演员时有意义的演员。 例如,你可以static_cast
一个void*
到一个int*
,因为void*
实际上可能指向一个int*
,或者一个int
指向一个char
,因为这样的转换是有意义的。 然而,你不能static_cast
一个int*
到double*
,因为这个转换只有在int*
已经被修改为指向double*
时才有意义。
reinterpret_cast
是一个表示不安全转换的强制转换,可能会将一个值的位重新解释为另一个值的位。 例如,将int*
转换为double*
对于reinterpret_cast
是合法的,但结果是未指定的。 同样,将int
转换为void*
与reinterpret_cast
完全合法,尽管它是不安全的。
static_cast
和reinterpret_cast
都不能从某些东西中删除const
。 您无法使用这些强制转换将const int*
转换为int*
。 为此,您可以使用const_cast
。
格式(T)
的C风格转换被定义为尽可能地尝试执行static_cast
,如果不起作用,则回落到reinterpret_cast
。 如果它绝对必须的话,它也会应用const_cast
。
一般来说,您应该始终偏好static_cast
来保证应该安全的演员。 如果您不小心尝试进行没有明确定义的强制转换,那么编译器会报告一个错误。 只有使用reinterpret_cast
才能真正改变机器中某些位的解释,并且只有在您愿意冒险执行reinterpret_cast
时才使用C风格的转换。 对于你的情况,你应该使用static_cast
,因为void*
的downcast在某些情况下是明确定义的。