dic*_*oce 188 c++ casting static-cast
有什么理由喜欢static_cast<>超过C风格的演员吗?它们是等价的吗?他们有什么速度差异吗?
Gle*_*len 201
编译器检查C++样式转换.C样式强制转换不是,并且可能在运行时失败
此外,可以轻松搜索c ++样式转换,而搜索c样式转换则非常困难
另一个很大的好处是,4种不同的C++风格的演员阵容更清晰地表达了程序员的意图.
在编写C++时,我几乎总是使用C++而不是C风格.
Rik*_*ika 165
简而言之:
static_cast<>() 给你一个编译时检查能力,C-Style演员没有.static_cast<>() 更具可读性,可以在C++源代码中的任何地方轻松发现,C_Style强制转换.更多说明:
静态强制转换执行兼容类型之间的转换.它类似于C风格的演员表,但更具限制性.例如,C样式转换将允许整数指针指向char.
char c = 10; // 1 byte
int *p = (int*)&c; // 4 bytes
Run Code Online (Sandbox Code Playgroud)
由于这会导致指向已分配内存的1个字节的4字节指针(指向4字节数据类型的指针),因此写入此指针将导致运行时错误或将覆盖某些相邻内存.
*p = 5; // run-time error: stack corruption
Run Code Online (Sandbox Code Playgroud)
与C样式转换相反,静态转换将允许编译器检查指针和指针数据类型是否兼容,这允许程序员在编译期间捕获这种不正确的指针赋值.
int *q = static_cast<int*>(&c); // compile-time error
Run Code Online (Sandbox Code Playgroud)
您还可以在有关C++演员表的更多说明中查看此页面:单击此处
Eug*_*ota 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!
}
Run Code Online (Sandbox Code Playgroud)
一篇很棒的文章,解释了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
由于有许多不同类型的强制转换,每种强制转换都有不同的语义,因此 static_cast<> 允许您说“我正在进行从一种类型到另一种类型的合法转换”,例如从 int 到 double 的转换。一个普通的 C 风格的演员阵容可以意味着很多事情。你是向上/向下投射吗?您正在重新解释指针吗?
static_cast在编译时检查转换不是明显不兼容的类型之间.与此相反dynamic_cast,在运行时不会检查类型兼容性.此外,static_cast转换不一定安全.
static_cast 用于将指针转换为基类,指向派生类的指针,或本机类型之间的转换,例如enum to int或float to int.
用户static_cast必须确保转换是安全的.
C风格的强制转换不会在编译或运行时执行任何检查.
| 归档时间: |
|
| 查看次数: |
81060 次 |
| 最近记录: |