What is the difference between static_cast and reinterpret_cast?
Possible Duplicate:
When should static_cast, dynamic_cast and reinterpret_cast be used?
我在C++中使用C函数,其中在C中作为空类型参数传递的结构直接存储了相同的结构类型。
在C.
1 2 3
| void getdata(void *data){
Testitem *ti=data;//Testitem is of struct type.
} |
在C++中使用同样的方法,我使用STATICE-CAST:
1 2 3
| void foo::getdata(void *data){
Testitem *ti = static_cast<Testitem*>(data);
} |
当我使用reinterpret_cast时,它也做同样的工作,转换结构
当我使用Testitem *it=(Testitem *)data;时
这也是同样的事情。但是使用这三种方法对结构有什么影响呢?
- 那条线说明了什么时候使用它。我在问在使用这三件事时,结构有什么不同,我也忘记了动态投射。简单地说,我想知道结构是如何受到影响的。
- 结构不受影响(除非在数字类型之间强制转换)。
static_cast是一种从一种类型到另一种类型的转换,(直观地)是一种转换,在某些情况下可以成功,并且在没有危险转换的情况下是有意义的转换。例如,您可以从static_cast到int*,因为void*实际上可能指向int*或int到char,因为这种转换是有意义的。但是,您不能将static_cast和int*转换为double*,因为只有当int*被某种方式损坏而指向double*时,这种转换才有意义。
reinterpret_cast是一个表示不安全转换的强制转换,它可以将一个值的位重新解释为另一个值的位。例如,将int*强制转换为double*对于reinterpret_cast是合法的,尽管结果未指明。同样,将int铸造到void*是完全合法的,尽管它是不安全的。
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*的向下投射是定义良好的。