在C ++中显式类型转换有什么好处?

时间:2010-07-01 05:20:57

标签: c++

在C ++中使用显式类型转换有什么好处?

5 个答案:

答案 0 :(得分:8)

  1. 他们比完整的一般C风格演员更具体。你不会放弃相当多的类型安全性,编译器仍然可以为你仔细检查它们的某些方面。

  2. 如果您想尝试清理代码,可以轻松找到它们。

  3. 语法有意模仿模板化函数调用。因此,您可以通过定义自己的演员阵容来“扩展”语言(例如,Boost的lexical_cast)。

答案 1 :(得分:1)

阅读代码时的清晰度。除了编译器根本无法推断出隐式转换的情况之外,没有太多其他好处,在这种情况下,无论如何你都 进行显式转换。

推荐使用c ++进行投射的方法是dynamic_caststatic_cast以及其余的投射操作符:

http://www.cplusplus.com/doc/tutorial/typecasting/

答案 2 :(得分:1)

请注意,所有类型转换在C ++和C中都是显式的。在语言中,没有“隐式”类型转换。它被称为“隐式转换”和“显式转换”,后者也称为“强制转换”。

Typecasts最常用于禁止编译器发出警告。例如,如果您有一个有符号和无符号的值并比较它们,编译器通常会警告您。如果您知道比较是正确的,则可以将操作数转换为带符号的类型。

另一个例子是重载解析,其中类型转换可用于驱动要调用的函数。例如,要打印出char的地址,您不能只说cout << &c,因为这会尝试将其解释为C样式字符串。相反,您必须在打印之前强制转换为void*

隐式转换通常优于强制转换。 Boost通过隐式转换提供boost::implicit_cast。例如,以下内容依赖于指向void*

的隐式转换
cout << boost::implicit_cast<void*>(&c);

这样做的好处是它只允许安全的转换。例如,不允许向下倾斜。

答案 3 :(得分:0)

经常在void *上使用

来恢复隐式已知类型。在嵌入式操作系统上尤其常见的回调。这是一种情况,当你注册一个事件并可能将你的“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');

这意味着作为程序员,我们告诉编译器我们知道我们在调用什么。因此编译器会忽略此错误。