广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++中的四种类型转换符是什么
  • 222
分享到

C++中的四种类型转换符是什么

2023-07-02 18:07:40 222人浏览 薄情痞子
摘要

本篇内容介绍了“c++中的四种类型转换符是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一:背景在玩 C 的时候,经常会用 v

本篇内容介绍了“c++中的四种类型转换符是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

一:背景

在玩 C 的时候,经常会用 void* 来指向一段内存地址开端,然后再将其强转成尺度更小的 char* 或 int* 来丈量一段内存,参考如下代码:

int main(){void* ptr = malloc(sizeof(int) * 10);int* int_ptr = (int*)ptr;char* char_ptr = (char*)ptr;}

由于 C 的自由度比较大,想怎么玩就怎么玩,带来的弊端就是容易隐藏着一些不易发现的bug,归根到底还是程序员的功底不扎实,C++ 设计者觉得不能把程序员想的太厉害,应该要力所能及的帮助程序员避掉一些不必要的潜在 bug,并且还要尽最大努力的避免对性能有过多的伤害,所以就出现了 4 个强制类型转换运算符。

  • const_cast

  • reinterpret_cast

  • dynamic_cast

  • static_cast

既然 C++ 做了归类,必然就有其各自用途,接下来我们逐一和大家聊一下。

二:理解四大运算符

1. const_cast

这是四个运算符中最好理解的,玩过 C++ 的都知道,默认情况下是不能修改一个 const 变量,比如下面这样:

int main(){const int i = 10;i = 12;}

这段代码肯定是要报错的,那如果我一定要实现这个功能,如何做呢?这就需要用到 const_cast 去掉它的常量符号,然后对 i 进行操作即可,所以修改代码如下:

int main(){const int i = 10;auto j = const_cast<int*>(&i);*(j) = 12;}

C++中的四种类型转换符是什么

2. reinterpret_cast

从名字上看就是一个 重新解释转换,很显然这个非常底层,如果大家玩过 windbg ,应该知道用 dt 命令可以将指定的内存地址按照某一个结构体丈量出来,比如说 C# 的 CLR 在触发 GC 时,会有 gc_mechanisms 结构,参考代码如下:

0:000> dt WKS::gc_mechanisms 0x7ffb6ba96e60coreclr!WKS::gc_mechanisms   +0x000 gc_index         : 1   +0x008 condemned_generation : 0n0   +0x00c promotion        : 0n0   +0x010 compaction       : 0n1   +0x014 loh_compaction   : 0n0   +0x018 heap_expansion   : 0n0   +0x01c concurrent       : 0   +0x020 demotion         : 0n0   +0x024 card_bundles     : 0n1   +0x028 gen0_reduction_count : 0n0   +0x02c should_lock_elevation : 0n0   +0x030 elevation_locked_count : 0n0   +0x034 elevation_reduced : 0n0   +0x038 minimal_gc       : 0n0   +0x03c reason           : 0 ( reason_alloc_soh )   +0x040 pause_mode       : 1 ( pause_interactive )   +0x044 found_finalizers : 0n0   +0x048 background_p     : 0n0   +0x04c b_state          : 0 ( bgc_not_in_process )   +0x050 allocations_allowed : 0n1   +0x054 stress_induced   : 0n0   +0x058 entry_memory_load : 0   +0x05c exit_memory_load : 0

其实 reinterpret_cast 大概也是干这个事的,参考代码如下:

