简介: **c++**类型转换static_castdynamic_castconst_castreinterpret_cast这四种类型转换的区别

[TOC]


本文初发于 “偕臧的小站“,同步转载于此。


思维导图:


static_cast:

  • 静态类型转换:内置、自定义数据类型

    //++++++++++++++++++++++++
    //内置数据类型
    char a  = 'a';
    double d = static_cast<double>(a)
    
    //++++++++++++++++++++++++
    //自定义类型
    Base* base = NULL;
    Son* son = NULL;
    
    //向下类型转换  不安全
    Son* son = static_cast<Son*>(base);
    
    //向上类型转换   安全
    Base* base = static_cast<Base*>(son);

static_cast:

  • 动态类型转换:内置、自定义数据类型

    //++++++++++++++++++++++++
    //内置数据类型, 不可以转换
    有精度损失的,都不可以转换
    char c  = 'c';
    double d = dynamic_cast<double>(c)
    
    //++++++++++++++++++++++++
    //自定义类型
    Base* base = NULL;
    Son* son = NULL;
    
    //向下类型转换  不安全   失败
    Son* son = dynamic_cast<Son*>(base);
    
    //向上类型转换   安全   成功
    Base* base = dynamic_cast<Base*>(son);
    

const_cast:

  • 常量转换:指针之间的转换

    const int* p = NULL;
    
    //将const int * 转换为 int*
    int* p2 = const_cast<int*>(p);    
    
    //将 p2 转换为const int*
    const int* p2 = const_cast<const int*>(p);    

  • 常量转换:引用之间的转换

    const int a = 10;
    const int& aRef = a;
    
    int& aRef2 = const_cast<int&>(aRef);
    
    //不可以对 非指针 或者 非引用 做const_cast转换

reinterpret_cast:

  • 重新解释转换 最不安全 不建议使用

    //将base* 转换为 Other*
    Base* base = NULL;
    Other* other = reinterpret_cast<Other*>(base);