C++类型转换讲解



c语言里的基础类型,char,short,int,uint,long.ulong,float,double,他们在表达式里是有隐式类型的转换,做运算时,默认转换为右值的最大类型,然后运算,得出结果后强转为左值的类型赋值给左值,期间char,short一定是先转换为int类型,而且基础类型里无符号大于有符号。C++里也满足这样的关系,但是现在有类了,类和基础数据类型怎么进行转换呢。

如果基础数据类型想要转换成类类型,需要有转换构造函数,转换构造函数只有一个参数,而且参数的类型是基本类型或其他类类型。如果我们的参数是一个基本数据类型,那么只要是基本类型的数据都会强制转换为这个类型的值然后调用一个转换构造函数完成基础数据类型到类类型的转换。因为参数的类型可以是其他类类型,所有也可以完成类型到类型的转换。

如果是类类型转换成基础数据类型,需要有类型转换函数,需要自己实现Type operator Type(){}的函数。此函数也可以完成类型到类型的转换。

两者都是自动调用,而且都可以完成类类型之间的转换,所有如果两个类,右值的类类型有类型转换函数,左值的类类型有转换构造函数就会有二义性。还有当一个类类型的转换构造函数是基础类型时,不仅会自动调用而且还是有隐式类型的C语言的转换,我们想避免上述两者情况怎么办?

对于后者,我们可以在转换构造函数前加上一个explicit关键词,告诉编译器,不要自动调用这个转换构造函数,要让使用者显示调用。这样虽然我们没有完全解决了基础数据类型之间的相互转换,但是我们通过显示调用这个函数提示使用者一定考考虑是否使用此转换构造函数。

对于前者,我们有两种方法,一是对转换构造函数使用关键字explicit,这样编译器不能再自动调用类型转换函数,所有只能调用转换构造函数,二,为了避免类型转换函数也自动的调用我们通常不使用类型转换函数,而是在类的成员方法里,提供toType()的成员函数去完成类型转换的功能。

猜你喜欢

转载自yule-maiyewang.iteye.com/blog/2406728