C++类型转换

  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类型转换为指针类型),尽量少用。

 

相关链接

C++智能指针 https://www.cnblogs.com/yongjin-hou/p/14394429.html

posted @ 2021-02-08 21:42  封狼居胥!  阅读(282)  评论(0编辑  收藏  举报