[CPP]C++四种强制类型转换

我们知道,C++是一种弱类型的语言,这意味这C++不是类型安全的,一个变量可以赋不同数据类型的值,在赋值过程中可能会发生隐式类型转换
关于静态/动态/强类型/弱类型语言,可以参考下图
blob.jpg

在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
    这种转换仅仅重新解释类型,没有进行二进制的转换

    • 转换的类型必须是指针,引用,算数类型,函数指针或者成员指针
    • 在比特位上的转换,可以把指针转成整数,再把整数重新转成指针
    • 最普遍的用途在于函数指针间的转换
    • 难以保证移植性

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注