zoukankan      html  css  js  c++  java
  • C/C++学习之static_cast和dynamic_cast、reinterpret_cast

    原文链接:http://www.cppblog.com/newcnzz/archive/2012/09/29/192428.html

    C++提供了四个转换运算符:
    const_cast <new_type> (expression)
    static_cast <new_type> (expression)
    reinterpret_cast <new_type> (expression)
    dynamic_cast <new_type> (expression)
     
     
    dynamic_cast:   通常在基类和派生类之间转换时使用;  
    static_cast:   一般的转换,如果你不知道该用哪个,就用这个。   
    reinterpret_cast:   用于进行没有任何关联之间的转换,比如一个字符指针转换为一个整形数。
     
     
    static_cast在编译时期强制转换,dynamic_cast在运行时期转换(较安全) ,reinterpret_cast主要是将数据从一种类型的转换为另一种类型。
    static_cast是c语言的强制转换代替品,dynamic_cast可以帮助你实现虚函数的功能!reinterpret_cast它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针!
     
    static_cast和dynamic_cast是c++中的rtti的两个操作符。  
    其中static_cast是相当于c的强制类型转换,用起来可能有一点危险。
    dynamic_cast如果转换成引用出错的话,就会出现异常,
     
    这里需要做一个异常处理的机制。转换指针出错返回null。  
    dynamic_cast可以转换指针和和引用(基类到派生类),不能用来转换对象."安全的向下转换",它通过c++的dynamic_cast运算符来实现。
     
    当对一个指针使用dynamic_cast时,先尝试转换,如果成功,就返回新类型的合法指针;如果dynamic_cast失败,返回空指针!
     
    //运行如下程序
    [cpp] view plaincopy
    #include <iostream>  
    using namespace std;  
    class A  
    {  
       public:  virtual void show()  
        {  
         std::cout<<"A::show()"<<endl;  
        }  
    };  
    class  B : public A   
    {  
       public: virtual void show()  
       {   
        std::cout<<"B::show()"<<endl;  
        }  
    };  
      
    int main()  
    {  
       A *pa=new A();  
       B *pb=new B();  
       cout<<"-------- 1 ----------"<<endl;  
       static_cast<A *>(pb)->show(); //print:"B::show()"  
       cout<<"-------- 2 ----------"<<endl;  
       dynamic_cast<A *>(pb)->show();//also print:"B::show()"  
       cout<<"-------- 3 ----------"<<endl;  
       static_cast<B *>(pa)->show(); //print:"A::show()"   
       cout<<"-------- 4 ----------"<<endl;  
       //dynamic_cast<B *>(pa)->show(); //此处会出现异常  
       if((pb = dynamic_cast<B*>(pa)))  
         {  
            pb->show();  
         }else  
         {  
           cout << "dynamic cast fail" << endl;  
        }  
    }  
     
    输出为:
    -------- 1 ----------
    B::show()
    -------- 2 ----------
    B::show()
    -------- 3 ----------
    A::show()
    -------- 4 ----------
    dynamic cast fail
     
    记住:如果使用VC编译的话,一定要选择上RTTI支持,否则运行时会出异常的。
    static_cast并不允许两个完全不相干的类互相转换.
    注意:static_cast不能转换掉expression的const、volatile、或者__unaligned属性。
    reinterpret_cast是为了映射到一个完全不同类型的意思,这个关键词在我们需要把类型映射回原有类型时用到它。我们映射到的类型仅仅是为了故弄玄虚和其他目的,这是所有映射中最危险的。
    reinterpret_cast用在任意指针(或引用)类型之间的转换;以及指针与足够大的整数类型之间的转换;从整数类型(包括枚举类型)到指针类型,无视大小。
     
    OK下面看一个static_cast和reinterpret_cast的实例:
    [cpp] view plaincopy
    int i;  
    char s = 'a';  
    i = static_cast<int>(s);  
    cout << i << endl;  
      
    char *ss = "ssss";  
    i = reinterpret_cast<int>(ss);  
    cout << i << endl;  
  • 相关阅读:
    树线段hdu 4508 美素数(线段树)
    自定义context自定义Dialog之Progress(二)
    实现语言C语言简单实现五子棋
    调用博客paip.基于HTML gui界面的javascript JS实现SLEEP。。
    水印控件windows phone中,制作一个自定义的密码输入框控件,含图片,有水印,星号显示
    请求网络网络编程
    调试网页PAIP HTML的调试与分析工具
    输出流输入输入输出流
    标记协议http协议与XML书写规范及解析技术
    描述算法10673 Play with Floor and Ceil
  • 原文地址:https://www.cnblogs.com/wangkangluo1/p/2713513.html
Copyright © 2011-2022 走看看