C++有4种类型转换,分别为:const_cast,static_cast,dynamic_cast,reinterpret_cast;下面结合代码分别介绍4种类型转换。
const_cast:
去掉类型的const属性,将const变量转为非const变量;
1 const int a;
2
3 //直接修改const类型变量的值,编译错误
4 //a = 10;
5
6 //去除const属性,并转换为int&类型
7 int &b = const_cast<int&>(a);
8
9 //可以对其值进行修改
10 b = 10;
static_cast:
类似于C语言的强制类型转换,用于各种隐式转换。
父类指针和子类指针之间的转换:子类指针转换为父类指针(向上转换安全),父类指针转换为子类指针(向下转换不安全);基本数据类型转换;任何类型转换成void类型;非const类型转换为const类型,但是不能去掉类型的const属性。
1 B* b = new B();
2 //子类(B)指针转换为父类(A)指针,安全
3 A* a = static_cast<A*>(b);
4
5 int n = 10;
6 //基本数据类型转换
7 double d = static_cast<double>(n);
8
9 int *pn = &n;
10 //任意数据类型转换为void类型
11 void *p = static_cast<void*>(pn);
12
13 int a=10;
14 //非const类型转换为const类型
15 const int b=static_cast<const int>(a);
dynamic_cast:
用于动态类型转换,运行时检查类型安全(转换失败返回NULL)。
父类指针和子类指针之间的转换,向上向下转换均为安全的且只能用于含有虚函数的类。
1 //A类为父类,B类为子类,且含有虚函数
2
3 B* pb = new B();
4 //子类(B)指针转换为父类(A)指针,静态类型转换,不进行安全检查
5 A* ps1 = static_cast<A*>(pb);
6 //子类(B)指针转换为父类(A)指针,动态类型转换,进行安全检查
7 A* ps2 = dynamic_cast<A*>(pb);
8
9 A* pb2 = new A();
10 //父类(A)指针转换为子类(B)指针,静态类型转换,危险、
11 //当访问子类有而父类没有的成员时出错
12 B* ps21 = static_cast<B*>(pb2);
13 //父类(A)指针转换为子类(B)指针,动态类型转换,安全,结果为NULL
14 B* ps22 = dynamic_cast<B*>(pb2);
reinterpret_cast:
几乎什么都可以转(如int类型转换为指针类型),尽量少用。
相关链接