目录
一、C语言中的强制类型转换二、C语言强制类型转换存在的问题三、C++ 中的类型转换四、小结一、C语言中的强制类型转换
转换的语法如下:
(Type) (Expression)
Type(Expression)
下面看一段C语言中粗暴的类型转换的代码:
#includetypedef void(PF)(int); struct Point { int x; int y; }; int main() { int v = 0x12345; PF* pf = (PF*)v; char c = char(v); Point* p = (Point*)v; pf(5); printf("p->x = %d\n", p->x); printf("p->y = %d\n", p->y); return 0; }
在C++的环境下编译后就会发现:
二、C语言强制类型转换存在的问题
过于粗暴
任意类型之间都可以进行转换,编译器很难判断其正确性难于定位
在源码中无法快速定位所有使用强制类型转换的语句三、C++ 中的类型转换
C++ 将强制类型转换分为4种不同的类型:
C++强制类型转换
static_cast | const_cast |
dynamic_cast | reinterpret_cast |
用法:xxx_cast
static_cast 强制类型转换
用于基本类型间的转换不能用于基本类型指针间的转换用于有继承关系类对象之间的转换和类指针之间的转换const_cast 强制类型转换
用于去除变量的只读属性强制转换的目标类型必须是指针或引用reinterpret_cast 强制类型转换
用于指针类型间的强制转换用于整数和指针类型间的强制转换dynamic_cast 强制类型转换
用于有继承关系的类指针间的转换用于有交叉关系的类指针间的转换具有类型检查的功能需要虚函数的支持下面看一段C++类型转换代码:
#includevoid static_cast_demo() { int i = 0x12345; char c = "c"; int* pi = &i; char* pc = &c; c = static_cast (i); //pc = static_cast (pi); } void const_cast_demo() { const int& j = 1; int& k = const_cast (j); const int x = 2; int& y = const_cast (x); //int z = const_cast (x); k = 5; printf("k = %d\n", k); printf("j = %d\n", j); y = 8; printf("x = %d\n", x); printf("y = %d\n", y); printf("&x = %p\n", &x); printf("&y = %p\n", &y); } void reinterpret_cast_demo() { int i = 0; char c = "c"; int* pi = &i; char* pc = &c; pc = reinterpret_cast (pi); pi = reinterpret_cast (pc); pi = reinterpret_cast (i); //c = reinterpret_cast (i); } void dynamic_cast_demo() { int i = 0; int* pi = &i; //char* pc = dynamic_cast (pi); } int main() { static_cast_demo(); const_cast_demo(); reinterpret_cast_demo(); dynamic_cast_demo(); return 0; }
下面为输出结果:
注意程序注释的4个地方,都是错误使用了类型转换:
第一个地方:pc = static_cast
第二个地方:int z = const_cast
第三个地方:c = reinterpret_cast
第四个地方:char* pc = dynamic_cast
还有一个问题就是 x 和 y 值的问题。x 是一个真正意义上的常量,所以编译期间值确定了就是2,但是编译器要兼容 C语言,所以会给 x 在栈空间分配了4个字节的空间出来,使用 const_cast 作用于它就相当于给这 4个字节空间取了一个别名 y,令 y = 8,就相当于给这 4个字节栈空间中的 int 变量赋了一个值 8。所以打印出来的 x 和 y的地址值是一样的。
四、小结
C 方式的强制类型转换
过于粗暴潜在的问题不易被发现不易在代码中定位新式类型转换以C++ 关键字的方式出现
编译器能够帮助检查潜在的问题非常方便的在代码中定位支持动态类型识别( dynamic_cast )到此这篇关于C++简明讲解类型转换的使用与作用的文章就介绍到这了,更多相关C++ 类型转换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
上一篇:C#中的虚函数virtual
下一篇:C#中类与接口的区别讲解
X 关闭
X 关闭
- 15G资费不大降!三大运营商谁提供的5G网速最快?中国信通院给出答案
- 2联想拯救者Y70发布最新预告:售价2970元起 迄今最便宜的骁龙8+旗舰
- 3亚马逊开始大规模推广掌纹支付技术 顾客可使用“挥手付”结账
- 4现代和起亚上半年出口20万辆新能源汽车同比增长30.6%
- 5如何让居民5分钟使用到各种设施?沙特“线性城市”来了
- 6AMD实现连续8个季度的增长 季度营收首次突破60亿美元利润更是翻倍
- 7转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 8充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 9好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 10名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?