本文首发于个人博客
类型转换
- C语言风格的类型转换符
(type)expression
type(expression)
- C++中有4个类型转换符
static_cast
dynamic_cast
reinterpret_cast
const_cast
- 使用格式:
xx_cast<type>(expression)
我们有如下Person类和Student类
1 | class Person { |
直接用子类指针指向父类对象,编译报错
1 | Student *p = new Person(); //编译报错 |
C语言的做法一般是
1 | Student *p = (Student *)new Person(); //编译正常 |
强制转换只是欺骗编译器,有时候编译正常,执行会报错。
const_cast
- 一般用于去除
const
属性,将const
转换成非const
1 | const Person *p1 = new Person(); |
dynamic_cast
- ◼ 一般用于多态类型的转换,有运行时安全检测
1 | class Person { |
输出
1 | 0x0 |
上面的代码中,随便编译都是正常的。但是运行的事,检测到P1不是Student类型,也不是Car类型,所以转换之后的stu1和car都是Null.
static_cast
对比dynamic_cast,缺乏运行时安全检测
- 不能交叉转换(不是同一继承体系的,无法转换)
- 常用于基本数据类型的转换、非const转成const
上面的代码中
1 | int main(){ |
输出为
1 | 0x100555390 |
可知Person
类型的P1可以转换为 Person 类型或者
Student `类型
reinterpret_cast
- 属于比较底层的强制转换,没有任何类型检查和格式转换,仅仅是简单的二进制数据拷贝
- 可以交叉转换
- 可以将指针和整数互相转换
1 | Person *P1 = new Person(); |
输出如下,可知都可以转换成功,因为只是拷贝二进制
1 | 0x10062e6e0 |