c++中有四个与类型转换相关的关键字:static_cast, const_cast, reinterpret_cast, dynamic_cast
static_cast:静态转换,在编译处理期间
主要用于C++中内置的基本数据类型之间的转换,但是没有运行时类型的检测来保证转换的安全性.
(1)用于基类和子类之间的指针或引用的转换:这种转换把子类的指针或引用转换为基类表示是安全的;进行下行转换,把基类的指针或引用转换为子类表示时,由于没有进行动态类型检测,所以是不安全的;
(2)把void类型的指针转换成目标类型的指针(不安全)
(3)不能用于两个不相关的类型转换,
(4)不能把const对象转换成非const对象
const_cast: 去常转换;编译时执行
const_cast操作不能在不同的种类间转换。相反,它仅仅把一个它作用的表达式转换成常量。它可以使一个本来不是const类型的数据转换成const类型的,或者把const属性去掉。
reinterpret_cast:重解释类型转换
它有着和C风格强制类型转换同样的功能;它可以转化任何的内置数据类型为其他的类型, 同时它也可以把任何类型的指针转化为其他的类型;它的机理是对二进制数据进行重新的解释,不会改变原来的格式,而static_cast会改变原来的格式;
dynamic_cast:动态类型转换;也是向下安全转型;是在运行的时候执行
通常用于基类和派生类之间的转换.转换时会进行类型安全检查。
a.不能用于内置的基本数据类型之间的转换.
b.dynamic_cast转换成功的话返回的是类的指针或引用,失败返回null;
c.dynamic_cast进行的转换的时候基类中一定要有虚函数,因为只有类中有了虚函数,
才说明它希望让基类指针或引用指向其派生类对象的情况,这样才有意义.
这是由于运行时类型检查需要运行时类型的信息,而这些信息存储在虚函数表中.
d.在类的转换时,在类层次间进行转换的时候,dynamic_cast和static_cast进行上行转换
的时候效果是一样的;但是在进行下行转换的时候,dynamic_cast会进行类型检查所以
它更安全.它可以让指向基类的指针转换为指向其子类的指针或是其兄弟类的指针;