C++定义了一组内置类型对象之间的标准转换,在必要时它们被编译器隐式地应用到对象上。
隐式类型转换发生在下列这些典型情况下。
1.在混合类型的算术表达式中;
在这种情况下最宽的数据类型成为目标转换类型,这也被称为算术转换( Arithmetic Conversion),例如:
int ival = 3;
double dval= 3. 14159;
ival + dval; // ival 被提升为double类型: 3.0
2.用一种类型的表达式赋值给另一种类型的对象;
在这种情况下目标转换类型是被赋值对象的类型。例如在下面第一个赋值中文字常量0的类型是int。它被转换成 int* 型的指针表示空地址。在第二个赋值中double型的值被截取成int型的值。
int *pi = 0; // 0被转换成 int* 类型的空指针值
ival = dval; // dval被截取为int值3
3.把一个表达式传递给一个函数,调用表达式的类型与形式参数的类型不相同;
在这种情况下目标转换类型是形式参数的类型。例如:
extern double sqrt( double );
cout << "The square root of 2 is "<< sqrt( 2 ) << endl; // 2被提升为double类型 2.0
4. 从一个函数返回一个表达式的类型与返回类型不相同。
在这种情况下返回的表达式类型自动转换成函数类型。例如:
double difference( int ival1,int ival2 )
{
return ival1-ival2; //返回值被提升为double类型
}
算术转换保证了二元操作符,如加法或乘法的两个操作数被提升为共同的类型,然后再用它表示结果的类型。两个通用的指导原则如下:
(1)为防止精度损失,如果必要的话,类型总是被提升为较宽的类型。
(2)所有含有小于整型的有序类型的算术表达式在计算之前其类型都会被转换成整型。