1)C风格的转型动作
2)函数风格的。。。
新式转型:
1)const_cast
唯一一个可以将const转为non-const的转换。
const_cast只用于类型转换掉表达式的const或volatileness属性。
到目前为止,const_cast最普通的用途就是转换掉对象的const属性
对一个const对象采用此方式,其实行为不确定。
用于修饰某个非const常量,但此变量不经常使用,可以使用const修饰,用的时候再去除const属性;
2)dynamic_cast (只用于有继承关系的情况)
唯一无法由旧式语法执行的动作;
可能消耗重大运行成本的转型动作。效率低下!!!
可以用"virtual函数多态"等方式替代强制转换。
只能对指针或引用做强制类型转换,对类无法做此动作;
你能用dynamic_cast把“指向基类的指针或引用”转换成“指向其派生类或其兄弟类的指针或引用”,而且你能知道转换是否成功。失败的转换将返回空指针(当对指针进行类型转换时)或者抛出异常bad_cast(当对引用进行类型转换时)
dynamic_casts在帮助你浏览继承层次上是有限制的。它不能被用于缺乏虚函数的类型上-------如果基类没有虚函数,对基类指针或基类引用使用dynamic_cast会编译失败。
3)reinterpret_cast
使用这个操作符的类型转换,其的转换结果几乎都是执行期定义(implementation-defined)。因此,使用reinterpret_casts的代码很难移植。
reinterpret_casts的最普通的用途就是在函数指针类型之间进行转换。
低级转型,实际动作可能取决于编译器,不可移植。
转换函数指针的代码是不可移植的(C++不保证所有的函数指针都被用一样的方法表示),在一些情况下这样的转换会产生不正确的结果(参见条款M31),所以你应该避免转换函数指针类型,除非你处于着背水一战和尖刀架喉的危急时刻。一把锋利的刀。一把非常锋利的刀。
4)static_cast
强迫隐式转换
你不能用static_cast象用C风格的类型转换一样把struct转换成int类型或者把double类型转换成指针类型
只有可以隐式转换时才成功,否则失败;(如两个不相干的类之间就会失败)
①用于类层次结构中基类和子类之间指针或引用的转换。
进行上行转换(把子类的指针或引用转换成基类表示)是安全的;------------如果有多个基类,不同类型则得到不同的结果。
进行下行转换(把基类指针或引用转换成子类表示)时,由于没有动态类型检查,所以是不安全的。
②用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。
③把空指针转换成目标类型的空指针。
④把任何类型的表达式转换成void类型。
注意:static_cast不能转换掉expression的const、volitale、或者__unaligned属性。
强制转换可能会创建一个临时变量:
如static_cast <Window> (* this).onResize(); 这时,实际static_cast <Window> (* this)操作创建了一个Window类型的临时副本,对这个副本执行onResize函数; 如果想在this对象上执行onResize动作,直接使用 Window::onResize();
如果不想产生临时变量,则使用static_cast <Window &>方式来强制转换!