强制类型转换C 方式的强制类型转换( Type )( Expression )Type( Expression )编程实验: 粗暴的类型转换#include <stdio.h>typedef 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++ 将强制类型转换分为 4 种不同的类型static_castconst_castdynamic_castreinterpret_cast用法: xxx_cast<Type>(Expression)static_cast 强制类型转换用于基本类型间的转换不能用于基本类型指针间的转换用于有继承关系对象之间的转换和类指针之间的转换const_cast 强制类型转换用于去除变量的只读属性强制转换的目标类型必须是指针或引用reinterpret_cast 强制类型转换用于指针类型间的强制类型转换用于整数和指针类型间的强制转换dynamic_cast 强制类型转换用于有继承关系的类指针间的转换用于有交叉关系的类指针间的转换具有类型检查的功能需要虚函数的支持示例分析: 新式类型转化初探#include <stdio.h>void static_cast_demo(){ int i = 0x12345; char c = ‘c’; int* pi = &i; char* pc = &c; c = static_cast<char>(i); //pc = static_cast<char*>(pi); // ERROR}void const_cast_demo(){ const int& j = 1; int& k = const_cast<int&>(j); const int x = 2; int& y = const_cast<int&>(x); //int z = const_cast<int>(x); // ERROR 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<char*>(pi); pi = reinterpret_cast<int*>(pc); pi = reinterpret_cast<int*>(i); //c = reinterpret_cast<char>(i); // ERROR }void dynamic_cast_demo(){ int i = 0; int* pi = &i; //char* pc = dynamic_cast<char*>(pi); // ERROR}int main(){ static_cast_demo(); const_cast_demo(); reinterpret_cast_demo(); dynamic_cast_demo(); return 0;}输出:k = 5j = 5x = 2y = 8&x = 0xbf8be7a0&y = 0xbf8be7a0小结C 方式的强制类型转换过于粗暴潜在问题不易被发现不易在代码中定位新型类型转换以 C++ 关键字的方式出现编译器能够帮助检查潜在问题非常方便的在代码中定位支持动态类型识别(dynamic_cast)以上内容参考狄泰软件学院系列课程,请大家保护原创!