首页 > 其他分享 > const_cast,static_cast,dynamic_cast,reinterpret_cast的区别(转)

const_cast,static_cast,dynamic_cast,reinterpret_cast的区别(转)

时间:2023-05-04 23:44:55浏览次数:33  
标签:转换 reinterpret 子类 dynamic cast static const 指针

原文:https://www.cnblogs.com/fancy-xt/p/5339177.html

C++继承了C中的隐式和显式转换的方式。但这种转换并不是安全和严格的,

加上C++本身对象模型的复杂性,C++增加了四个显示转换的关键字。(C++是强类型语言)

经过编码测试,小结如下:

const_cast:仅用于去掉完全同类型的const,volatile约束,不能含有任何其它类型的转换,若不含约束也可以相当于没转换
static_cast:使用类型可在继承的方向上向上或向下转换,不进行安全检查。
      子类转父类,值、引用、指针形式均可,其中指针还可以是常量
      父类转子类,值不可以,引用和指针均可,子类中的多余成员值是乱码
      不支持不同无关类之间的转换
dynamic_cast:动态转换,使用类型可在继承的方向上向上或向下转换,进行安全检查。
      子类转父类,值不可以,引用、指针均可,其中指针还可以是常量
      父类转子类,值不可以,引用可通过编译,但运行失败。指针可通过编译,该转换也能运行,但是后面再调用方法时会检查类型,判断是否失败。
      不同无关类之间的转换均不能运行,但多态类可通过编译
reinterpret_cast:强制类型转换,不改变原有数据,只是重新解释内存
      子类转父类,值不可以,引用、指针形式均可,其中指针还可以是常量
      父类转子类,值不可以,引用和指针均可,子类中的多余成员值是乱码
      不同无关类之间的转换,值不可以,引用和指针均可,重新解释内存

可以这样记忆:

1. 严格性: dynamic_cast > static_cast   父类转子类 > 子类转父类

2. 只有严格性最低的情况(即使用static_cast将子类转父类)允许值转换,其他情况都不可以进行值转换

3. 指针、引用的转换:

  • 子类转父类的情况:

          直接转,没有任何问题   (无论 dynamic_cast,static_cast都可)

  • 父类转子类的情况:

          可以转,可以通过编译,可以运行成功,但访问子类部分是乱码  (static_cast)

          可以转,可以通过编译,但是运行会失败  (dynamic_cast)

 

注意对能成功进行的含virtual方法的类,通过引用转换和指针转换后对virtual方法的调用不同:

      假设转换前为pref_class转换后为post_class,则通过引用转化调virtual方法实际是调用post_class中对应方法的;通过指针转换调post_class中virtual指针相对存放位置对应pref_class相对位置的指针对应的方法(若该位置指向不是方法,运行失败),形参不一致会自动补全(一般是乱码)或删减

标签:转换,reinterpret,子类,dynamic,cast,static,const,指针
From: https://www.cnblogs.com/tan-wm/p/17372898.html

相关文章

  • [ABC276Ex] Construct a Matrix
    没有题解,所以来写一篇。Description构造一个\(N\timesN\)的矩阵\(A\),其中\(A_{i,j}\in{0,1,2}\),要求同时满足\(Q\)条限制。每条限制形如:给定\(a,b,c,d,e\),要求\(A\)满足\(\prod\limits_{i=a}^b\prod\limits_{j=c}^dA_{i,j}\equive\pmod3\)。Solution为贴合原......
  • 结构体内嵌比较函数bool operator < (const node &x) const {}
    structnode{intl,r;booloperator<(constnode&a)const{returnr<a.r;}}a[maxn];使用sort时,如果这么定义节点,说明节点要按照从小到大排序(sort中默认从小到大排序);但是同样的代码,如果使用优先队列,这么写就说明节点要按照从大到小排序(优先队列默......
  • 牛客 55994 2023牛客五一集训派对day3 D Points Construction Problem
    D-PointsConstructionProblem_2023牛客五一集训派对day3(nowcoder.com)将图上恰好\(n\)个点染成黑色,使得图上相邻的黑白点对数量恰好为\(m\)考虑\(n\)个黑点如果不相邻,则两个点的贡献互不影响考虑相邻的情况,我们把相邻的点连边,则贡献为每一个连通块的贡献的和,我们用......
  • let var const 的区别
    首先要明确变量的初始化就是给变量赋一个初值前言:1.let和const是es6新出来的语法2.由此可见,let和var声明的变量值可以修改,而const不可以修改3.由此可见,const声明的常量必须初始化,否则会报错(翻译过来就是:常量声明中缺少初始值设定项)。如果你要声明一个常量,必须要赋初......
  • c语言报错 [Error] invalid initialization of non-const reference of type 'LinkQue
     进行地址传递是出现报错临时值不能作为非常量引用参数进行传递所以需要在main函数中·重新定义指针传递 ......
  • open3d Reconstruction system 问题解决
    1.https://github.com/luckyluckydadada/Azure-Kinect-DK-3D-reconstruction 2.open3d版本:0.14.10.16.00.17.0会报错:open3d.cuda.pybind.piplines.odommetry.OdomtryOptionbojecthasnoattribute'max_depth_diff' 3.结果问题一:    根据......
  • 我刚才用了dynamic_cast 你给我普及一下C++ 中这几种类型转换吧
    我刚才用了dynamic_cast你给我普及一下C++中这几种类型转换吧在C++中,有几种类型转换的方式,包括:隐式转换在一些情况下,编译器会自动进行类型转换。比如将整型变量赋值给浮点型变量,编译器就会自动将整型变量转换为浮点型变量。但是在大多数情况下,使用隐式转换可能会引起一些问......
  • FourCastNet
    先写自适应傅里叶神经算子(AFNO)AFNO这篇文章的标题和摘要前几句定调了一个基调,就是说AFNO这个东西提出来,是为了替换transformer里面的多头自注意力,作为一个更高效的tokenmixer出现摘要:1.AFNO是基于运算符学习的原则性基础,它使我们能够将令牌混合作为一个连续的全局卷积,而不依......
  • C++中关于默认构造函数(Default Constructor)
    读<<深度探索C++对象模型>>,第二章介绍了默认构造函数,自觉知识点虽基础但是很是被忽略,故作此文记录.关于基础概念不做介绍,先看代码#include<stdio.h>#include<string>classSample{public:intintVal;};classFoo{public:Foo(inta=1000):int......
  • const和constexpr
    inta=10;constint&b=a;a=20;std::cout<<b<<std::endl;//输出为20,表示虽然b用const修饰不能直接修改b但是可以通过修改b的引用a来修改binta1=10;constexprint&b1=a1;//这样写会提示错误c++11使用的constexpr更加强调常量,而之......