Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1246843
  • 博文数量: 160
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2112
  • 用 户 组: 普通用户
  • 注册时间: 2016-12-21 22:26
个人简介

90后空巢老码农

文章分类

全部博文(160)

文章存档

2021年(2)

2020年(56)

2019年(54)

2018年(47)

2017年(1)

我的朋友

分类: C/C++

2020-09-23 15:53:51

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
https://www.jianshu.com/p/3b4a80adffa7
阅读(168) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~