C++类型转换
static_cast
静态转换类似于C风格显式转换,但是会判断转换类型之间的关系,如果转换类型之间没有任何关系,则不可转换,编译器会报错。(不相关类型之间不可以发生转换).
用法:
static_cast <类型说明符> (变量或表达式)
用途:
1、于基本数据类型之间的转换,如把int转换成char。这种转换的安全也要开发人员来保证
2、把空指针转换成目标类型的空指针
3、把任何类型的表达式转为void类型
4、进行上行转换(把派生类的指针或引用转换成基类表示)是安全的
进行下行转换(把基类的指针或引用转换为派生类表示),由于没有动态类型检查,所以是不安全的
使用场景:
主要执行非多态的转换操作,用于代替C中通常的转换操作
隐式转换都建议使用static_cast进行标明和替换
dynamic_cast
动态转换有两个约束条件:其一是要求new_type为指针或引用,其二是下行转换时要求基类是多态的(基类中包含至少一个虚函数,否则编译不通过)。
动态转换支持上行转换和下行转换,但是对于不安全的下行转换,会返回NULL,提高安全性。
其他三种都是编译时完成的,dynamic_cast是运行时处理的,运行时要进行类型检查。
用法
dynamic_cast<type-id> expression
使用场景:
只有在派生类之间转换时才使用dynamic_cast,type-id必须是类指针,类引用或者void*。
dynamic_cast要求src必须是多态的,因为dynamic_cast需要从类的虚函数表表中获得类类型信息。
dynamic_cast最常见的用法是从一个抽象基类转换到具体的实现类。
当一个父类有多种子类时,如果目前有一个指向父类的指针,但是我们不知道指向父类的指针实际上指向的是哪一种子类,可以使用dynamic_cast<Child *>来判断,如果返回不是NULL,说明这是一个指向Child子类的指针,否则就不是。
const_cast转换
特点
进行常量转换
场景
特定的场景是:类通过const提供重载时,一般都是非常量函数调用const_cast<const T>将参数转换为常量,然后调用常量函数,然后得到结果再调用const_cast <T>去除常量性。
reinterpret_cast转换
用法:
reinterpret_cast<type-id>expression
使用场景:
不到万不得已,不用使用这个转换符,高危操作
使用特点:
a、reinterpret_cast是从底层对数据进行重新解释,依赖具体的平台,可移植性差
b、reinterpret_cast可以将整型转换为指针,也可以把指针转换为数组
c、reinterpret_cast可以在指针和引用里进行肆无忌惮的转换