C++ type casting
Possible Duplicate:
When should static_cast, dynamic_cast and reinterpret_cast be used?
号
直到几天前,我一直在C++中使用C风格的类型转换,因为它看起来很好。我最近发现在C++中使用C是非常糟糕的。
我以前从未真正使用过C++,所以我想知道有没有人能告诉我(最好用自己的话)StasyType、RealTytQuask和CistySCAST之间的区别是什么?
我知道Const-Cast从某些东西中删除了一个"Const",但我不确定它们之间的区别是什么,以及在不同情况下需要使用什么。
- 你应该得到一本好书并正确地学习C++。:)stackoverflow.com/questions/388242/…这里有一个很好的总结:stackoverflow.com/questions/28002/…
- 这里是stackoverflow.com/questions/332030/…
- 它不是"非常糟糕",它很危险,需要小心,并且有维护缺陷。实际上,与使用原始指针相同。在C中,你没有更好的选择,但是C++提供了工具来表达你的意思,让编译器产生更好的警告和错误。
说"C型铸造是坏的"是一种极端,它本身就和使用C型铸造一样坏。
"新"C++风格转换应该使用的区域是:分层模型(UpcCasts、下拉、交叉)、常量正确性转换和重新解释转换。对于算术铸型,C型铸件的工作非常精细,不会造成危险,这就是为什么它们可以安全地用于C++代码的原因。实际上,我建议使用C样式的强制转换作为算术强制转换-只是为了使算术强制转换看起来不同于其他强制转换类型。
- 通过简单的搜索找不到C样式的强制转换(1),并且(2)在没有警告的情况下做坏事。所以最小化C型铸造是一件好事。数字类型的强制转换可以用构造函数风格的强制转换来完成,当然,这种强制转换还存在(1)而不是(2)。
- @本·沃伊特:首先,如果在一个经过深思熟虑的传统体系中(例如,正如我上面描述的那样),寻找演员的问题对我来说似乎并不是什么实际有用的东西。而且,不,当用这种方法时,他们不会毫无预警地做坏事。第二,如果功能型汽车不比C型车更好,那么使用功能型汽车有什么意义呢?此外,函数样式不能与多标记类型名称一起使用,例如unsigned int。
StasyType是当程序员知道对象的类型和/或想让编译器知道的时候,在编译时执行一个强制转换的标准C++方式。
动态"强制转换"类似于"(T)obj",在运行时检查强制转换。
reinterpret_cast用于在不同对象之间强制转换,而不进行运行时检查。
const-cast通过删除const和volatile限定符显式转换为相同的类型。
static_cast(e-of-TYPE2)是一种安全的铸件。这意味着有一个从类型2到类型1的转换。
reinterpret_cast接近于C强制转换,它允许几乎任何转换(有一些限制)。编译器希望您知道类型转换是正确的。
有一件事,无论是static_cast还是reinterpret_cast都不允许做,那就是删除一个常量。也就是说,如果你有一个const char *并且需要把它铸造到char *上,static_cast和reinterpret_cast都不允许这样做。相反,const_cast是您的朋友;const_cast用于从类型中删除const修饰符。
- const_cast不是你的朋友——别对它太亲热,它是你最后的手段。99%的情况似乎需要const_cast实际需要重构。
- reinterpret-cast的限制是:源类型和目标类型必须具有相同的大小。
静态类型-只是C类型的类型,例如(int)1.000。它不需要任何代价,也不会失败。但它的唯一价值是句法上的糖分(它对在编辑器中搜索很有用)
ReCurtTyCase-是(Value*)的C++等价物。它会在你脸上爆炸。用这个命令编译器只做这个,其他程序员要非常小心。
动态u cast是一个更安全的版本,如果无法完成转换,则返回空值。这有一个小的运行时成本。
另请参见何时应使用静态u cast、动态u cast、const u cast和重新解释u cast?
- 这是不正确的。C-cast比static_cast做得多,reinterpret_cast从不返回空值。
- 对不起,这不正确。Reinterpret_Cast是正常的C-Cast。静态的强制转换是在编译时检查的强制转换,我认为您正在考虑动态强制转换
- 说reinterpret_cast和C广播一样是不正确的。不是每个C转换都可以使用C++的Casts构建,而那些可以需要EDCOX1,0,EDCOX1,1,可选的EDOCX1 5。