12.6 自动类型转换

在C和C++中,如果编译器看到一个表达式或函数调用使用了一个不合适的类型,它经常会执行一个自动类型转换,从现在的类型到所要求的类型。在C++中,可以通过定义自动类型转换函数来为用户定义类型达到相同效果。这些函数有两种类型:特殊类型的构造函数和重载的运算符。

12.6.1 构造函数转换

如果定义一个构造函数,这个构造函数能把另一类型对象(或引用)作为它的单个参数,那么这个构造函数允许编译器执行自动类型转换。如下例:

12.6 自动类型转换 - 图1

当编译器看到f()以类One的对象为参数调用时,编译器检查f()的声明并注意到它需要一个类Two的对象作为参数。然后,编译器检查是否有从对象One到Two的方法。它发现了构造函数Two:Two(One),Two:Two(One)被悄悄地调用,结果对象Two被传递给f()。

在这种情况下,自动类型转换避免了定义两个f()重载版本的麻烦。然而,代价是调用Two的隐藏构造函数,如果关心f()的调用效率的话,那就不要使用这种方法。

12.6.1.1 阻止构造函数转换

有时通过构造函数自动转换类型可能出现问题。为了避开这个麻烦,可以通过在前面加关键字explicit(只能用于构造函数)来对上例类Two的构造函数进行修改:

12.6 自动类型转换 - 图2

通过使类Two的构造函数显式化,编译器被告知不能使用那个构造函数执行任何自动转换(那个类中其他非显式化的构造函数仍可以执行自动类型转换)。如果用户想进行转换必须写出代码。上面代码f(Two(One))创建一个从类型One到Two的临时对象,就像编译器在前面版本中所做的那样。