zoukankan      html  css  js  c++  java
  • C++之强制类型转换

     C++ Code 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
     
    /*
        名称:C++强制类型转换:static_cast、const_cast 、dynamic_cast、reinterpret_cast
        作者:Michael Joessy 
        日期:2017-06-05
        知识:
        C: 强制类型转换的一般形式为:(类型名)(表达式)
        使用C风格的强制转换可以把想要的任何东西转换成合乎心意的类型。那为什么还需要一个新的C++类型的强制转换呢?
        新类型的强制转换可以提供更好的控制强制转换过程,允许控制各种不同种类的强制转换。
        C++中风格是static_cast<type>(content)。
        C++风格的强制转换其他的好处是,它们能更清晰的表明它们要干什么。
        程序员只要扫一眼这样的代码,就能立即知道一个强制转换的目的。
    */


    #include <iostream>
    using namespace std;



    class A
    {};
    class B:public A
    {};
    class C
    {};

    class D  
    {  
    public:  
        
    int m_iNum;  
        
    virtual void foo()
        {

        }
    };  

    class E:public D  
    {  
    public:  
       
    char* m_szName[100];  
    }; 

    int main(void)
    {

        
    /************************************************************************/
        
    /* static_cast
        /* 用法:static_cast<type-id>(expression) 
        /* static_cast:可以实现C++中内置基本数据类型之间的相互转换。
        /* 如果涉及到类的话,static_cast只能在有相互联系的类型中进行相互转换,不一定包含虚函数。
        /************************************************************************/

        
    double dTest = 10.236;
        
    int nTest = static_cast<int>(dTest);

        A* a = 
    new A;
        B* b;
        C* c;
        b = 
    static_cast<B*>(a);      // 编译不会报错, B类继承A类
        //c = static_cast<B*>(a);    // 编译报错, C类与A类没有任何关系

        
    /************************************************************************/
        
    /* const_cast
        /* 用法:const_cast<type_id> (expression)
        /* const_cast: const_cast操作不能在不同的种类间转换。
        /* 相反,它仅仅把一个它作用的表达式转换成常量。
        /* 它可以使一个本来不是const类型的数据转换成const类型的,或者把const属性去掉。
        /************************************************************************/
        
    const A *pa = new A;                 // const对象    
        A *pb;                                 // 非const对象    
        //pb = pa;                           // 这里将出错,不能将const对象指针赋值给非const对象    
        pb = const_cast<A*>(pa);        // 现在OK了 


        
    /************************************************************************/
        
    /* dynamic_cast
        /* 用法:dynamic_cast<type-id>(expression)
        /* Type-id必须是类的指针、类的引用或者void *;
        /* 如果type-id是类指针类型,那么expression也必须是一个指针,如果type-id是一个引用,那么expression也必须是一个引用。
        /* dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。
        /* dynamic_cast是运行时处理的,运行时要进行类型检查。
        /* 不能用于内置的基本数据类型的强制转换。
        /* dynamic_cast转换如果成功的话返回的是指向类的指针或引用,转换失败的话则会返回NULL。
        /* 使用dynamic_cast进行转换的,基类中一定要有虚函数,否则编译不通过。
        /************************************************************************/

        D* pd = 
    new D;
        E* pe1 = 
    static_cast<E*>(pd);  
        E* pe2 = 
    dynamic_cast<E*>(pd);   // 更安全  

        
    /************************************************************************/
        
    /* reinterpret_cast
        /* 用法:reinpreter_cast<type-id>(expression)
        /* 有着和C风格的强制转换同样的能力。
        /* 它可以转化任何内置的数据类型为其他任何的数据类型,也可以转化任何指针类型为其他的类型。
        /* 它甚至可以转化内置的数据类型为指针,无须考虑类型安全或者常量的情形。不到万不得已绝对不用。
        /* 使用reinterpret_cast 的场合不多,仅在非常必要的情形下,其他类型的强制转换不能满足要求时才使用。
        /************************************************************************/

        
    int nInt = 12;   
        
    double dNum1 = static_cast<double>(nInt);     
        
    double dNum2 = reinterpret_cast<double&>(nInt);  // 不提倡...


        cin.get();
        
    return 0;
    }
  • 相关阅读:
    2021.12.7
    2021.12.13(观察者模式c++)
    2021.12.05(echarts生成mysql表词云)
    2021.12.10(申请加分项)
    2021.12.10(课程总结)
    2021.12.11(Linux,yum错误,There are no enabled repos.)
    12月读书笔记02
    2021.12.12(springboot报ScannerException)
    2021.12.09
    centos国内镜像站
  • 原文地址:https://www.cnblogs.com/MakeView660/p/6943657.html
Copyright © 2011-2022 走看看