static_cast <>和C风格铸造有什么区别?
有什么理由更喜欢static_cast<>
比C风格铸造? 他们是否等同? 他们有什么样的速度差异?
C ++风格转换由编译器检查。 C风格转换不是,可能会在运行时失败
另外,可以很容易地searchc ++风格的转换,而searchc风格的转换非常困难
另一个很大的好处就是4种不同的C ++风格的expression更清楚地expression了程序员的意图。
在编写C ++时,我总是使用C ++风格的C风格。
总之 :
-
static_cast<>()
给你一个编译时检查能力,C-stylestatic_cast<>()
不。 -
static_cast<>()
更具可读性,并且可以很容易地在C ++源代码中的任何地方发现,C_Style cast is'nt。 - 使用C ++types转换,意图被传达得更好。
更多解释 :
静态转换执行兼容types之间的转换。 它类似于C风格的演员,但更具限制性。 例如,C风格的转换将允许一个整数指针指向一个字符。
char c = 10; // 1 byte int *p = (int*)&c; // 4 bytes
由于这将导致指向分配内存的1个字节的4字节指针,写入该指针将导致运行时错误或将覆盖一些相邻的内存。
*p = 5; // run-time error: stack corruption
与C风格的转换相比,静态转换将允许编译器检查指针和指针数据types是否兼容,这允许程序员在编译期间捕获这个不正确的指针分配。
int *q = static_cast<int*>(&c); // compile-time error
你也可以查看这个页面关于C ++转换的更多解释: 点击这里
请参阅C ++铸造操作符的比较 。
但是,对于各种不同的铸造操作使用相同的语法可能会使程序员的意图不清楚。
而且,要在一个大的代码库中find一个特定的types转换是很困难的。
C风格演员的普遍性可能是矫枉过正的情况下,只需要一个简单的转换。 能够select不同程度的权力的几个不同的铸造操作员可以防止程序员无意中铸造到一个不正确的types。
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! }
因为有很多不同types的铸造,每个都有不同的语义,static_cast <>允许你说“我正在从一种types到另一种合法转换”,比如从int到double。 一个普通的C风格演员可能意味着很多事情。 你上/下铸造? 你是在重新解释一个指针吗?
static_cast
在编译时检查转换不在明显不兼容的types之间。 与dynamic_cast
相反,在运行时不检查types兼容性。 另外, static_cast
转换不一定是安全的。
static_cast
用于将指针转换为基类到派生类的指针,或者本地types之间的转换,比如枚举types为int或者floattypes为inttypes。
static_cast
的用户必须确保转换是安全的。
C风格转换不会在编译时或运行时执行任何检查。