一、概述

  • 类型转换(cast)是将一种数据类型转换成另一种数据类型。例如,如果将一个整型值赋给一个浮点类型的变量,编译器会暗地里将其转换成浮点类型(即 隐式转换 )。转换是非常有用的,但是它也会带来一些问题,比如在转换指针时,我们很可能将其转换成一个比它更大的类型,但这可能会破坏其他的数据。应该小心类型转换,因为转换也就相当于对编译器说:忘记类型检查,把它看做其它的类型。一般情况下,尽量少的去使用类型转换,除非用来解决非常特殊的问题。
  • 无论什么原因,任何一个程序如果使用很多类型转换都值得怀疑。
  • 标准 C++ 提供了一个 显式转换 的语法,来替代旧的 C语言 风格的类型转换。使用 C语言 风格的 强制类型转换 可以把想要的任何东西转换成我们需要的类型。那为什么还需要一个新的 C++ 类型的强制转换呢?新类型的强制转换可以提供更好的控制强制转换过程,允许控制各种不同种类的强制转换。C++ 风格的强制转换其它的好处是,它们能更清晰的表明它们要干什么。程序员只要扫一眼这样的代码,就能立即知道其强制转换的目的。
  • 这种 显示转换 的语法有四种,它们分别是:static_cast,dynamic_cast,const_cast和reinterpret_cast。

1、静态转换(static_cast)

  • 用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。
  • 用于 上行转换1,是安全的。
  • 用于 下行转换2,由于没有动态类型检查,所以是不安全的。
  • 用于基本数据类型之间的转换,如把 int 转换成 char,把 char 转换成 int。这种转换的安全性需要开发人员来保证。

2、动态转换(dynamic_cast)

  • dynamic_cast 主要用于类层次间的 上行转换1下行转换2
  • 在类层次间进行 上行转换1 时,dynamic_cast 和 static_cast 的效果是一样的。
  • 在进行 下行转换2 时,dynamic_cast 具有类型检查的功能,比 static_cast 更安全。

3、常量转换(const_cast)

  • 该运算符用来修改类型的 const 属性。
  • 常量指针被转化成非常量指针,并且仍然指向原来的对象;
  • 常量引用被转换成非常量引用,并且仍然指向原来的对象;
  • 注意:不能直接对非指针和非引用的变量使用 const_cast 操作符去直接移除它的 const。

4、重新解释转换(reinterpret_cast)

  • 这是最不安全的一种转换机制,最有可能出现问题。
  • 主要用于将一种数据类型从一种类型转换为另一种类型。它可以将一个指针转换成一个整数,也可以将一个整数转换成一个指针。

二、我自己对四种转换的总结整理

  • C语言强制类型转换,支持任意类型之间的转换,虽然用起来非常方便,但这种操作是极其不安全的。

  • 上行转换1下行转换2 图解及其安全性参见下图:

  • 下例子中用到的类的声明和定义如下:

    class Animal{ cout<<"I'm a Animal."; };                //动物类
    class Cat : public Animal{ cout<<"I'm a Cat."; };  //猫
    class Apple{ cout<<"I'm a Apple"; };               //苹果
    
  • 注:下面所有示例代码中的注释,OK 表示这行代码可以正常编译通过,Error 表示报错/编译不通过

1、static_cast

  1. 主要用于父类和子类之间指针或引用的转换。

  2. 支持基本类型之间的转换。

    //static_cast 作用于基本数据类型
    char ch='c';
    double d1=(double)ch;                              //C语言强制类型转换,OK
    double d2=static_cast<double>(ch);                   //静态转换,OK
    
  3. 支持 上行转换1 ,是安全的。

    //static_cast 作用于自定义类型(结构体、类)
    //作用于有关系的类(父类和子类)之间
    //1.上行转换(安全)
    Animal *animal=static_cast<Animal *>(new Cat);       //静态转换,OK
    
  4. 支持 下行转换2 ,是不安全的。

    //static_cast 作用于自定义类型(结构体、类)
    //作用于有关系的类(父类和子类)之间
    //2.下行转换(不安全,容易访问越界)
    Cat *cat=static_cast<Cat *>(new Animal);         //静态转换,OK
    
  5. 不支持没有关系的类之间的指针或引用的转换,保证了安全性。

    Animal *animal_1=(Animal *)(new Apple);              //C语言强制类型转换,OK(不安全)
    Animal *animal_2=static_cast<Animal *>(new Apple);   //静态转换,Error
    

