C++的四种强制类型转换为:static_cast、const_cast、reinterpret_cast和dynamic_cast

类型转换的一般形式:cast-name(expression);

static_cast

任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast;

double slope = static_cast(j) / i;

注:
  顶层const:表示指针本身是个常量。如:int *const p;
  底层const:表示指针所指的对象是一个常量。如:int const *p;

const_cast

该运算符只能改变运算对象的底层const。

#include<iostream>
using namespace std;
int main()
{
const char *pc=" HDU";
char *p=const_cast<char *>(pc); //正确, cout<<"hello"<<p<<endl;
return 0;
}

注:此处只能用const_cast,而不能用static_cast;

reinterpret_cast

通常为运算对象的位模式提供较低层次上的重新解释。
注:
  1、在指针之间转换,将一个类型的指针转换为另一个类型的指针,无关类型;
  2、将指针值转换为一个整型数,但不能用于非指针类型的转换。

dynamic_cast

只用于对象的指针和引用,不能用于内置的基本数据类型的强制转换。
使用dynamic_cast进行转换的,基类中一定要有虚函数,否则编译不通过。
运行时类型识别,用于将基类的指针或引用安全地转换成派生类的指针或引用。

对指针进行dynamic_cast,失败返回null,成功返回正常cast后的对象指针;
对引用进行dynamic_cast,失败抛出一个异常bad_cast,成功返回正常cast后的对象引用。

对于“向上转换”(即派生类指针或引用类型转换为其基类类型),无论是指针还是引用向上转换都是安全地。
对于“向下转型”有两种情况:
  1、基类指针所指对象是派生类类型的,这种转换是安全的;
  2、基类指针所指对象为基类类型,在这种情况下dynamic_cast在运行时做检查,转换失败,返回结果为0;
  在引用上,dynamic_cast依旧是常用于“安全的向下转型”。与指针一样,引用的向下转型也可以分为两种情况,与指针不同的是,并不存在空引用,所以引用的dynamic_cast检测失败时会抛出一个bad_cast异常。

#include <iostream>
#include <cstring>
using namespace std;
class A
{
public:
virtual void f()
{
cout << "hello" << endl;
}
}; class B: public A
{
public:
void f()
{
cout << "hello2" << endl;
} }; int main()
{
A* a1=new B;//a1是A类型的指针指向一个B类型的对象
A* a2=new A;//a2是A类型的指针指向一个A类型的对象
B* b; b=dynamic_cast<B*>(a1);
//结果为not null,向下转换成功,a1之前指向的就是B类型的对象,所以可以转换成B类型的指针。
if(b==NULL)
cout<<"null"<<endl;
else
cout<<"not null"<<endl; b=dynamic_cast<B*>(a2);//结果为null,向下转换失败
if(b==NULL)
cout<<"null"<<endl;
else
cout<<"not null"<<endl;
return 0;
}

总结

  基本类型转换用static_cast。
  去const属性用const_cast。
  不同类型的指针类型转换用reinterpreter_cast。
  多态类之间的类型转换用daynamic_cast。

C++ 4种强制类型转换

C++的四种强制类型转换为:static_cast、const_cast、reinterpret_cast和dynamic_cast

类型转换的一般形式:cast-name(expression);

static_cast

任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast;

double slope = static_cast(j) / i;

注:
  顶层const:表示指针本身是个常量。如:int *const p;
  底层const:表示指针所指的对象是一个常量。如:int const *p;

const_cast

该运算符只能改变运算对象的底层const。

#include<iostream>
using namespace std;
int main()
{
const char *pc=" HDU";
char *p=const_cast<char *>(pc); //正确, cout<<"hello"<<p<<endl;
return 0;
}

注:此处只能用const_cast,而不能用static_cast;

reinterpret_cast

通常为运算对象的位模式提供较低层次上的重新解释。
注:
  1、在指针之间转换,将一个类型的指针转换为另一个类型的指针,无关类型;
  2、将指针值转换为一个整型数,但不能用于非指针类型的转换。

