类型转换(cast)
类型转换
1. static_cast(静态转换)
编译的时候就会进行类型转换,代码中要保证转换的安全性和正确性
可用于:
- 相关类型转换,比如:整型和实型之间的转换
- 子类型转成父类类型(向上转型)
- void * 与其它类型指针之间的转换(void *:无指针类型,可以指向任何指针类型(万能指针))
double f = 100.34f;
int j = static_cast<int>(f);
class A {}
class B : public A{}
B b;
A a = static_cast<A>(b); // 把子类转成父类的对象
// 万能指针
int i = 10;
int *p = &i;
void * q = static_cast<void *>(p); // int * 转成 void *
int * db = static_cast<int *>(q);
2. dynamic_cast(第三章第十节)
3. const_cast
去除指针 或者引用的 const 属性。该转换能够将 const 性能转换掉,编译时就会进行类型转换
const int a = 10;
// int b = const_cast<int *>(a); a 既不是指针,也不是引用,不能转
const int *pa = &a;
int * pa2 = const_cast<int *>(pa); // 语法正确
*pa2 = 120; // 这种写值行为,是属于一种未定义行为,不要这么做
4. reinterpret_cast(不建议使用)
重新解释:将操作数内容解释为另一种不同的类型【能把操作数的类型都转了】
处理无关类型的转换:也就是2个转换类型之间没有什么关系,就等于可以乱转,自由转,怎么转都行,很随意
常用于如下两种转换:
- 将一个整型(地址)转换成指针,一种类型指针转换成另一种类型指针,按照转换后的内容重新解释内存中的内容
- 也可以从一个指针类型转换成一个整型
int i = 10;
int *pi = &i;
int *p2 = reinterpret_cast<int *>(&i);
int *pc = reinterpret_cast<char *>(pi);