C++的四种强制类型转换

C++的四种强制类型转换,所以C++不是类型安全的。分别为:static_cast , dynamic_cast , const_cast , reinterpret_cast
为什么使用C风格的强制转换可以把想要的任何东西转换成合乎心意的类型。那为什么还需要一个新的C++类型的强制转换呢?
新类型的强制转换可以提供更好的控制强制转换过程,允许控制各种不同种类的强制转换。C++中风格是static_cast<type>(content)。C++风格的强制转换其他的好处是,它们能更清晰的表明它们要干什么。程序员只要扫一眼这样的代码,就能立即知道一个强制转换的目的。
四种转换的区别:

1、static_cast:可以实现C++中内置基本数据类型之间的相互转换。

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. int c=static_cast<int>(7.987);   

如果涉及到类的话,static_cast只能在有相互联系的类型中进行相互转换,不一定包含虚函数。
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. class A   
  2. {};   
  3. class B:public A   
  4. {};   
  5. class C   
  6. {};   
  7.   
  8. int main()   
  9. {   
  10.     A* a=new A;   
  11.     B* b;   
  12.     C* c;   
  13.     b=static_cast<B>(a);  // 编译不会报错, B类继承A类   
  14.     c=static_cast<B>(a);  // 编译报错, C类与A类没有任何关系   
  15.     return 1;   
  16. }  


2、const_cast操作不能在不同的种类间转换。

相反,它仅仅把一个它作用的表达式转换成常量。它可以使一个本来不是const类型的数据转换成const类型的,或者把const属性去掉。

3、reinterpret_cast:  有着和C风格的强制转换同样的能力。它可以转化任何内置的数据类型为其他任何的数据类型,也可以转化任何指针类型为其他的类型。它甚至可以转化内置的数据类型为指针,无须考虑类型安全或者常量的情形。不到万不得已绝对不用。

4、dynamic_cast: 

(1)其他三种都是编译时完成的,dynamic_cast是运行时处理的,运行时要进行类型检查。
(2)不能用于内置的基本数据类型的强制转换。
(3)dynamic_cast转换如果成功的话返回的是指向类的指针或引用,转换失败的话则会返回NULL。
(4)使用dynamic_cast进行转换的,基类中一定要有虚函数,否则编译不通过。
        B中需要检测有虚函数的原因:类中存在虚函数,就说明它有想要让基类指针或引用指向派生类对象的情况,此时转换才有意义。 
        这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表(关于虚函数表的概念,详细可见<Inside c++ object model>)中,
        只有定义了虚函数的类才有虚函数表。
 (5)在类的转换时,在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的。在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。向上转换即为指向子类对象的向下转换,即将父类指针转化子类指针。向下转换的成功与否还与将要转换的类型有关,即要转换的指针指向的对象的实际类型与转换以后的对象类型一定要相同,否则转换失败。
参考例子:
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include<iostream>   
  2. #include<cstring>   
  3. using namespace std;   
  4. class A   
  5. {   
  6.    public:   
  7.    virtual void f()   
  8.    {   
  9.        cout<<"hello"<<endl;   
  10.        };   
  11. };   
  12.   
  13. class B:public A   
  14. {   
  15.     public:   
  16.     void f()   
  17.     {   
  18.         cout<<"hello2"<<endl;   
  19.         };   
  20.   
  21. };   
  22.   
  23. class C   
  24. {   
  25.   void pp()   
  26.   {   
  27.       return;   
  28.   }   
  29. };   
  30.   
  31. int fun()   
  32. {   
  33.     return 1;   
  34. }   
  35. int main()   
  36. {   
  37.     A* a1=new B;//a1是A类型的指针指向一个B类型的对象   
  38.     A* a2=new A;//a2是A类型的指针指向一个A类型的对象   
  39.     B* b;   
  40.     C* c;   
  41.     b=dynamic_cast<B*>(a1);//结果为not null,向下转换成功,a1之前指向的就是B类型的对象,所以可以转换成B类型的指针。   
  42.     if(b==NULL)   
  43.     {   
  44.         cout<<"null"<<endl;   
  45.     }   
  46.     else  
  47.     {   
  48.         cout<<"not null"<<endl;   
  49.     }   
  50.     b=dynamic_cast<B*>(a2);//结果为null,向下转换失败   
  51.     if(b==NULL)   
  52.     {   
  53.         cout<<"null"<<endl;   
  54.     }   
  55.     else  
  56.     {   
  57.         cout<<"not null"<<endl;   
  58.     }   
  59.     c=dynamic_cast<C*>(a);//结果为null,向下转换失败   
  60.     if(c==NULL)   
  61.     {   
  62.         cout<<"null"<<endl;   
  63.     }   
  64.     else  
  65.     {   
  66.         cout<<"not null"<<endl;   
  67.     }   
  68.     delete(a);   
  69.     return 0;   
  70. }  
  71.   
  72. 详细出处参考:http://www.jb51.net/article/36914.htm  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值