写在前面
C/C++编程中常见数据类型转换,包括隐式类型转换和显式类型转换。
1. 隐式类型转换
隐式类型转换在以下典型情况下发生
- (1) 混合类型的算术表达式中
以最宽的数据类型作为目标转换类型,也称为算术转化
EX:
int iVal = 3;
double dVal = 3.1415;
iVal + dVal // iVal 会被提升为 double 类型:3.0
- (2) 赋值操作
1. int * p = 0;
常数 0 为 int 类型,被转换为 int * 类型的指针,表示空指针
2. iVal = dVal;
dVal被裁剪成 int 类型
- (3) 函数参数
实参类型和形参类型不相同
这种情况下,目标函数参数类型为**形参类型**
EX:
double func(double dVal);
...
int main()
{
double dTmp;
dTmp = func(1);
实参 1 被提升为 double 类型 1.0
}
- (4) 函数返回值类型与函数返回的值的类型不一致,会将返回的值的类型(return)自动转换成函数返回值类型
double diff (int iVal1, int iVal2)
{
return iVal1 - iVal2;
return返回的值的数据类型被提升为double型
}
2. 显式类型转换(四种强制类型转换机制)
C++ 基本类型的指针之间不含有隐式转换(void *
除外),需要显式转换
实现例如:
int *ip;
char *pc = (char *)ip;
C++引入4种强制类型转换操作符用于显式转换:
static_cast,dynamic_cast,const_cast 和 reinterpret_cast
每一种都有适用的特定目的,具体如下:
- (1)
static_cast
:可被用于强制隐型转换(例如:non-const对象转型成
const对象,
int转型为
double等等),它还可以用于很多这样的转换的反向转换(例如:
void *指针类型转成有类型的指针,基类指针转型为派生类指针),但是不能将
const转成
non-const` - (2)
dynamic_cast
:主要用于执行"安全的向下转型(safe down casting
)",即为确定一个对象是否是一个继承体系中的一个特定类型 - (3)
const_cast
:一般用于强制消除对象的常量性。它是唯一能做到这点的C++风格强制转换 - (4)
reinterpret_cast
:用于底层的强制转换,导致实现依赖(implementation-dependent
)即不可移植的结果,例如将一个指针类型转型成一个整数,这种转换在底层代码以外极为罕见。