静态有什么区别

可能重复:
什么时候应该使用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_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在某些情况下是明确定义的。

链接地址: http://www.djcxy.com/p/4911.html

上一篇: What is the difference between static

下一篇: What should main() return in C and C++?