没有任何理由,更喜欢static_cast<>
对C风格的铸造? 他们是等价? 是他们的任何种类的速度差?
Answer 1:
C ++风格的转换是由编译器检查。 ç风格转换不会也在运行时失败
同时,C ++风格的转换可以搜索容易,而这真的很难搜索对于C风格的转换
另一大好处是,在4个不同的C ++风格的转换表达了程序员的意图更清晰。
当写C ++我倒是几乎总是使用C ++的人过的空调风格。
Answer 2:
总之 :
-
static_cast<>()
给你一个编译时检查能力,C样式转换没有。 -
static_cast<>()
是更具有可读性和可一个C ++源代码内的任何地方容易地发现,C_Style投is'nt。 - 意图是用C ++强制转换传达好得多。
更多的解释 :
静态浇铸进行兼容的类型之间的转换。 它类似于C风格的演员,而是更加严格。 例如,C样式转换将允许整数指针指向一个炭。
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 ++转换: 点击这里
Answer 3:
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!
}
Answer 4:
见的C ++转换运算符的比较 。
然而,使用相同的语法,适用于各种不同的铸造操作可以使程序员的意图尚不清楚。
此外,它可以是很难找到一个大的代码库特定类型的演员。
在C样式转换的普遍性可以矫枉过正,所有需要的是一个简单的转换情况。 的能力,不同程度的电力的几种不同的铸造运营商之间进行选择,可以防止程序员无意中铸造类型不正确。
Answer 5:
static_cast
在编译时该转换不是很明显不兼容的类型之间的检查。 相反, dynamic_cast
,不检查是否兼容类型在运行时完成。 此外, static_cast
转换不一定是安全的。
static_cast
用于从指针转换为基类的指针的派生类,或天然类型,例如枚举之间整数或浮点数为int。
用户static_cast
必须确保转换是安全的。
C风格的转换并不在编译或运行时进行任何检查。
Answer 6:
由于有许多不同种类的铸件各有不同的语义,的static_cast的<>让你说:“我正在做从一种类型的法律转换为另一种”像从int翻番。 一个普通的C样式转换可能意味着很多东西。 你向上/向下铸造? 你重新诠释的指针?
Answer 7:
一个伟大的帖子在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的
- 通过const_cast会reinterpret_castfollowed