zoukankan      html  css  js  c++  java
  • 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属性。

  • 相关阅读:
    【HTML5 绘图与动画】使用canvas
    【H5新增元素和文档结构】新的全局属性 1. contentEditable 可编辑内容 2. contextmenu 快捷菜单 3. data 自定义属性 4. draggable 可拖动 5. dropzone 拖动数据 6. hidden 隐藏 7. spellcheck 语法检查 8. translate 可翻译
    【H5新增元素和文档结构】完善旧元素 1. a 超链接 2. ol 有序列表 3. dl 定义列表 4. cite 引用文本 5. small 小号字体 6. iframe 浮动框架 7. script 脚本
    【H5新增元素和文档结构】新的语义信息 1. address 2. time 3. figure 跟 figcaption 4. details 和 summary 5. mark 6. progress 7. meter 8. dialog 9.bdi 10. wbr 11. ruby、rt、rp 12. command
    【H5新增元素跟文档结构】新的文档结构 1. article 文章块 2. section 区块 3. nav 导航条 4. aside 辅助栏 5. main 主要区域 6. header 标题栏 7. hgroup 标题组 8. footer 页脚栏
    5_PHP数组_3_数组处理函数及其应用_9_数组集合运算函数
    【华为云技术分享】鲲鹏弹性云服务器GCC交叉编译环境搭建指南
    【华为云技术分享】7 分钟全面了解位运算
    【华为云技术分享】Linux内核编程环境 (1)
    【华为云技术分享】华为云MySQL 8.0正式商用,全新增强版开源利器强势来袭
  • 原文地址:https://www.cnblogs.com/wft1990/p/6697566.html
Copyright © 2011-2022 走看看