static_cast <>和C样式转换之间有什么区别?


Answers:


217

C ++样式转换由编译器检查。C样式强制转换不是,并且可能在运行时失败。

同样,可以轻松地搜索c ++样式强制转换,而实际上很难搜索c样式强制转换。

另一个很大的好处是4种不同的C ++样式强制转换更清楚地表达了程序员的意图。

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


67
在运行时可能失败的唯一强制转换是dynamic_casts。
R. Martinho Fernandes'7

12
C ++ reinterpret_cast <T>(U)可能在运行时失败,几乎与C样式强制转换一样,并且它们与dynamic_cast <T>(U)失败的方式也大不相同。
克里斯托弗·史密斯

20
normal1正常的C强制转换(int)something不会失败- 强制转换为int或编译器错误。
托马什Zato -恢复莫妮卡

2
您能否详细说明为什么C ++强制转换比C强制转换更容易搜索?
Minh Tran

3
@MinhTran对于C ++风格,您可以在源文件中搜索关键字“ cast”。但是,您想使用C样式的类型转换吗?
huangzhaohao

176

简而言之

  1. static_cast<>() 为您提供了编译时检查功能,而C样式强制转换则没有。
  2. static_cast<>() 更具可读性,并且可以很容易地在C ++源代码中的任何位置发现,C_Style强制转换不是。
  3. 使用C ++强制转换可以更好地传达意图。

更多说明

静态类型转换在兼容类型之间执行转换。它类似于C样式的强制类型转换,但更具限制性。例如,C样式强制转换将允许整数指针指向char。

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

由于这会导致一个4字节指针(指向4字节数据类型的指针)指向已分配内存的1字节,因此写入此指针将导致运行时错误或覆盖某些相邻的内存。

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

与C样式强制转换相反,静态强制转换将允许编译器检查指针和指针数据类型是否兼容,从而允许程序员在编译期间捕获此错误的指针分配。

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

您也可以在此页面上查看有关C ++强制转换的更多说明:单击此处


17
我认为不是“ 4字节指针”,而是“ 4字节数据类型的指针”
iheanyi 2014年

但是它允许int q = static_cast <int>(c);
TonyParker

3
@TonyParker那是因为那行没有错。
Braden Best

15

请参见C ++强制转换运算符的比较

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

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

对于仅需要简单转换的情况,C样式转换的通用性可能会过大。在能力不同的几种不同的转换操作符之间进行选择的能力可以防止程序员无意间将其转换为错误的类型。


14
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!
}

5
您能否详细说明您的答案,并提供有关您提供的解决方案的更多说明?
abarisone 2015年

1
我认为答案表明,“ static_casts”检查类型转换,以确保它们沿着层次结构图中的有效路径。在此特定示例中,由于A和B在层次图中形成路径,因此允许从A *转换为B *或从B *转换为A *。C *不在路径上,因此static_cast将产生编译时错误。旁注:可能值得注意的是,从A *到B *的转换可能会在运行时因dynamic_cast而导致NULL,具体取决于真正的基础对象。
Tommy Chen

7

一篇很棒的文章,解释了C / C ++中的不同强制类型转换以及C样式强制类型的真正作用:https : //anteru.net/blog/2007/12/18/200/index.html

C样式转换,使用(type)变量语法。有史以来最糟糕的发明。尝试按此顺序执行以下强制转换:(另请参见C ++ Standard,5.4 expr.cast第5段)

  1. const_cast
  2. static_cast
  3. static_cast后跟const_cast
  4. reinterpret_cast
  5. reinterpret_cast之后是const_cast

5

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

static_cast 用于从基类的指针转换为派生类的指针,或在本机类型之间转换,例如将enum转换为int或将float转换为int。

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

C样式强制转换在编译或运行时均不执行任何检查。


3

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.