2011-07-28 30 views
38

可能重复:
When should static_cast, dynamic_cast and reinterpret_cast be used?static_cast和reinterpret_cast有什么区别?

我使用c函数在C++中,其中在C的空隙型参数传递的结构被直接存储在相同的结构类型。

例如,在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;

这也做同样的事情。 但是结构如何受到它们三个的影响。

+0

该线程说什么时候使用它。当我使用这三件事时,我在问这个结构有什么不同,我也忘了dynamic_cast。简单地说,我想知道结构是如何受到影响的。 – HariHaraSudhan

+0

结构不受影响(除非在数字类型之间进行转换)。 –

回答

90

A static_cast是一种从一种类型到另一种类型的演员,(直觉上)是一种在某种情况下可以成功并在没有危险演员时有意义的演员。例如,您可以将static_cast a void*设置为int*,因为void*实际上可能指向int*intchar,因为这样的转换是有意义的。但是,您不能将static_castint*更改为double*,因为如果int*已被以某种方式损坏指向double*,此转换才有意义。

A reinterpret_cast是表示不安全转换的强制转换,可能会将一个值的位重新解释为另一个值的位。例如,将int*转换为double*reinterpret_cast合法,但结果未指定。同样,将int转换为void*reinterpret_cast是完全合法的,尽管它是不安全的。

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*的downcast是明确定义的。