一:背景
在玩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