美文网首页
C++类型转换

C++类型转换

作者: 宋大壮 | 来源:发表于2019-03-10 09:27 被阅读0次

    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可以在指针和引用里进行肆无忌惮的转换

    相关文章

      网友评论

          本文标题:C++类型转换

          本文链接:https://www.haomeiwen.com/subject/ottupqtx.html