强制类型转换
2016-01-18 16:16
211 查看
背景
C语言中的强制类型转换过于简单粗暴,没有考虑这样转换是否安全如一个指向结构体的指针转换为指向函数的指针,强制类型转换也能转换成功。因为对C来说指针都是一个占四个字节的空间转换成什么类型都是可以的。在C语言中,强制类型转换的错误难以定位,用编译器的find可以找到一堆,有些封装过的更加难以找到
C++对强制类型转换的改进
c++将强制类型转换分为4中类型1. static_cast
-用于基本类型间的转换,但不能用于基于类型指针 间的转换。-有继承关系类对象之间的转换和类指针之间的转换
例:
#include<stdlib.h> #include <stdio.h> int main(void) { int i = 0; char c = 'c'; int *pi = &i; char* pc = &c; c = static_cast<char>(i);//把int转换成char==>错误 pc = static_cast<char*>(pi)//把int*转换成char*==>导致编译错误 system("PAUSE"); return 0; }
2.const_cast:用于去除变量的const属性
例:#include<stdlib.h> #include <stdio.h> int main(void) { const int& j = 1;//定义一个只读变量,j储存在内存中 int& k = const_cast<int&>(j);//去除j的只读属性 const int x = 2;//定义一个只读常量,x储存在符号表里 int& y = const_cast<int&>(x);//试图把只读常量变为变量 k = 5; printf("j = %d\n",j); printf("k = %d\n",k); y = 8; printf("x = %d\n",x); printf("y = %d\n",y); printf("&x = %X\n",&x); printf("&y = %X\n",&y); system("PAUSE"); return 0; }
输出结果:
j = 5
k = 5
x = 2
y = 8
&x = 0X61FEFC
&y = 00x61FEFC
显然就j,k的值很正常,但是为什么x和y的值不同呢?
解释:在定义时候j是存在内存中的只读变量,而x是存在只读存储区的符号表内的只读常量,const_cast强制把x只读常量变成变量,那么程序会在内存分配给x一个内存,而这个内存的别名叫x同时也叫y,因为取地址得到的地址是一样的。那么访问x时,还是直接去符号表内去取值为2,访问y时就去内存中去取值为8
3.reinterpret_cast:
**警告:**reinterpret_cast直接从二进制位进行复制,是一种极不安全的转换。-用于指针类型间的强制转换
-用于整数和指针类型间的强制转换
例:
#include<stdlib.h> #include <stdio.h> int main(void) { int i = 0; char c = 'c'; int *p = reinterpret_cast<int*>(&c);//char*->int* char *pc = reinterpret_cast<char*>(&i);//int*->char* system("PAUSE"); return 0; }
4.dynamic_cast(待补充)
-主要用于类层次间的转换,还可以用于类之间的交叉转换-dynamic_cast具有类型检查功能,比static_cast更安全
相关文章推荐
- (Error)CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temp
- xml Schema
- JavaSE入门学习1:计算机基础知识
- android之ViewPager的使用详解
- 谈谈Ext JS的组件——布局的用法续二
- Session只读的影响
- SQL Having用法
- 深入学习jQuery Validate表单验证
- 详解PHP ob_start()函数的功能要点
- Collection(List)
- linux shell中大于、小于、等于逻辑表达式介绍
- Java中Runnable和Thread的区别
- iOS开发之如何跳到系统设置里的WiFi界面
- ios 给textField每四位添加一个空格
- CHM打不开的解决方法
- xml 命名空间(Namespace)
- updatepanel中使用alert弹出框方法(两种)
- 任务调度IBM Tivoli Workload Scheduler(TWS)
- mac系统下设置eclipse的补全快捷键方法
- 互联网协议入门