接触过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将一个父类指针转换为子类指针,然后我们再操作时访问子类独有的成员时,这很有可能就会出错(比如段错误或者值不对)