C++中的四种强制类型转换

C语言支持类型强制转换,C++为什么要引入其他类型转换

C风格的转换格式很简单,但是有不少缺点的:

  1. 转换太过随意,可以在任意类型之间转换。你可以把一个指向const对象的指针转换成指向非const对象的指针,把一个指向基类对象的指针转换成一个派生类对象的指针,这些转换之间的差距是非常巨大的,但是传统的C语言风格的类型转换没有区分这些。
  2. C风格的转换没有统一的关键字和标示符。对于大型系统,做代码排查时容易遗漏和忽略。

C++风格完美的解决了上面两个问题。

  1. 对类型转换做了细分,提供了四种不同类型转换,以支持不同需求的转换;
  2. 类型转换有了统一的标示符,利于代码排查和检视。下面分别来介绍这四种转换:static_cast、dynamic_cast、const_cast和reinterpre_cast.

1、static_cast

使用方法:

static_cast<type-id> expression

作用:

  • 用于类层次结构中基类和派生类之间指针或引用的转换

派生类---->基类:安全。
基类---->派生类:由于没有动态类型检查,所以是不安全的。

  • 用于基本数据类型之间的转换,如把int转换为char,这种带来安全性问题由程序员来保证
  • 把空指针转换成目标类型的空指针
  • 把任何类型的表达式转为void类型

使用特点:
a、主要执行非多态的转换操作,用于代替C中通常的转换操作
b、隐式转换都建议使用static_cast进行标明和替换

2、dynamic_cast转换

使用方法:

dynamic_cast<type-id> expression
作用:

只有在派生类之间转换时才使用dynamic_cast,type-id必须是类指针,类引用或者void*
使用特点:
a、基类必须要有虚函数,因为dynamic_cast是运行时类型检查,需要运行时类型信息,而这个信息是存储在类的虚函数表中,只有一个类定义了虚函数,才会有虚函数表。
b、对于基类--->派生类的转换,dynamic_cast是安全的(当类型不一致时,转换过来的是空指针),而static_cast是不安全的(当类型不一致时,转换过来的是错误意义的指针,可能造成踩内存,非法访问等各种问题)
c、dynamic_cast还可以进行交叉转换

示例:

父类:A

子类:B

A* a = new A();

B* b = new B();

b = dynamic_cast<B*>(a);//a中的RTTI是A*,将其转换为B*,类型不一致,因此将a转换成NULL指针

假如改为:A* a = new B();

B = dynamic_cast<B*>(a);//a中的RTTI是B*,将其转换为B*,类型一致,转换成功

3、const_cast

使用方法:

const_cast<type-id>expression
作用:

  • 常量指针转换为非常量指针,并且仍然指向原来的对象
  • 常量引用被转换为非常量引用,并且仍然指向原来的对象

使用特点: 

  1.  cosnt_cast是四种类型转换符中唯一可以对常量进行操作的转换符
  2. 去除常量性是一个危险的动作,尽量避免使用。一个特定的场景是:类通过const提供重载时,一般都是非常量函数调用const_cast<const T>将参数转换为常量,然后调用常量函数,然后得到结果再调用const_cast <T>去除常量性。

4、reinterpret_cast

使用方法:

reinterpret_cast<type-id>expression

作用:

       用来处理无关类型转换的,通常为操作数的位模式提供较低层次的重新解释!但是他仅仅是重新解释了给出的对象的比特模型,并没有进行二进制的转换!

      用在任意的指针之间的转换,引用之间的转换,指针和足够大的int型之间的转换,整数到指针的转换。 

使用特点:

        reinterpret_cast是为了映射到一个完全不同类型的意思,这个关键词在我们需要把类型映射回原有类型时用到它。我们映射到的类型仅仅是为了故弄玄虚和其他目的,这是所有映射中最危险的。(这句话是C++编程思想中的原话)  

  • reinterpret_cast是从底层对数据进行重新解释,依赖具体的平台,可移植性差 
  • reinterpret_cast可以将整型转换为指针,也可以把指针转换为数组
  • reinterpret_cast可以在指针和引用里进行肆无忌惮的转换

 

 

 

猜你喜欢

转载自blog.csdn.net/qq_41727218/article/details/86438663
今日推荐