C++之类型转换

  隐式类型转换是编译器自动执行的,不需要程序员的介入,但是程序必须知道何时会发生隐式类型转换,有时候的隐式转换无法达到我们的预期,那就需要程序员多考虑考虑了。简单而言什么时候会发生隐式转换呢?首先相互转换的类型必须具有某种关联,比如bool型可以转换成int型的0和1等等,像字符串就不能隐式转换成int型,然后就是出现类型不匹配的问题,比如int a=3.14;这便发生double到int型的转换。

1.算术转换 

  算术类型之间的隐式转换被设计得尽可能避免损失精度,所以在有整型和浮点型的混合运算中,整型总是被隐式转换成浮点型,以保证处理的精度。算术转换的含义是将一种算术类型转换为另一种算术类型。算术转换中常用的就是整型提升,整型提升就是负责将小整型类型转化为大整型类型,实际中编译器不会对整型提升进行警告,但是对于将大整型类型转化为小整型,编译器会进行可能精度损失的警告,在实际中尽量避免这类转换。另外对于有符号和无符号类型之间转换要尽量避免,很容易出现溢出的问题,在实际中也不要混合使用无符号类型和有符号类型。

2.其他类型转换

  除了算术转换还有其他几种隐式转换类型,如下:

  1.数组转化为指针,在大多数情况下数组名会自动转换成指向首元素的指针;

  2.指针转换,常量0或字面值nullptr能转换成任意指针类型,指向任意非常量的指针能转换为void*,指向任意对象的指针能转换成const void* 

  3.转换成布尔类型,如指针是否为空能对应bool类型的true和false等等;

  4.转换成常量,允许将非常量类型的指针转换成相应的常量类型指针,引用也是可以的,这样是加上了顶层const;

  5.类类型的转换

3.显式转换

老式的显式转换

  老式的显式转换有两种形式:

1   type(expr);//函数类型的强制类型转换
2 
3   (type)expr;//C语言风格的强制类型转换

 

转型操作符

  为了解决C老式的强制类型转换存在的缺点,C++引入4个新的转型操作符:static_cast,const_cast,dynamic_cast,reinterpret_cast。下面一个个的来介绍吧!

a. static_cast

  其使用方式如下:

static_cast<type> (expr)

  其中的type就是你需要转换的目标类型。其与老式的类型转换具有相同的功能,以及相同限制。

b. const_cast

  const_cast从名称就可以看出,该转型操作符针对const类型,其只具有移除常量性的功能,不能用作其他用途。想到一个使用的地方,是在const和非const成员函数中,为了避免代码重复,让非const成员函数调用const成员函数,其中使用了const_cast来进行常量性移除,这是《Effective C++》中涉及到的,以后会再写专门博客啦!

const char *pc;
char *p=const_cast<char*> (pc);

c. dynamic_cast

  该转换使用在类继承体系中的,用来向下转型或跨系转型动作,比如利用dynamic_cast将指向基类的对象的指针或者引用转型为指向派生类对象的指针或引用。dynamic_cast只能用于继承体系中,其他地方不能用!

d. reinterpret_cast

  reinterpret_cast和编译平台相关,故而其不具备可移植性,reinterpret_cast的最常用的用途是转换“函数指针”类型,例如:

typedef void (*FuncPtr) ();//FuncPtr为函数指针,无形参且范围值为void
FuncPtr funcPtrArray[10];//funcPtrArray为数组,内有10个函数指针
int dosomething();//存在dosomething函数,向将其函数指针放在上面的数组中,那么必须要进行类型转换
funcPtrArray[0]=reinterpret_cast<FuncPtr>(&dosomething);

一般情况下不要使用reinterpret_cast来进行函数指针类型转换!在实际中好像也比较少用到吧!

 注意:C++中务必使用转型操作符!其实实际中也尽量避免进行强制类型转换,存在强制类型转换很多情况下是程序设计的问题,毕竟强制类型转换干扰了正常的类型检查!

  

原文地址:https://www.cnblogs.com/chmm/p/7423215.html