2、dynamic_cast

  1. 主要用于父类和子类之间指针或引用的转换。

  2. 不支持基本类型之间的转换。

    char ch = 'c';
    double d1 = (double)ch;                                //C语言强制类型转换,OK
    double d2 = dynamic_cast<double>(ch);                //动态转换,Error
    
  3. 支持 上行转换1 ,是安全的。

    Animal *animal=dynamic_cast<Animal *>(new Cat);     //动态转换,OK
    
  4. 不支持 下行转换2 ,相比 static_cast 保证了安全性。

    Cat *cat=dynamic_cast<Cat *>(new Animal);         //动态转换,Error
    
  5. 不支持没有关系的类之间的指针或引用的转换,保证了安全性。

    Animal *animal=dynamic_cast<Animal *>(new Apple);  //动态转换,Error
    

3、const_cast

  1. 用于修改类型的const属性。

    int *p=nullptr;
    const int *p1=(const int *)p;                      //C语言强制类型转换,OK
    const int *p2=const_cast<const int *>(p);            //常量转换,OK
    
  2. 常量指针转非常量指针,仍指向原来的对象。

    const int *p=nullptr;
    int *p1=p;                                         //直接转换(隐式转换),Error
    int *p2=(int *)p;                                  //C语言强制类型转换,OK
    int *p3=const_cast<int *>(p);                        //常量转换,OK
    
  3. 常量引用转非常量引用,仍指向原来的对象。

    int num=10086;
    //常量引用转普通引用(非常量引用)
    const int &ob=num;
    int &ob2=ob;                                       //直接转换(隐式转换),Error
    int &ob3=(int &)ob;                                    //C语言强制类型转换,OK
    int &ob4=const_cast<int &>(ob);                      //常量转换,OK
    
  4. 不能对非指针或非引用的变量用const_cast移除它的const属性。

    const int a=10086;
    int b=a;                                           //直接转换(隐式转换),OK
    int b1=(int)a;                                     //C语言强制类型转换,OK
    int b2=const_cast<int>(a);                           //常量转换,Error
    

4、reinterpret_cast

  1. 是最不安全的的一种类型转换方式,顾名思义,就是将一种类型转换为另一种类型,比如int转为int*,int*转为int(类似于C语言强制类型转换,但不完全相同)。

  2. 不支持基本类型间的转换。

    char ch='c';
    double d1=(double)ch;                              //C语言强制类型转换,OK
    double d2=reinterpret_cast<double>(ch);              //重新解释转换,Error
    
  3. 支持不相关类型间的转换,不安全。

    Animal *p=reinterpret_cast<Animal *>(new Apple);   //重新解释转换,OK
    
  4. 支持 上行转换1 ,安全。

    Animal *p=reinterpret_cast<Animal *>(new Cat);        //重新解释转换,OK
    
  5. 支持 下行转换2 ,不安全。

    Cat *cat=reinterpret_cast<Cat *>(new Animal);        //重新解释转换,OK
    

三、脚注与版权声明

以上部分内容引用自千峰梁何大佬的课件,仅供参考学习,侵删。

参考链接:6.00 static cast静态转换_bilibili。

如有错误或者遗漏的地方欢迎各位大佬补充指正!

创建日期:2022年08月20日 AM.


  1. 上行转换:把派生类的指针或引用转换成基类表示,换句话说就是把基类(父类)指针指向派生类(子类)空间(一般来说,子类是基于父类进行了扩展,所以可以理解为小指针指向大空间,是安全的)。 ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  2. 下行转换:把基类的指针或引用转换成派生类表示,换句话说就是把派生类(子类)指针指向基类(父类)空间(一般来说,子类是基于父类进行了扩展,所以可以理解为大指针指向小空间,这样可能会访问越界,所以是不安全的)。 ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

