是否有理由更喜欢static_cast<>
而不是C风格的投射?它们是等价的吗?他们有什么速度差异吗?
答案 0 :(得分:192)
编译器检查C ++样式转换。 C样式强制转换不是,并且可能在运行时失败
此外,可以轻松搜索c ++样式转换,而搜索c样式转换则非常困难
另一个很大的好处是4种不同的C ++风格转换更清晰地表达了程序员的意图。
在编写C ++时,我几乎总是使用C ++而不是C风格。
答案 1 :(得分:157)
简而言之:
static_cast<>()
为您提供编译时检查功能,C-Style
演员没有。static_cast<>()
更具可读性,可以轻松发现
在C ++源代码中的任何地方,C_Style cast都是'。更多解释:
静态广播会在兼容类型之间执行转换。它类似于C风格的演员表,但更具限制性。例如,C样式转换允许整数指针指向char。
char c = 10; // 1 byte
int *p = (int*)&c; // 4 bytes
由于这会导致指向已分配内存的1个字节的4字节指针(指向4字节数据类型的指针),写入此指针将导致运行时错误或将覆盖某些相邻内存。
*p = 5; // run-time error: stack corruption
与C样式转换相比,静态转换将允许编译器检查指针和指针数据类型是否兼容,这允许程序员在编译期间捕获这个不正确的指针赋值。
int *q = static_cast<int*>(&c); // compile-time error
您还可以在有关C ++演员表的更多说明中查看此页面:Click Here
答案 2 :(得分:15)
请参阅A comparison of the C++ casting operators。
但是,对于各种不同的转换操作使用相同的语法可能会使程序员的意图不明确。
此外,在大型代码库中找到特定类型的强制转换可能很困难。
对于所有需要的只是简单转换的情况,C风格演员的普遍性可能是过度的。在具有不同功率的几个不同铸造操作员之间进行选择的能力可以防止程序员无意中铸造到不正确的类型。
答案 3 :(得分:15)
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!
}
答案 4 :(得分:5)
static_cast
在编译时检查转换不是明显不兼容的类型。与dynamic_cast
相反,在运行时不会检查类型兼容性。此外,static_cast
转换不一定安全。
static_cast
用于将指针转换为基类,指向派生类,或者在本机类型之间转换,例如enum to int或float to int。
static_cast
的用户必须确保转换是安全的。
C-style强制转换在编译或运行时不执行任何检查。
答案 5 :(得分:4)
由于存在许多不同类型的每个具有不同语义的类型,因此static_cast&lt;&gt;允许你说“我正在从一种类型到另一种类型进行合法转换”,例如从int到double。简单的C风格演员阵容可能意味着许多事情。你在上/下铸造?你重新解释一个指针吗?
答案 6 :(得分:4)
一篇很棒的文章解释了C / C ++中不同的演员表,以及C风格演员真正做的事情:https://anteru.net/blog/2007/12/18/200/index.html
使用(类型)变量语法进行C样式转换。最糟糕的 发明的。这会尝试按以下顺序执行以下转换:(请参阅 也是C ++标准,5.4 expr.cast第5段)
- 的const_cast
- 的static_cast
- static_cast后跟const_cast
- 的reinterpret_cast
- reinterpret_cast跟随const_cast
醇>