采用C++进行程序开发的过程中,难免会遇到各种各样莫名其妙的问题,而有些问题只有了解了其用法和原理之后,才能避免在工作中犯错误。
本文将要讲解的C++两种隐式类型转换,如果不了解其用法,那么遇到问题的时候,可能就会陷入困境。
所以接下来就来讲解operator与构造函数的隐式类型转换,首先通过例子说明operator的隐式类型转换,再说明构造函数的隐式类型转换,最后再总结它们之间的区别。
一、 operator隐式类型转换
operator除了操作符的重载之外,还有隐式类型转换的功能。operator隐式类型转换是指隐式将当前对象生成其他类型的对象。
为了说明operator的隐式类型转换,首先实现ObjectA对象, 形如operator int的声明即为operator的隐式类型,而转换的类型为整型int。
1、主程序输入如下代码段,先创建ObjectA类型的对象objA,然后将该对象变量objA与整型数字4相加。
2、从 调试运行输出的结果看,ObjA虽然不是int类型,但是与整数类型4进行相加的时候,会调用到operator int函数,该函数返回的结果是int类型
二、构造函数的隐式类型转换
构造函数的隐式类型转换,是用其他类型来构造当前类型的临时对象。
为了说明构造函数的隐式类型转换,需要实现ObjectB类,该类实现了一个无参数构造函数、一个参数类型为ObjectA的构造函数,一个析构函数和打印函数,注意入参类型是ObjectB。
1、主程序中输入如下代码段, 创建ObjectA类型的对象objA,主要用于说明后面构造函数隐式类型的转换,接着创建ObjectB类型的对象objB,最后调用该对象的打印函数print,但是入参类型为ObjectA。
2、 从调试运行输出结果看,print函数声明的入参类型是ObjectB, 但是传递的类型是ObjectA,但是由于ObjectB有单一形参类型为ObjectA的构造函数,程序会隐式地将objA转换为ObjectB(objA)
3、 如果想禁用构造函数的隐式类型转换,那么构造函数前添加explicit 即可,例如:
三、总结
本文主要通过例子讲解了opertor隐式类型与构造函数隐式类型的用法,C++提供了这样的机制,必然有其合理性,正所谓存在即合理,但是,开发过程中,如果不注意的话,也会带来很多不必要的麻烦,因此,对其有一个整体的概念的理解,能够在开发过程中,给予一个警惕的作用。最后再来梳理下两种隐式类型转换的区别。
operator的隐式类型转换是将当前对象生成其他类型的对象。构造函数的隐式类型转换,是用其他类型来构造当前类型的临时对象operator的隐式类型转换与构造函数的隐式类型转换是相反的。