类型转换
隐式类型转换
系统自动转换,不需要程序开发人员介入
显式类型转换(强制类型转换)
c语言风格int k = 5 % (int)3.2
或者int k = 5 % int(3.2)
c强制类型转换分为4种,c语言风格依然可以在c代码中使用,尽量使用c++风格强制类型转换,有更丰富的含义和功能,更好的类型检查机制,方便代码的书写和维护
static_cast
dynamic_cast
const_cast
reinterpret_cast
通用形式:强值类型转换名<type>(expression)
,type为转换的目标类型,expression为要转换的值。
static_cast
静态转换,可以理解为正常转换,编译的时候就会进行类型转换的检查,代码中要保证转换的安全性和正确性,跟c语言风格强制类型转换类似。
可用于
a)相关类型转换,比如整形和实型之间的转换
double f = 100.34;
int i = (int)f;
int i1 = static_cast<int>(f);
b)子类转换成父类(继承关系)
class A {};
class B : public a{};
B b;
A a = static_cast<A>(b);
B b = static_cast<B>(a); //不可以,父类不能转子类
c)void *与其他类型的指针之间的转换
int i = 10;
int *p = &i;
void *q = static_cast<void *>(p);
int *db = static_cast<int *>(q);
不可用于
a)一般不能用于指针类型之间的转换,比如int *
转double *
,float *
转double *
等等
dynamic_cast
主要应用于运行时类型识别和检查,主要用于父类型和子类型之间转换
const_cast
去除指针或引用的const属性,能将const属性去除,编译时就会进行类型转换,const_cast意味着缺陷
const a = 90;
int a1 = const_cast<int>(a); //错误,a不是指针也不是引用,所以不能转
const int *pa = &a;
int *pa1 = const_cast<int *>(pa); //正确,不要有写值行为,如*pa1 = 120;
reinterpret_cast
编译时会进行的类型检查,重新解释,将操作数内容解释为另一种不同的类型,处理无关类型的转换,就等于乱转,自由转,被认为是危险的类型转换,无论怎么转,编译器都不报错。不建议使用
常用于:
1、将一个整形(地址)转换为指针,一种类型指针转换为另一种类型指针,按照转换后的内容重新解释内存中的内容。
2、也可以将一个指针类型转换为整形
评论区