有什么理由比 C 风格选角更喜欢
static_cast<>
吗?它们相等吗?速度有什么区别吗?
C++ 样式转换由编译器检查。 C 风格的转换不是这样,并且可能在运行时失败。
此外,C++ 风格的转换很容易搜索到,而 C 风格的转换却很难搜索。
另一个很大的好处是 4 种不同的 C++ 风格转换更清楚地表达了程序员的意图。
在编写 C++ 时,我几乎总是使用 C++ 风格而不是 C 风格。
简而言之:
static_cast<>()
为您提供编译时检查能力,C 风格
演员阵容没有。static_cast<>()
更具可读性,更容易被发现
在 C++ 源代码中的任何位置,C_Style 转换都不是。更多说明:
静态转换在兼容类型之间执行转换。它类似于 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++ 类型转换的更多说明:单击此处
请参阅 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++ 标准,5.4 expr.cast 第 5 段)
- const_cast
- 静态演员
- static_cast 后接 const_cast
- 重新解释_演员表
- reinterpret_cast 随后是 const_cast
static_cast
在编译时检查是否在明显不兼容的类型之间进行转换。与 dynamic_cast
相反,运行时不会检查类型兼容性。另外,static_cast
转换不一定安全。
static_cast
用于从指向基类的指针转换为指向派生类的指针,或者在本机类型之间进行转换,例如 enum 到 int 或 float 到 int。
static_cast
的用户必须确保转换是安全的。
C 风格的强制转换在编译时或运行时都不执行任何检查。
由于有许多不同类型的转换,每种类型都有不同的语义,因此 static_cast<> 允许您说“我正在进行从一种类型到另一种类型的合法转换”,例如从 int 到 double 的转换。一个普通的 C 风格的演员阵容可以意味着很多事情。你是向上/向下投射吗?您正在重新解释指针吗?