前言:
眼前姐妹们对“c语言转换符大全”大概比较珍视,看官们都想要剖析一些“c语言转换符大全”的相关内容。那么小编同时在网络上搜集了一些关于“c语言转换符大全””的相关知识,希望兄弟们能喜欢,小伙伴们一起来了解一下吧!编号
CON#004
标题
使用新的类型转换操作符(static_cast、const_cast、dynamic_cast和reinterpret_cast)代替C风格的类型转换
语言
C++
级别
1
类别
转换
规范说明
假设这些:
class CMyClass : public CMyBase {...};class CMyOtherStuff {...} ;CMyBase *pSomething; // Filled somewhere
现在,这两段代码是用相同的方式编译的:
CMyClass *pMyObject;pMyObject = static_cast<CMyClass*>(pSomething); // Safe; as long as we checkedpMyObject = (CMyClass*)(pSomething); // Same as static_cast<>. Safe; as long as we checked, but harder to read
然而,让我们看看下面这段几乎完全相同的代码:
CMyOtherStuff *pOther;pOther = static_cast<CMyOtherStuff*>(pSomething); // Compiler error: Can't convertpOther = (CMyOtherStuff*)(pSomething); // No compiler error. Same as reinterpret_cast<> and it's wrong!!!
如您所见,如果不深入了解所有涉及的类,就很难区分这两种情况。
第二个问题是C风格的类型转换很难定位。在复杂的表达式中,C风格的类型转换可能很难发现。在没有完整的C++编译器前端的情况下,编写一个需要定位C风格类型转换的自动化工具(例如搜索工具)几乎是不可能的。另一方面,搜索“static_cast<”或“reinterpret_cast<”却很容易。
pOther = reinterpret_cast<CMyOtherStuff*>(pSomething); // No compiler error. // but the presence of a reinterpret_cast<> is // like a Siren with Red Flashing Lights in your code. // The mere typing of it should cause you to feel VERY uncomfortable.
这意味着,不仅C风格的类型转换更危险,而且很难找到所有的转换来确保它们是正确的。
有关新的类型转换操作符的讨论,请参见CON#006。
由于内置类型的转换函数(如)的行为与C风格的类型转换完全相同,因此也不允许使用它们:
a = int(b); // Wrong, is the same as a = (int) b;
此规则的例外情况:使用(void)来丢弃返回值是允许的。
参考文献
StackOverflow Q103512
标签: #c语言转换符大全