一、用法
static_cast <new_type> (expression)
dynamic_cast <new_type> (expression)
reinterpret_cast <new_type>(expression)
const_cast <new_type> (expression)
二、解释
const_cast
(1) const 值并未真正改变(使用const_casr 去除const限定的目的绝对不是为了修改它的内容)。
(2) 用于将一个const参数传入一个不会对这个参数做修改的函数。
reinterpret_cast
1) 可用于任意指针(或引用)类型之间的转换,以及指针与足够大的整数(取决于操作系统的参数,如果是32位的操作系统,需要int以上的。如果是64位的系统,需要long以上的,具体可通过sizeof运算符来看)类型之间的转换;从整数类型(包括枚举类型)到指针类型,无视大小。
2) 使用价值:用于辅助哈希函数。
3) 不能像const_cast那样去除const修饰符。
4) 从指针类型到一个足够大的整数类型
5) 从整数类型或者枚举类型到指针类型
6) 从一个指向函数的指针到另一个不同类型的指向函数的指针
7) 从一个指向对象的指针到另一个不同类型的指向对象的指针
8) 从一个指向类函数成员的指针到另一个指向不同类型的函数成员的指针
9) 从一个指向类数据成员的指针到另一个指向不同类型的数据成员的指针
不过我在Xcode中测试了一下,事实上reinterpret_cast的使用并不局限在上边所说的几项的,任何类型的指针之间都可以互相转换,都不会得到编译错误。上述列出的几项,可能是Linux下reinterpret_cast使用的限制,也可能是IBM推荐我们使用reinterpret_cast的方式
所以总结来说:reinterpret_cast用在任意指针(或引用)类型之间的转换;以及指针与足够大的整数类型之间的转换;从整数类型(包括枚举类型)到指针类型,无视大小。
(所谓"足够大的整数类型",取决于操作系统的参数,如果是32位的操作系统,就需要整形(int)以上的;如果是64位的操作系统,则至少需要长整形(long)。具体大小可以通过sizeof运算符来查看)。
static_cast
static_cast <new_type> (expression)
(1) 不能像const_cast那样去除const修饰符。
(2) 指针和引用转换—>从子类到基类。
(3) 基础类型和对象的转换。
dynamic_cast
(1) 只接受基于类对象的指针和引用的类转换。
对于从子类到基类的指针转换,static_cast和dynamic_cast都是成功并且正确的(所谓成功是说转换没有编译错误或者运行异常;所谓正确是指方法的调用和数据的访问输出是期望的结果),这是面向对象多态性的完美体现。
而从基类到子类的转换,static_cast和dynamic_cast都是成功的,但是正确性方面,我对两者的结果都先进行了是否非空的判别:dynamic_cast的结果显示是空指针,而static_cast则是非空指针。但很显然,static_cast的结果应该算是错误的,子类指针实际所指的是基类的对象,而基类对象并不具有子类的Study()方法(除非妈妈又想去接受个"继续教育")。
对于没有关系的两个类之间的转换,输出结果表明,dynamic_cast依然是返回一个空指针以表示转换是不成立的;static_cast直接在编译期就拒绝了这种转换。
NOTE
static_cast和reinterpret_cast运算符要么直接被编译器拒绝进行转换,要么就一定会得到相应的目标类型的值。而dynamic_cast却会进行判别,确定源指针所指定的内容是否真的适合被目标指针接受。如果是否定的,那么dynamic_cast返回NULL。