福建省网站建设,成都网站设计得多少钱,短网址生成工具 请输入长网址: 缩短网址,月付网站空间提供商接触过C语言的朋友都知道#xff0c;C语言中也有强制类型转换#xff0c;但是C语言中的强制类型转换会有一些问题#xff0c;比如#xff1a;
int a 0x1234;
char b (char)a;
上述的代码出现一个问题就是a 这个int型强制转化成b 这个char型时损失了一些精度#xff0c…接触过C语言的朋友都知道C语言中也有强制类型转换但是C语言中的强制类型转换会有一些问题比如
int a 0x1234;
char b (char)a;
上述的代码出现一个问题就是a 这个int型强制转化成b 这个char型时损失了一些精度
除此之外比如没有内存检测(数字转化为地址类型)等。
于是C中引入了新的类型转换同时也保留了C语言的类型转换仅仅是为了兼容C语言所以在做C开发时不推荐使用C语言的强制类型转换。
C强制类型转换主要分4类static_cast、const_cast、dynamic_cast、reinterpret_cast
1、用法xxx_cast要转换的目标类型(表达式)
2、区别
① static_cast没有运行时类型检查来保证转换的安全性 用于基本类型间(int double float等)的转换 不能用于基本类型指针间的转换 用于有继承关系类对象之间的转换和类指针之间的转换
②const_cast 去除变量的只读属性 强制转换的目标类型必须是指针或引用
③reinterpret_cast 用于指针类型间的强制转换 用于整数和指针类型间的强制转换
④dynamic_cast 用于有继承关系类指针之间的转换 用于有交叉关系类指针之间的转换 具有类型检查的功能 需要虚函数的支持
如果一条dynamic_cast语句的转换目标是指针类型并且失败了则结果为0。如果转换目标是引用类型并且失败了则dynamic_cast运算符将抛出一个std::bad_cast异常(该异常定义在typeinfo标准库头文件中) 上述强制转换一定要考虑到数值范围、内存大小问题。
数值问题比如一个float类型的数据转换为short数据时肯定会有精度损失(当被转换变量的值超过short的范围)
内存大小问题比如我们使用static_cast将一个父类指针转换为子类指针然后我们再操作时访问子类独有的成员时这很有可能就会出错比如段错误或者值不对