在C++中提供了两种隐式类型转换,一种是只有一个变量的constructors,另一种是隐式类型转换操作符。前者是指能够以单一自变量成功调用的constructor,后者是可以自定义的operator。前者主要带来有的一个并非自己想要的类型转换问题,而后者主要出现在自己编写的类型的代码中,用以提供特定的隐式类型转换。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
首先是第一种,只有一个变量的constructor,它分有两种情况,第一种是定义的时候就只有一个变量需要传递,第二种是虽然变量较多,但是除了第一个变量以外都设置有默认值,这样的情况也可能出现未知的调用。见下面的两个例子:
class name
{
name(const string& _inputname);
name(const string& _firstname, const string& lastname = "undecalred");
};
其中第一个构造函数就是所谓的单变量gouzao函数,第二个则是第一个变量没有默认值,而剩下的(仅有的第二个)有默认值。
下面来看一个错误的自动调用隐式类型转换的bug例子(schwarz bug):
Jerry Schwarz,iostream函数库的作者,在为cin对象提供这样一个conversion:if( cin )时,为他定义了一个operator int(),在使用if( cin )时,cin对象会想办法找出一个恰当的类型转换函数以使这行语句能够通过编译,是的,提供一个operator int()的确在需要它的时候将其转换为了一个int,但是,倘若程序员这样错误的使用cin对象:cin << 1;而令人苦恼的点就是,这样的错误并不会被IDE找出来(仅仅考虑这里是一个operator int()会带来的问题,schwarz当然解决了这个问题,这里只是假设问题依旧存在着),因为编译器会想方设法地让这条语句通过编译,是的它的确能找到,那就是让cin通过隐式类型转换符变成一个int,然后将<<解释成左移。这不符合我们的预期,但是,它符合编译器的预期。
schwarz的解决办法是将operator int()换成了一个operator void*(),这个bug后来被戏称是”schwarz bug”。
如今为了阻止这种一个变量的构造函数被用于隐式类型转换操作,c++引入了关键词explict,用于阻止构造函数被用于隐式类型转换。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
现在让我们来简单的介绍一下隐式类型转换操作符,其定义方式是一个没有返回值,没有参数的函数,它的定义方式是operator 类型名(),例如operator int(),其中int可以换成其他的内置类型,也可以用自己的类型。