数据类型转换

写在前面

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)即不可移植的结果,例如将一个指针类型转型成一个整数,这种转换在底层代码以外极为罕见。

参考1
参考2

你可能感兴趣的:(数据类型转换)