关于c ++:static_cast和reinterpret_cast有什么区别?

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_castint*,因为void*实际上可能指向int*intchar,因为这种转换是有意义的。但是,您不能将static_castint*转换为double*,因为只有当int*被某种方式损坏而指向double*时,这种转换才有意义。

reinterpret_cast是一个表示不安全转换的强制转换,它可以将一个值的位重新解释为另一个值的位。例如,将int*强制转换为double*对于reinterpret_cast是合法的,尽管结果未指明。同样,将int铸造到void*是完全合法的,尽管它是不安全的。

static_castreinterpret_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*的向下投射是定义良好的。