C++中四种类型转化

我们都知道:
C中的强制类型转换(Type Cast)很简单,不管什么类型的转换都是:
Type b = (Type)a

而C++中有四种转换类型如下:
static_cast ,const_cast ,dynamic_cast,reinterpret_cast
我们来详细了解一下:

1.static_cast静态转换(在编译期间处理)

类似于C风格的强制转换最常用的类型转换符,在正常状况下的类型转换。主要用于C++中内置的基本数据类型之间的转换。但是没有运行时类型的检测来保证转换的安全性。

如把int转换为float,

int i;
float f; 
f=(float)i;  //c中的类型强制转换
//或者
f=static_cast<float>(i);
static_cast类型的转换还有什么用处呢?
  1. 用于基类和子类之间的指针或引用的转换。这种转换把子类的指针或引用转换为基类表示是安全的;进行下行转换,把基类的指针或引用转换为子类表示时,由于没有进行动态类型检测,所以是不安全的;
    简言之:子转父,安全;父转子,不安全。
  2. 把void类型的指针转换成目标类型的指针(不安全)
  3. 用于内置的基本的数据类型之间的转换
  4. 把任何类型的表达式转换成void类型的

注意:static_cast不会转换掉const,volatile,__unaligned属性

2. const_cast去常转换(编译时执行)

它主要作用于同一个类型之间的去常和添加常属性之间的转换。
不能用做不同的类型之间的转换。它可以把一个不是常属性的转换成常属性的,同时它也可以去掉常属性
通常用于取出const属性,把const类型的指针变为非const类型的指针,
如:

const int *fun(int x,int y){}  
int *ptr=const_cast<int *>(fun(2,3))

该运算符用来修改类型的const或volatile属性。但是需要注意的是,

const_cast <type_id> (expression) 

除了const 或volatile修饰之外, type_id和expression的类型是一样的。
主要作用如下:
1. 常量指针被转化成非常量指针,并且仍然指向原来的对象;
2. 常量引用被转换成非常量引用,并且仍然指向原来的对象;
3. 常量对象被转换成非常量对象。

3.dynamic_cast动态类型转换/向下安全转型(运行时执行)

通常用于基类和派生类之间的转换.。运行时检查该转换是否类型安全。但只在多态类型时合法。

注意:
  1. 不能用于内置的基本数据类型之间的转换.
  2. dynamic_cast转换成功的话返回的是类的指针或引用,失败返回null。相同基类不同子类之间的交叉转换,结果是NULL。
  3. dynamic_cast进行的转换的时候基类中一定要有虚函数,因为只有类中有了虚函数,才说明它希望让基类指针或引用指向其派生类对象的情况,这样才有意义。这是由于运行时类型检查需要运行时类型的信息,而这些信息存储在虚函数表中.
  4. 在类的转换时,类层次间进行转换的时候,dynamic_cast和static_cast进行上行转换的时候效果是一样的;但是在进行下行转换的时候,dynamic_cast会进行类型检查所以它更安全。它可以让指向基类的指针转换为指向其子类的指针或是其兄弟类的指针

4.reinterpret_cast重解释类型转换

reinterpret为重新解释,此标识符的意思即为数据的二进制形式重新解释,但是不改变其值。
它有着和C风格强制类型转换同样的功能:
1. 它可以转化任何的内置数据类型为其它的类型
2. 可以把任何类型的指针转化为其它的类型

它的机理是对二进制数据进行重新的解释,不会改变原来的格式,而static_cast会改变原来的格式。最普通的用途就是在函数指针类型之间进行转换。

扫描二维码关注公众号,回复: 2548615 查看本文章

猜你喜欢

转载自blog.csdn.net/baidu_37964071/article/details/81407424