聊聊C中的四种类型转换符

一:背景

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

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

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

const_castinterpt_castdynamic_caststatic_cast

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

二:理解四大运算符

1.const_cast

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

intmain(){  constinti=10;  i=12;}

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

intmain(){  constinti=10;  autoj=const_castint*(i);  *(j)=12;}

2.interpt_cast

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

0:dtWKS::gc_mechanisms0x7ffb6ba96e60coclr!WKS::gc_mechanisms+0xgc_index:1+0xcondemned_generation:0n0+0x00cpromotion:0n0+0x


转载请注明:http://www.aierlanlan.com/rzfs/2450.html

  • 上一篇文章:
  •   
  • 下一篇文章: