备注: 后面看到 类,继承,虚函数的时候继续来补充。
1.1 C语言中强制类型转换
1.1.1 示例
- (Type )(Expression)
1.1.2 C方式强制类型转换存在的问题
- 过于粗暴
(1) 任意类型之间都可以进行转换,编译器很难判断其正确性 - 难以定位
- (1) 在源码中无法快速定位所有使用强制类型转换的语句
1.1.3 如何才能更安全的转换呢
C++ 中将强制类型转换分成了四类.
- static_cast
- const_cast
- dynamic_cast
- reinterprete_cast
- 用法 xxx_cast (expression)
1.2 static_cast 强制类型转换
1.2.1 转换规则
- 用于
基本类型
间的转换 不能
用于基本类型指针间的转换- 用于
有继承关系
类对象之间的转换和类指针
之间的转换。
1.2.2
案例1 :
#include <stdlib.h>
void static_cast_demo1()
{
int a =0x1234;
char b= static_cast<char>(a);
printf("b= %d\n",b);//0x34
}
/*
void static_cast_demo2() //error static_cast不能用于 普通类型指针间的转换
{
int a =10;
int* p1= &a;
char * p2= static_cast<char*>(p1);
printf("p2 = %p\n",p2);
}
*/
int main(int argc, char* argv[])
{
static_cast_demo1();
// static_cast_demo2();
return 0;
}
1.2.3
1.3 const_cast 强制类型转换
1.3.1 转换规则
- 用于去除变量的只读属性
- 强制转换的目标类型
必须
是指针或者引用
1.3.2
示例代码1
void const_cast_demo()
{
int a =10;
const int * p =&a;
int * p2 =const_cast<int *> (p);
*p2 = 20;
printf("a = %d\n",a); //20
}
int main(int argc, char* argv[])
{
const_cast_demo();
return 0;}
1.3.3
1.4 reinterpret_cast 强制类型转换
1.4.1 转换规则
- 用于指针类型间的强制转换
- 用于整数和指针类型间的强制转换
1.4.2
void reinterpret_cast_demo()
{
int a =10;
int* p1= &a;
char * p2= reinterpret_cast<char*>(p1);
printf("p2 = %p\n",p2);
}
int main(int argc, char* argv[])
{
reinterpret_cast_demo();
return 0;
}
1.4.3
1.5 dynamic_cast 强制类型转换
1.5.1 转换规则
- 用于有继承关系的类指针间的转换
- 用于有交叉关系的类指针间的转换
- 具有虚函数的支持
1.5.2
1.5.3
参考一 :狄泰软件学院C++课程