C++中的类型转换分为两种:

  1. 隐式类型转换;
  2. 显式类型转换。

  隐式类型转换一般都是不经意间就发生了,比如int + float 时,int就被隐式的转换为float类型了。

  显示类型转换包括四种方式:dynamic_cast、static_cast、const_cast、reinterpret_cast

 static_cast

  static_cast的转换格式:static_cast <type-id> (expression)

  将expression转换为type-id类型,主要用于非多态类型之间的转换,不提供运行时的检查来确保转换的安全性。主要在以下几种场合中使用:

  1. 用于类层次结构中,基类和子类之间指针和引用的转换;
    当进行上行转换,也就是把子类的指针或引用转换成父类表示,这种转换是安全的;
    当进行下行转换,也就是把父类的指针或引用转换成子类表示,这种转换是不安全的,也需要程序员来保证;
  2. 用于基本数据类型之间的转换,如把int转换成char,把int转换成enum等等,这种转换的安全性需要程序员来保证;
  3. 把void指针转换成目标类型的指针,是及其不安全的;

  注:static_cast不能转换掉expression的const、volatile和__unaligned属性。

 dynamic_cast

    dynamic_cast的转换格式:dynamic_cast <type-id> (expression)

  dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。

  在多态类型之间的转换主要使用dynamic_cast,因为类型提供了运行时信息。

 const_cast

  const_cast的转换格式:const_cast <type-id> (expression)

  const_cast用来将类型的const、volatile和__unaligned属性移除。常量指针被转换成非常量指针,并且仍然指向原来的对象;常量引用被转换成非常量引用,并且仍然引用原来的对象。

 reinterpret_cast

  reinterpret_cast的转换格式:reinterpret_cast <type-id> (expression)

  允许将任何指针类型转换为其它的指针类型;它主要用于将一种数据类型从一种类型转换为另一种类型。它可以将一个指针转换成一个整数,也可以将一个整数转换成一个指针,在实际开发中,先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原来的指针值;特别是开辟了系统全局的内存空间,需要在多个应用程序之间使用时,需要彼此共享,传递这个内存空间的指针时,就可以将指针转换成整数值,得到以后,再将整数值转换成指针,进行对应的操作。

#include <iostream>
#include <cstdio>
#include <string>
#include <typeinfo> using namespace std; class base{
public:
virtual void funcA(){
cout<<"base"<<endl;
}
}; class derived: public base{
public:
virtual void funcB(){
cout<<"derived"<<endl;
}
}; void funcC(base *p)
{
//dynamic_cast会检查p里面是否真存有派生类derived类型的指针,如果存在那么返回该类型的指针,否则返回NULL
derived* dp = dynamic_cast<derived*>(p);
if(dp){
dp -> funcB();
}else{
p -> funcA();
}
} void funcD(base *p)
{
derived *dp = NULL;
if(typeid(*p) == typeid(derived)){
dp = static_cast<derived*>(p);
dp -> funcB();
}else{
p -> funcA();
}
} int main()
{
base *cp = new derived();
cout<<typeid(cp).name()<<endl;//base
cout<<typeid(*cp).name()<<endl;//derived
funcD(cp);//derived
funcC(cp);//derived
base *dp = new base();
funcC(dp);//base
funcD(dp);//base
return ;
}

最新文章

  1. python学习笔记4-正则表达式
  2. 通过js获取cookie的实例及简单分析
  3. WPF自定义窗口基类
  4. 《C++ primer》--第9章
  5. MySQL EER反向建表
  6. .NET中 类型,对象,线程栈,托管堆在运行时的关系
  7. 2016-12-30 PHP JS
  8. BZOJ3223/洛谷P3391 - 文艺平衡树
  9. Intellij-Idea Maven SSH项目的搭建
  10. 关于dropout的有趣的进化论解释
  11. yolov3和darknet opencv版编译安装及基本测试
  12. python pexpect包的一些用法
  13. 表id关联数据获取至页面,制作下拉框多选进行数据多项获取(字段处理)
  14. cookie工具包
  15. CF 672D Robin Hood(二分答案)
  16. 租酥雨的NOIP2018赛前日记
  17. 【Linux笔记】在后台执行scp,实现服务器间无密码文件拷贝。
  18. NOIP2017 游记
  19. python学习(24) 使用Xpath解析并抓取美女图片
  20. 【javascript】点击复制内容的实现

热门文章

  1. hdu 1754 I Hate It(线段树水题)
  2. Vue2.0如何自定义时间过滤器
  3. pace.js – 网页自动加载进度条插件
  4. noip模拟赛 三角形
  5. JNA调用库文件
  6. - &gt; 并查集+路径压缩(详解)(第一节)
  7. jq页面提示或者页面牵引浏览--页面的指引向导插件
  8. Windows下React Native开发01 -- Android开发环境搭建
  9. 加壳学习笔记(三)-简单的脱壳思路&amp;amp;调试思路
  10. MySQL 登录问题