• C++提供了四个转换运算符


    • const_cast <new_type> (expression)
    • static_cast <new_type> (expression)
    • reinterpret_cast <new_type> (expression)
    • dynamic_cast <new_type> (expression)

    它们有着相同的结构,看起来像是模板方法。这些方法就是提供给开发者用来进行指针和引用的转换的。

    1、const_cast用法

    const_cast是一种C++运算符,主要是用来去除复合类型中const和volatile属性(没有真正去除)。

    变量本身的const属性是不能去除的,要想修改变量的值,一般是去除指针(或引用)的const属性,再进行间接修改。

    用法:const_cast<type>(expression)

    通过const_cast运算符,也只能将const type*转换为type*,将const type&转换为type&。

    也就是说源类型和目标类型除了const属性不同,其他地方完全相同。

    #include<iostream>
    using namespace std;
    void ConstTest1(){
        const int a = 5;
        int *p;
        p = const_cast<int*>(&a);
        (*p)++;
        cout<<a<<endl;
        cout<<*p<<endl;
        
    }
    void ConstTest2(){
        int i;
        cout<<"please input a integer:";
        cin>>i;
        const int a = i;
        int &r = const_cast<int &>(a);
        r++;
        cout<<a<<endl;
    }
    int main(){
        ConstTest1();
        ConstTest2();
        return 0;
    }
    输出:
    5
    6
    若输入7
    则输出8

    解释为什么输出8:

    当常变量为 const int j =i 时,直接输出j时,编译器不能进行优化,也就是不能够直接用i代替j;(r是a的引用,r变,a会变)

    当常变量为const int j =5时,直接输出j时,编译器会进行优化,也就是用文字常量5直接代替j;

      2)  static_cast

    用法:static_cast <typeid> (expression)
    说明:该运算符把expression转换为typeid类型,但没有运行时类型检查来确保转换的安全性。
    用途:
    a) 用于类层次结构中基类和派生类之间指针或者引用的转换。up-casting (把派生类的指针或引用转换成基类的指针或者引用表示)是安全的;down-casting(把基类指针或引用转换成子类的指针或者引用)是不安全的。

    b) 用于基本数据类型之间的转换,如把int转换成char,这种转换的安全性也要由开发人员来保证。

    c) 可以把空指针转换成目标类型的空指针(null pointer)。

    d) 把任何类型的表达式转换成void类型。
    注意: static_cast不能转换掉expression的const、volitale或者__unaligned属性。

    class A
    {
    public:
        virtual void  a()
        {
            cout << 'a' << endl;
        }
    
        virtual void b()
        {
            cout << 'a' << endl;
        }
    
    private:
        int i;
    };
    
    class B:public A
    {
    public:
        virtual void a()
        {
            cout << 'b' << endl;
        }
    };
    
    int main(void)
    {
        A *pa = new A();
        B *pb = static_cast<B*>(pa);
    
    
        B *ppb = new B();
        A *ppa = static_cast<A*>(ppb);
    
        return 0;
    }

     3) reinterpret_cast
    用法:reinterpret_cast <typeid>(expression)
    说明:转换一个指针为其他类型的指针,也允许将一个指针转换为整数类型,反之亦然。这个操作符能够在非相关的类型之间进行转换。操作结果只是简单的从一个指针到别的指针的值的二进制拷贝,在类型之间指向的内容不做任何类型的检查和转换。这是一个强制转换。使用时有很大的风险,慎用之。
    注意:reinterpret _cast不能转换掉expression的const、volitale或者__unaligned属性。

    4)dynamic_cast
    用法:
    dynamic_cast <typeid> (expression)
    说明:该运算符把expression转换成typeid类型的对象。typeid必须是类的指针、类的引用或者void*。如果typeid是类的指针类型,那么expression也必须是指针,如果typeid是一个引用,那么expression也必须是一个引用。一般情况下,dynamic_cast用于具有多态性的类(即有虚函数的类)的类型转换。

    dynamic_cast依赖于RTTI信息,其次,在转换时,dynamic_cast会检查转换的source对象是否真的可以转换成target类型,这种检查不是语法上的,而是真实情况的检查。先看RTTI相关部分,通常,许多编译器都是通过vtable找到对象的RTTI信息的,这也就意味着,如果基类没有虚方法,也就无法判断一个基类指针变量所指对象的真实类型,这时候,dynamic_cast只能用来做安全的转换,例如从派生类指针转换成基类指针。而这种转换其实并不需要dynamic_cast参与。也就是说,dynamic_cast是根据RTTI记载的信息来判断类型转换是否合法的。

    用途:主要用于类层次之间的up-casting和down-casting,还可以用于类之间的交叉转换。在进行down-casting时,dynamic_cast具有类型检查的功能,比static_cast更安全。检测在运行时进行。如果被转换的指针不是一个被请求的有效完整的对象指针,返回值为NULL。当用于多态类型时,它允许任意的隐式类型转换以及相反过程。不过,与static_cast不同,在后一种情况里(注:即隐式转 换的相反过程),dynamic_cast会检查操作是否有效。也就是说,它会检查转换是否会返回一个被请求的有效的完整对象。

    注意:dynamic_cast不能转换掉expression的const、volitale或者__unaligned属性。

  • 相关阅读:
    静态页面设置缓存、动态页面设缓存
    未能加载文件或程序集“WebGrease, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)
    CS0016: 未能写入输出文件“c:WindowsMicrosoft.NETFrameworkv4.0.30319Temporary ASP.NET Files
    asp.net mvc 重定向
    win8 应用商店。 app下载的音乐和视频软件能打开,不能正常播放 解决方法
    JS 阻止事件冒泡
    ASP.NET MVC4空MVC项目添加脚本压缩和合并
    TabHost说明
    colors.xml
    MMU (一)
  • 原文地址:https://www.cnblogs.com/wft1990/p/6697566.html
Copyright © 2020-2023  润新知