龙空技术网

编码规范-C++:使用新的类型转换操作符代替C风格的类型转换

零壹问道 77

前言:

眼前姐妹们对“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语言转换符大全