背景
C语言中强制类型转换可以随意转换我们想要的类型,格式如下(类型)变量名,那么为什么C++还要引入新的4种类型转换呢?
1.新的类型转换控制符可以很好的控制类型转换的过程,允许控制各种类型不同的转换.
2.C++的类型转换控制服能告诉程序员或读者我们这个转换的目的是什么.
static_cast< T * > (content): 静态转换(编译器处理)
它主要用于C++中内置的基本数据类型之间的转换, 但是没有运行时的检测来保证转换的安全性.
- 用于基类和子类之间的指针或引用的转换,这种转换把子类的指针或引用转换为基类表示是安全的.进行下行转换,把基类的指针或引用转换子类表示时,由于没有进行动态类型检测,所以是不安全的;
- 把void 类型的指针转换为目标类型的指针.
- 用于内置的基本的数据类型之间的转换.
- 把任何类型的表达式转换为void类型的
注意:static_cast不会转换掉content的const,volatile.__unaligned属性.
const_cast< T*>(constent):去常转换,编译期执行
- 它主要作用同一个类型之间的去常和天剑常属性之间的转换,不能用做不同的类型之间的转换.
- 它可以把一个不是常属性的转换为常属性,同时它也可以对一个本是常属性的类型进行去常.
dynamic_cast< T*>(content):动态类型转换,也是向下安全转型,运行期执行
通常用于基类和派生类之间的转换,转换时会进行类型安全检查
- 不能用于内置的基本数据类型之间的转换
- dynamic_cast转换成功的话返回的是类的指针或引用,失败返回null.
- dynamic_cast进行的转换的时候基类中一定要有虚函数,因为只有类中有了虚函数,才说明它希望让基类指针或引用指向其派生类对象的情况,这样才有意义.
- 运行时类型检查需要运行时类型的信息,而这些信息存储在虚函数表.
- 在类的转换时,在类层次之间进行转换的时候,dynamic_cast和static_cast进行上行转换时效果是一样的,但是在进行下行转换时,dynamic_cast会进行类型检查所以更安全,它可以让指向基类的指针转换为指向其子类的指针或是兄弟类的指针.
reinterpret_cast< T*>(content)重解释类型转换:
它有着和C风格强制类型转换同样的功能;它可以转化任何的内置数据类型为其他的类型,
同时它也可以把任何类型的指针转化为其他的类型;它的机理是对二进制数据进行重新的
的解释,不会改变原来的格式,而static_cast会改变原来的格式;