C++类型转换(static_cast,dynamic_cast,const_cast和reinterpret_cast)相关推荐

  1. c++类型转换:static_cast, dynamic_cast,const_cast和reinterpret_cast

    static_cast 用法:static_cast < type-id > ( expression ) 说明:该运算符把expression转换为type-id类型,但没有运行时类型检 ...

  2. C/C++中的数据类型转换()/static_cast/dynamic_cast/const_cast/reinterpret_cast

    文章目录 前言 数据类型自动转换 C语言中的强制类型转换 C++中的强制类型转换 static_cast dynamic_cast const_cast reinterpret_cast 强转关键字的 ...

  3. 显式强制类型转换static_cast, dynamic_cast, const_cast, reinterpret_cast

    显式强制类型转换(cast)包括以下操作符: static_cast,  dynamic_cast, const_cast, reinterpret_cast,对各种显式类型转换解释: static_ ...

  4. 类型转换static_cast,dynamic_cast,const_cast,reinterpret_cast等

    一.隐式类型转换 系统自动进行,不需要程序开发人员介入. int m = 3 +45.6; //把小数部分截掉,也属于隐式类型转换的一种行为. doublen = 3 +45.6; 二.显示类型转换( ...

  5. c++中的四种cast转换, dynamic_cast、static_cast、const_cast、reinterpret_cast

    C++11之后,C++中就有四种类型转换,分别是 dynamic_cast.static_cast.const_cast.reinterpret_cast,一般用这四种强制转换可以替代在c代码中类似( ...

  6. C++中static_cast, dynamic_cast, const_cast用法/使用情况及区别解析

    目录 第1部分. 隐式类型转换 第2部分. 显式类型转换 static_cast dynamic_cast reinpreter_cast const_cast 首先回顾一下C++类型转换: C++类 ...

  7. static_cast, dynamic_cast, const_cast,reinterpret_cast探讨

    http://www.cnblogs.com/chio/archive/2007/07/18/822389.html 首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1 ...

  8. static_cast, dynamic_cast, const_cast

    首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 又称为"标准转换",包括以下几种情况: 1) 算术转换(Arithmetic ...

  9. static_cast, dynamic_cast, const_cast学习和探讨

    一 C语言中存在着两种类型转换: 隐式转换和显式转换 隐式转换:不同数据类型之间赋值和运算,函数调用传递参数--编译器完成 1) 算术转换(Arithmetic conversion) : 在混合类型 ...

最新文章

  1. golang函数——可以为类型(包括内置数据类型)定义函数,类似类方法,同时支持多返回值...
  2. MATLAB 使用CNN拟合回归模型预测手写数字的旋转角度(卷积神经网络)
  3. Python如何存储数据到json文件
  4. 织梦图集php,织梦图集在首页、列表页、内容页调用图集所有图片及注释的方法...
  5. Ajax知识笔记——入门,同步和异步,XHR
  6. js去el的map_JS中也可以使用JSTL和EL标签
  7. 简单又有效!神奇的轻量级通用上采样算子CARAFE
  8. 一个简单限速器的java实现[2]
  9. 今天为你分享互联网营销的两个核心思维
  10. 构建一个简单的Keras +深度学习REST API
  11. 51Nod - 1086 (多重背包+2进制优化)
  12. KendoUI和wijmoUI 它们的Grid比较 20120423
  13. HttpUtil请求工具类
  14. 2019年2月CNNIC第43次《中国互联网络发展状况统计报告》
  15. 独立显卡与集成显卡的区别
  16. python爬取豆瓣电影名称、评分
  17. flex布局实现头尾固定,中间内容自适应
  18. 【maven】Maven异常:Could not find artifact
  19. NiFi分享第一期-安全认证(证书认证)
  20. Active Form显示标题栏及页面跳转

热门文章

  1. SDN Experiment3
  2. 财务Financial Affairs
  3. 11月25日沪深两市主力单日增减仓个股排名
  4. 用JAVA来制作大鱼吃小鱼游戏,JAVA项目实战
  5. 如何把win10的计算机调至桌面,win10如何显示我的电脑在桌面?小编教你显示的方法...
  6. 人工智能的“黑镜”——计算机人脸识别!
  7. 产品经理必看电影:《黑镜》(Black Mirror)
  8. 【数学建模】建立露天矿优化模型解决问题
  9. VMware端口组是什么?
  10. 让办公管理如影随形的移动OA系统