在C ++中使用显式类型转换有什么好处?
答案 0 :(得分:8)
他们比完整的一般C风格演员更具体。你不会放弃相当多的类型安全性,编译器仍然可以为你仔细检查它们的某些方面。
如果您想尝试清理代码,可以轻松找到它们。
语法有意模仿模板化函数调用。因此,您可以通过定义自己的演员阵容来“扩展”语言(例如,Boost的lexical_cast)。
答案 1 :(得分:1)
阅读代码时的清晰度。除了编译器根本无法推断出隐式转换的情况之外,没有太多其他好处,在这种情况下,无论如何你都 进行显式转换。
推荐使用c ++进行投射的方法是dynamic_cast
,static_cast
以及其余的投射操作符:
答案 2 :(得分:1)
请注意,所有类型转换在C ++和C中都是显式的。在语言中,没有“隐式”类型转换。它被称为“隐式转换”和“显式转换”,后者也称为“强制转换”。
Typecasts最常用于禁止编译器发出警告。例如,如果您有一个有符号和无符号的值并比较它们,编译器通常会警告您。如果您知道比较是正确的,则可以将操作数转换为带符号的类型。
另一个例子是重载解析,其中类型转换可用于驱动要调用的函数。例如,要打印出char
的地址,您不能只说cout << &c
,因为这会尝试将其解释为C样式字符串。相反,您必须在打印之前强制转换为void*
。
隐式转换通常优于强制转换。 Boost通过隐式转换提供boost::implicit_cast
。例如,以下内容依赖于指向void*
cout << boost::implicit_cast<void*>(&c);
这样做的好处是它只允许安全的转换。例如,不允许向下倾斜。
答案 3 :(得分:0)
来恢复隐式已知类型。在嵌入式操作系统上尤其常见的回调。这是一种情况,当你注册一个事件并可能将你的“this”指针作为上下文void *传递时,那么当触发它时会传递void * context并将它转换回类型“this”指针是
答案 4 :(得分:0)
有时,显式强制转换可以通过使用显式关键字避免某些不良情况。
class ExplicitExample
{
public:
ExplicitExample(int a){...}
}
ExplicitExample objExp = 'A';//No error.. call the integer constructor
更改为
explicit ExplicitExample(int a){ ... }
现在编译。
ExplicitExample objExp = 'A';
我们在VS2005中收到此错误。 错误C2440:'初始化':无法从'char'转换为'ExplicitExample' 类'ExplicitExample'的构造方法被声明为'explicit'
要克服此错误,我们必须声明为
ExplicitExample objExp = ExplicitExample('A');
这意味着作为程序员,我们告诉编译器我们知道我们在调用什么。因此编译器会忽略此错误。