dynamic_cast

只用于对象的指针和引用,不能用于内置的基本数据类型的强制转换。
使用dynamic_cast进行转换的,基类中一定要有虚函数,否则编译不通过。
运行时类型识别,用于将基类的指针或引用安全地转换成派生类的指针或引用。

对指针进行dynamic_cast,失败返回null,成功返回正常cast后的对象指针;
对引用进行dynamic_cast,失败抛出一个异常bad_cast,成功返回正常cast后的对象引用。

对于“向上转换”(即派生类指针或引用类型转换为其基类类型),无论是指针还是引用向上转换都是安全地。
对于“向下转型”有两种情况:
  1、基类指针所指对象是派生类类型的,这种转换是安全的;
  2、基类指针所指对象为基类类型,在这种情况下dynamic_cast在运行时做检查,转换失败,返回结果为0;
  在引用上,dynamic_cast依旧是常用于“安全的向下转型”。与指针一样,引用的向下转型也可以分为两种情况,与指针不同的是,并不存在空引用,所以引用的dynamic_cast检测失败时会抛出一个bad_cast异常。

#include <iostream>
#include <cstring>
using namespace std;
class A
{
public:
virtual void f()
{
cout << "hello" << endl;
}
}; class B: public A
{
public:
void f()
{
cout << "hello2" << endl;
} }; int main()
{
A* a1=new B;//a1是A类型的指针指向一个B类型的对象
A* a2=new A;//a2是A类型的指针指向一个A类型的对象
B* b; b=dynamic_cast<B*>(a1);
//结果为not null,向下转换成功,a1之前指向的就是B类型的对象,所以可以转换成B类型的指针。
if(b==NULL)
cout<<"null"<<endl;
else
cout<<"not null"<<endl; b=dynamic_cast<B*>(a2);//结果为null,向下转换失败
if(b==NULL)
cout<<"null"<<endl;
else
cout<<"not null"<<endl;
return 0;
}

总结

  基本类型转换用static_cast。
  去const属性用const_cast。
  不同类型的指针类型转换用reinterpreter_cast。
  多态类之间的类型转换用daynamic_cast。

http://www.frankyang.cn/2017/05/10/c-4%E7%A7%8D%E5%BC%BA%E5%88%B6%E7%B1%BB%E5%9E%8B%E8%BD%AC%E6%8D%A2/

最新文章

  1. TreeView 使用方法:(在View.Details模式下)
  2. asp.net MVC 过滤器使用案例:统一处理异常顺道精简代码
  3. 【WP 8.1开发】如何处理摄像头翻转的问题
  4. PDO常用方法及其应用
  5. SQL —— 视图
  6. POJ 1502 MPI Maelstrom (Dijkstra)
  7. Java5 并发学习
  8. 关于wcf中一些重要词语解释
  9. SGU 194 Reactor Cooling ——网络流
  10. Android事件分发理解
  11. IOS 获取系统相册和拍照使用HXPhotoPicker 返回页面时页面上移被nav遮住问题
  12. python基础之Day8
  13. Android框架式编程之MVP架构
  14. POJ2065 SETI 高斯消元
  15. java实现图片上传功能,并返回图片保存路径
  16. Ubuntu下,terminal经常使用快捷键
  17. js中定时器之一
  18. devise的使用
  19. jquery中获取radio选中值的正确写法
  20. 触发器二(DML触发器)(学习笔记)

热门文章

  1. ES集群Master节点配置问题
  2. (转)nio 字符集
  3. 猫猫学iOS之UITextField右边设置图片,以及UITextField全解
  4. Win7如何开机直接进桌面
  5. VLC播放RTSP视频延迟问题
  6. mysql,给每一条数据的某一个字段生成不同的随机数
  7. lodash获取数组或对象的值 at
  8. 【VBA编程】13.Workbook对象的事件
  9. 反射机制2,Class类的使用
  10. 单例模式的Oracle 数据库连接应用