我们知道,C++是一种弱类型的语言,这意味这C++不是类型安全的,一个变量可以赋不同数据类型的值,在赋值过程中可能会发生隐式类型转换
关于静态/动态/强类型/弱类型语言,可以参考下图
在C语言中,我们常常会用到诸如int(a),double(c+d)之类的操作去做显式的强制类型转换,而在C++中,加入了四种新的强制类型转换的用法,以适应更多的应用场景
– const_cast
从字面意思上就可以理解,cosnt_cast的用法比较简单,一般搭配指针或者引用,用来去除变量的const属性
- static_cast
静态转换相当于c中的强制转换,无条件转换,静态类型转换。主要用途如下:- 基类与子类间的转换:子类指针转成基类指针是安全的,基类指针转成子类指针是不安全的,因此一般使用dynamic_cast
- 基本类型间的转换,如int,char,double等。静态转换不能用于无关类型指针的转换,如int->double 是错误的
- 把空指针转换成目标类型的空指针
- 把任何类型的表达式转换成void类型
- dynamic_cast
有条件转换,动态类型转换,运行时会进行类型安全检查(失败时返回空指针)。它是继承类间安全的指针转换方法。不允许进行静态类型转换,即参与转换的必须是指针或者引用。- 子类指针转成基类指针是安全的
- 基类指针转成子类指针是不安全的,因为此时调用子类独有的数据时可能发生数据越界,因此返回nullptr
- 同基类下的不同子类间的指针转换也是不安全的,因此返回nullptr
- reinterpret_cast
这种转换仅仅重新解释类型,没有进行二进制的转换- 转换的类型必须是指针,引用,算数类型,函数指针或者成员指针
- 在比特位上的转换,可以把指针转成整数,再把整数重新转成指针
- 最普遍的用途在于函数指针间的转换
- 难以保证移植性