typedef struct _Point {int x;int y;} Point;int main(){Point point = { 10,11 };//内存地址void* ptr = &point;//根据内存地址 丈量出  PointPoint* ptr_point = reinterpret_cast<Point*>(ptr);printf("x=%d", ptr_point->x);}

从代码看,我直接根据 ptr 地址丈量出了 Point 结构,说实话这个和 C 玩法就比较类似了。

3. dynamic_cast

在多态场景下,有时候会遇到这样的一个问题,一个父类有多个子类,我现在手拥一个父类,我不知道能不能将它转换为其中一个子类,要试探一下看看,那怎么去试探呢? 类似 C# 中的 as 运算符,在 C++ 中就需要用 dynamic_cast 来做这件事情,参考如下:

//点class Point {public:Point(int x, int y) :x(x), y(y) {}virtual void show() {}public:int x;int y;};//矩形class Rectangle :public Point {public:Rectangle(int x, int y, int w, int h) : Point(x, y), w(w), h(h) {}public:int w;int h;};//三角形class Triangle :public Point {public:Triangle(int x, int y, int z) :Point(x, y), z(z) {}public:int z;};int main(){Point* p1 = new Rectangle(10, 20, 100, 200);Point* p2 = new Triangle(4, 5, 6);//将  p1 转成 子类 Triangle 会报错的Triangle* t1 = dynamic_cast<Triangle*>(p1);if (t1 == nullptr) {printf("p1 不能转成 Triangle");}}

C++中的四种类型转换符是什么

对,场景就是这个,p1 其实是 Rectangle 转上去的, 这时候你肯定是不能将它向下转成 Triangle , 问题就在这里,很多时候你并不知道此时的 p1 是哪一个子类。

接下来的一个问题是,C++ 并不像C# 有元数据,那它是如何鉴别呢? 其实这用了 RTTI 技术,哪里能看出来呢?哈哈,看汇编啦。

Triangle* t1 = dynamic_cast<Triangle*>(p1);00831D57  push        0  00831D59  push        offset Triangle `RTTI Type Descriptor' (083C150h)  00831D5E  push        offset Point `RTTI Type Descriptor' (083C138h)  00831D63  push        0  00831D65  mov         eax,dWord ptr [p1]  00831D68  push        eax  00831D69  call        ___RTDynamicCast (083104Bh)  00831D6E  add         esp,14h  00831D71  mov         dword ptr [t1],eax

从汇编可以看到编译器这是带夹私货了,在底层偷偷的调用了一个 ___RTDynamicCast 函数在运行时帮忙检测的,根据 cdcel 调用协定,参数是从右到左,恢复成代码大概是这样。

___RTDynamicCast(&p1, 0, &Point, &Triangle,0)

3. static_cast

从名字上就能看出,这个强转具有 static 语义,也就是 编译阶段 就生成好了,具体安全不安全,它就不管了,就拿上面的例子,将 dynamic_cast 改成 static_cast 看看有什么微妙的变化。

int main(){Point* p1 = new Rectangle(10, 20, 100, 200);Point* p2 = new Triangle(4, 5, 6);Triangle* t1 = static_cast<Triangle*>(p1);printf("x=%d, y=%d,z=%d", t1->x, t1->y, t1->z);}

C++中的四种类型转换符是什么

我们发现居然转成功了,而且 Triangle 的值也是莫名奇怪,直接取了 Rectangle 的前三个值,如果这是生产代码,肯定要挨批了。。。

接下来简单看下汇编代码:

Triangle* t1 = static_cast<Triangle*>(p1);00DF5B17  mov         eax,dword ptr [p1]  00DF5B1A  mov         dword ptr [t1],eax  printf("x=%d, y=%d,z=%d", t1->x, t1->y, t1->z);00DF5B1D  mov         eax,dword ptr [t1]  00DF5B20  mov         ecx,dword ptr [eax+0Ch]  00DF5B23  push        ecx  00DF5B24  mov         edx,dword ptr [t1]  00DF5B27  mov         eax,dword ptr [edx+8]  00DF5B2A  push        eax  00DF5B2B  mov         ecx,dword ptr [t1]  00DF5B2E  mov         edx,dword ptr [ecx+4]  00DF5B31  push        edx  00DF5B32  push        offset string "x=%d, y=%d,z=%d" (0DF8C80h)  00DF5B37  call        _printf (0DF145Bh)  00DF5B3C  add         esp,10h

从代码中看,它其实就是将 p1 的首地址给了 t1,然后依次把copy偏移值 +4,+8,+0C, 除了转换这个,还可以做一些 int ,long ,double 之间的强转,当然也是一样,编译时汇编代码就已经生成好了。

“C++中的四种类型转换符是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: C++中的四种类型转换符是什么

本文链接: https://www.lsjlt.com/news/343670.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++中的四种类型转换符是什么
    本篇内容介绍了“C++中的四种类型转换符是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一:背景在玩 C 的时候,经常会用 v...
    99+
    2023-07-02
  • C++中四种类型转换的方法是什么
    这篇文章主要介绍了C++中四种类型转换的方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++中四种类型转换的方法是什么文章都会有所收获,下面我们一起来看看吧。一、隐式类型转换和显示类型转换当等号两边的...
    99+
    2023-07-05
  • C++的四种类型转换
    目录一、隐式类型转换和显示类型转换二、C++的四种类型转换2.1 static_cast 相似转化2.2 reinterpret_cast 不同类型转化2.3 const_cast ...
    99+
    2023-05-14
    C++实现类型转换方法 C++实现类型转换
  • 一起聊聊C++中的四种类型转换符
    目录一:背景二:理解四大运算符1. const_cast2. reinterpret_cast3. dynamic_cast3. static_cast一:背景 在玩 C 的时候,经...
    99+
    2022-11-13
  • 详解C++中四种类型的转换
    目录const_caststatic_castreinterpret_castdynamic_cast代码C语言中我们使用 int a=(int) b;的方式强制转换 C++提供了四...
    99+
    2022-12-08
    C++类型转换 C++ 类型转换符 C++ 转换符
  • C++中的四种强制类型转换介绍
    这篇文章主要讲解了“C++中的四种强制类型转换介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++中的四种强制类型转换介绍”吧!在了解c++的强制类形转换的时候,先看看在c语言中是怎么进...
    99+
    2023-06-20
  • C++强制类型转换的四种方式
    目录1 C++类型转换本质1.1 自动类型转换(隐式)1.2 强制类型转换(显式)1.3 类型转换的本质1.4 类型转换的安全性2 四种类型转换运算符2.1 C语言的强制类型转换与C...
    99+
    2022-11-13
  • 一文搞懂C++中的四种强制类型转换
    在了解c++的强制类形转换的时候,先看看在c语言中是怎么进行强制类形转换的。 C语言中的强制类形转换分为两种  隐式类型转换 显示类型转换 int ...
    99+
    2022-11-12
  • C++实例讲解四种类型转换的使用
    目录C++类型转换C语言风格的转换C++风格的类型转换static_castreinterpret_castconst_castdynamic_cast小结C++类型转换 C语言风格...
    99+
    2022-11-13
  • C++11新特性之四种类型转换cast说明
    目录引言1、static_cast1.1 基本类型转换1.2 类的上行转换(安全)1.3 类的下行转换(不安全)2、const_cast2.1 改变常量属性3、dynamic_cas...
    99+
    2023-02-09
    c++11类型转换 c++11类型转换cast C++类型转换
  • 四种C#参数类型分别是什么
    这篇文章将为大家详细讲解有关四种C#参数类型分别是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。C#参数类型有四种:值类型引用类型输出类型数组型参数C#参数类型(1):值参数所谓值参数,...
    99+
    2023-06-17
  • C++中4种类型转换的方法分享
    目录1. C语言中的类型转换2. 为什么C++需要四种类型转换3. C++强制类型转换3.1 static_cast3.2 reinterpret_cast3.3 const_cas...
    99+
    2023-05-14
    C++实现类型转换方法 C++类型转换方法 C++类型转换
  • C语言隐式类型转换与强制类型转换的方法是什么
    本篇内容主要讲解“C语言隐式类型转换与强制类型转换的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言隐式类型转换与强制类型转换的方法是什么”吧!类型转换数据有不同的类型,不同类型数...
    99+
    2023-06-25
  • c++数据类型转换的方法是什么
    在C++中,数据类型转换有以下几种方法:1. 隐式转换:在某些情况下,C++会自动执行数据类型的隐式转换。例如,将整数赋值给浮点数变...
    99+
    2023-09-16
    c++
  • C++为什么非要引入那几种类型转换
    这篇文章主要讲解了“C++为什么非要引入那几种类型转换”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++为什么非要引入那几种类型转换”吧!众所周知C++关于类型转换引入了四种方式:stat...
    99+
    2023-06-09
  • java四种引用类型是什么
    Java中有四种引用类型,它们分别是:1. 强引用(Strong Reference):最常见的引用类型,只要一个对象有强引用与之关...
    99+
    2023-09-28
    java
  • C#怎么把不同值的类型转换为字符串类型
    本文小编为大家详细介绍“C#怎么把不同值的类型转换为字符串类型”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#怎么把不同值的类型转换为字符串类型”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。实例namespa...
    99+
    2023-06-17
  • C#数值类型之间的转换方法是什么
    本篇内容介绍了“C#数值类型之间的转换方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!C#数值类型之间转换这里所说的数值类型包括 b...
    99+
    2023-06-17
  • 浅谈C++为什么非要引入那几种类型转换
    众所周知C++关于类型转换引入了四种方式: static_cast const_cast dynamic_cast reinterpret_cast  ...
    99+
    2022-11-11
  • C++中怎么实现类型转换
    本篇文章给大家分享的是有关C++中怎么实现类型转换,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。0. 类型转换的原理在进行下面的学习前,我觉得有比较知道不同类型是怎么进行转换的...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作