3.5.8 转型构造函数与隐式类型转换
转型构造函数可替代函数重载机制。假设函数f的参数类型为Person对象:
如果以一个string作为参数来调用f:
只要Person类拥有这样一个转型构造函数:
那么编译器就在string对象s上调用该转型构造函数,以此来构造一个Person对象作为f的参数。因而,我们称Person类的转型构造函数支持隐式类型转换(implicit type conversion),也就是说,该构造函数采用隐藏方式将一个string转型为一个Person。之所以说它是隐式的,是因为这个转型动作由编译器来完成,不需要编程(www.cppentry.com)人员提供一个明确的转型操作。
目前,这种隐式类型转换的确为我们提供了方便,但有时隐式类型转换会导致一些无法预料的错误,而这些错误往往细微得难以察觉。在这种时候,我们宁愿关闭这种因转型构造函数的存在而导致的隐式类型转换动作,以保证程序的正确性。C++(www.cppentry.com)提供的关键字explicit可帮助我们实现这项功能。
例3-30
本例列举了explicit关键字的语法和使用方法。第一次对f的调用是合法的,因为提供的参数p是一个Person对象;第二次调用则无效,因为提供的参数是一个string而非Person。由于Person类的转型构造函数已经标记为explicit,所以它不能为“将b对象转型为Person类型”这个操作(目的是匹配f的原型)提供服务。使用explicit关键字带来的好处是:将难以察觉的、后果严重的运行期错误变成了容易改正的编译期错误。