2009-10-22 113 views
135

有没有什么理由比C风格的铸件更喜欢static_cast<>?它们是否相同?他们有什么样的速度差异?static_cast <>和C风格铸造有什么区别?

+5

相关:http:// stackover flow.com/questions/103512/in-c-why-use-static-castintx-instead-of-intx – Flow 2013-04-07 17:24:26

回答

161

C++样式转换由编译器检查。 ç风格转换不是,可以在运行时失败

也,C++风格的转换可以搜索容易,而这真的很难搜索对于C风格的转换

的另一大好处是,在4个不同的C++风格演员更清楚地表达了程序员的意图。

在编写C++时,我几乎总是在C风格上使用C++。

+46

在运行时可能失败的唯一强制转换是'dynamic_cast's。 – 2012-07-27 00:13:45

+8

C++ reinterpret_cast (U)在运行时可能会失败,几乎与C风格转换的方式相同,并且它们与dynamic_cast (U)失败的方式完全不同。 – 2012-09-20 02:29:44

+11

˗1正常的C cast'(int)something'不能失败 - 或者你被转换为int或者编译器错误。 – 2015-11-16 12:34:37

2

由于有很多不同种类的铸件,每种铸件都有不同的语义,static_cast <>允许您说“我正在从一种类型到另一种类型进行合法转换”,如从int到double。一个普通的C风格演员可能意味着很多事情。你在上/下铸造吗?你是在重新解释一个指针吗?

12

请参阅A comparison of the C++ casting operators

但是,对于各种不同的铸造操作使用相同的语法可能会使程序员的意图不清楚。

此外,可能很难在大型代码库中找到特定类型的转换。

C风格演员的普遍性可能是矫枉过正的情况下,只需要一个简单的转换。能够在不同程度的权力的几个不同的铸造操作员之间进行选择可以防止程序员无意中铸造成不正确的类型。

129

总之

  1. static_cast<>()给你一个编译时检查的能力,C-风格 投没有。
  2. static_cast<>()更具可读性,并且可以在C++源代码中的任何位置轻松地发现 ,C_Style cast is'nt。
  3. 使用C++强制转换的意图被传达得更好。

更多的解释

静态浇铸执行兼容的类型之间的转换。它类似于C风格的演员,但更具限制性。例如,C风格的转换将允许一个整数指针指向一个字符。

char c = 10;  // 1 byte 
int *p = (int*)&c; // 4 bytes 

由于这导致了4个字节的数据类型指向分配的存储器的1个字节,写入该指针将或者导致运行时间错误,或者将覆盖一些相邻存储器。

*p = 5; // run-time error: stack corruption 

与此相反的C样式转换,静态投将让编译器检查指针和指针对象数据类型是兼容的,它允许程序员在编译期间赶上这不正确指针赋值。

int *q = static_cast<int*>(&c); // compile-time error 

您还可以查看关于C++更多的解释这个页面转换:Click Here

+9

我认为不是“4字节指针”,而是“指向4字节数据类型的指针” – iheanyi 2014-07-23 19:55:21

10
struct A {}; 
struct B : A {}; 
struct C {}; 

int main() 
{ 
    A* a = new A;  

    int i = 10; 

    a = (A*) (&i); // NO ERROR! FAIL! 

    //a = static_cast<A*>(&i); ERROR! SMART! 

    A* b = new B; 

    B* b2 = static_cast<B*>(b); // NO ERROR! SMART! 

    C* c = (C*)(b); // NO ERROR! FAIL! 

    //C* c = static_cast<C*>(b); ERROR! SMART! 
} 
+3

请您详细说明您的答案,然后添加关于您提供的解决方案的更多描述。 – abarisone 2015-04-16 11:15:29

+0

我认为答案显示“static_casts”检查类型转换以确保它们沿着层次结构图中的有效路径。在这个特殊的例子中,从A *到B *或B *到A *的转换是允许的,因为A和B在分层图中形成一条路径。 C *不在路径上,所以static_cast将产生编译时错误。 旁注:可能值得注意的是,从A *到B *的转换可能会导致在运行时带有dynamic_cast的NULL,具体取决于真实的基础对象。 – 2017-08-21 20:10:43

2

static_cast检查在编译时间转换不是很明显不兼容的类型之间。与dynamic_cast相反,在运行时不检查类型兼容性。此外,static_cast转换不一定安全。

static_cast用于将指针转换为基类到指向派生类的指针,或者在本机类型之间转换,例如枚举类型为int类型,或者float类型为int类型。

static_cast的用户必须确保转换是安全的。

C风格转换不会在编译时或运行时执行任何检查。

1

一个伟大的职位在C/C++解释不同类型转换,什么C样式转换确实:https://anteru.net/blog/2007/12/18/200/index.html

C风格的铸造,使用(类型)变量语法。有史以来最差的 发明。这试图做下列类型转换,顺序如下:(见 也C++标准,5.4 expr.cast第5段)

  1. 的const_cast
  2. 的static_cast
  3. 的static_cast随后的const_cast
  4. 的reinterpret_cast
  5. reinterpret_cast关注const_cast
相关问题