Answers:
C ++样式转换由编译器检查。C样式强制转换不是,并且可能在运行时失败。
同样,可以轻松地搜索c ++样式强制转换,而实际上很难搜索c样式强制转换。
另一个很大的好处是4种不同的C ++样式强制转换更清楚地表达了程序员的意图。
在编写C ++时,我几乎总是在C风格上使用C ++。
dynamic_cast
s。
(int)something
不会失败- 强制转换为int或编译器错误。
简而言之:
static_cast<>()
为您提供了编译时检查功能,而C样式强制转换则没有。static_cast<>()
更具可读性,并且可以很容易地在C ++源代码中的任何位置发现,C_Style强制转换不是。更多说明:
静态类型转换在兼容类型之间执行转换。它类似于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 ++强制转换的更多说明:单击此处
请参见C ++强制转换运算符的比较。
但是,对各种不同的转换操作使用相同的语法可能会使程序员的意图不清楚。
此外,可能难以在大型代码库中找到特定类型的强制转换。
对于仅需要简单转换的情况,C样式转换的通用性可能会过大。在能力不同的几种不同的转换操作符之间进行选择的能力可以防止程序员无意间将其转换为错误的类型。
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!
}
一篇很棒的文章,解释了C / C ++中的不同强制类型转换以及C样式强制类型的真正作用:https : //anteru.net/blog/2007/12/18/200/index.html
C样式转换,使用(type)变量语法。有史以来最糟糕的发明。尝试按此顺序执行以下强制转换:(另请参见C ++ Standard,5.4 expr.cast第5段)
- const_cast
- static_cast
- static_cast后跟const_cast
- reinterpret_cast
- reinterpret_cast之后是const_cast