强制类型转换
来源:互联网 发布:淘宝 app 编辑:程序博客网 时间:2024/06/05 09:25
背景
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更安全
0 0
- 关于强制类型转换:强制类型转换
- 类型转换&&类型强制转换
- 类型转换&&类型强制转换
- 类型转换(向下强制)
- c++强制类型转换
- 强制类型转换
- 关于强制类型转换
- c++强制转换类型
- C++ 强制类型转换
- c++强制类型转换
- 强制类型转换
- C++强制类型转换
- java强制类型转换
- c++强制类型转换
- javascript 强制类型转换
- 谈谈强制类型转换
- C++强制类型转换
- cast : 强制转换类型
- linux更改文件属性的三个命令(chmod,chgrp,chown)的使用
- (Error)CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temp
- sqlserver的最大连接数测试
- easyui datagrid 的 tip实现
- android之ViewPager的使用详解
- 强制类型转换
- iOS关于导航设置的问题
- cc -l选项
- Gradle DSL method not found: 'compile() 解决办法
- xml Schema
- pb web 环境配置及常见错误处理
- C4.5算法
- 【VBA研究】如何防止用户关闭窗体
- (assign,retain,copy):