c++当中为了避免int a=1; char b=(char)a;这种c语言转换带来的不安全性,推出了几个cast,方便用于类型转换,今儿来说道说道
1. const_cast
const_cast(exp)
用来强制修改变量的const或者volatile属性
2. static_cast
static_cast(exp)
跟c当中的强制类型转换很类似,没有运行时类型检查,所以无法保证转换的安全性。
3. reinpreter_cast
reinpreter_cast(exp)
从一个指针到别的只针的值的二进制拷贝,对指向的内容不做任何类型的检查和转换
4. dynamic_cast
dynamic_cast(exp)
只能用于对象和引用,可以将指向子类的父类指针转换为子类指针,但是要求父类有虚函数,如果转换指针失败,返回NULL,引用失败,则跑出bad_cast异常
关于RTTI的一点补充:
在c++当中,可以通过typeid(var).name()输出对应的类型,而且如果自定义类型当中不存在虚函数的时候,rtti是在编译期间就完成的,当存在虚函数时,typeid就是运行期的事情
当类中存在虚函数的时候,编译器就会在类的成员变量中添加一个指向虚函数表的vptr,通常这个表当中的第一项是type_info,当进行dynamic_cast时,编译器会进行语法检查,如果指针的静态类型和目标类型相同,来进行后续判断
参考:
https://www.cnblogs.com/hana12169/p/4055035.html
阅读(1252) | 评论(0) | 转发(0) |