c++包含4个类型转换运算符:`dynamic_cast、const_cast、static_cast、reinterpret_cast`
一、dynamic_cast:dynamic_cast函数讲解
二、const_cast
const_cast运算符用于执行只有一种用途的类型转换,即改变值为const或volatile,const_cast<type-name> (expression)
class A
{
...
};
class B
{
...
};
B pb;
const B *pb1 = &pb;
B *pb2 = const_cast<B *>pb1; //有效的
const A * pa = const_cast<A *>pb1; //无效的
【注】type-name> 和 (expression)的类型必须相同
demon
#include<iostream>
using namespace std;
void change(const int *p,int n);
int main()
{
int p1 = 6666;
const int p2 = 1666;
cout << "p1= "<< p1 << " | p2= " << p2 <<endl;
change(&p1,666);
change(&p2,666);
cout << "p1= "<< p1 << " | p2= " << p2 <<endl;
return 0;
}
void change(const int * p,int n)
{
int *q;
q = const_cast<int *>(p);
*q -=n;
cout << "q is "<< *q <<" | p is "<< *p << endl;
}
运行结果:
三、static_cast
static_cast运算符static_cast<type_name>(expression)
,只有type_name可以被隐式的转换为expression所属的类型或expression可被隐式转换为type_name类型时才是合法的。
class A
{
...
};
class B : public A
{
...
};
class C
{
...
}
A pa;
B pb;
A *p_a = static_cast< A *>(pb); //合法
B *p_b = static_cast< B *>(pa); //合法
C *p_c = static_cast< C *>(pb); //不合法,B、C类型不可以隐式转换
四、reinterpretc_cast
reinterpretc_cast<type-name>(expression)
局限性: 1.不支持所以类型转换
2.不能将函数指针转换为数据指针
示例
#include<iostream>
using namespace std;
int main()
{
struct dat {short a;short b;}'
long value = 0xA224B118;
dat * pd = reinterpret_cast< dat *> (&value);
cout << hex << pd->a <<endl;
return 0;
}
//摘录自c++Primer Plus
运行结果: