zoukankan      html  css  js  c++  java
  • c++中4个与类型转换相关的关键字分析

    static_cast  

    reinterpret_cast

    dynamic_cast

    const_cast

    1.**static_cast------运算符完成相关类型之间的转换**

    使用场景:如在同一类层次结构中的一个指针类型到另一个指针类型,整型到枚举类型,或者浮点型到整型等。

    例:  1,  int m=10;

         double n=static_cast < int > m;

        2, int * q=static_cast < int* >(malloc(100));

    2.**reinterpret_cast------处理互不相关类型之间的转换**

    使用场景:如从整型到指针,一种类型的指针到另一种类型的指针等

    例: int a=10;

       double* b=reinterpret_cast<double*>(a); //b的转换结果为0x0000000a

    3.**dynamic_cast------处理基类型到派生类型的转换**(这个说法不是很准确,为了好理解先这么写)

    使用场景:基类必须有虚函数,即为多态时,可以转换

    例: 

    class Base
    
    {
    
    public:
    
       virtual int test(){return 0;} //基类中存在虚函数,故在派生类中存在虚函数指针指向虚函数表。
    
    };
    
    class Derived:public Base
    
    {
    
    public:
    
       virtual int test(){return 1;}
    
    };
    
    int main()
    
    {
    
    Base cbase;
    
    Derived cderived;
    
    Base *p1=new Base;
    
    Base *p2=new Derived;
    
    Derived* pD1=dynamic_cast<Derived*>(p1);//p1没有真正指向派生类,pD1置为0
    
    Derived* pD2=dynamic_cast<Derived*>(p2); //正确
    
    //Derived& pd1=dynamic_cast<Derived&>(*p1);//p1没有真正指向派生类,pd1抛出异常
    
    Derived& pd2=dynamic_cast<Derived&>(*p2);//正确
    
    return 0;
    
    }

     4,const_cast用来移除变量的const或volatile限定符。

    一句话:强制去掉const(或volatile)  必须使用const_cast 。

    注:
    volatile的作用是: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值.
    简单地说就是防止编译器对代码进行优化.比如如下代码:
    a=1;
    a=2;
    a=3;
    a=4;
    对外部硬件而言,上述四条语句分别表示不同的操作,会产生四种不同的动作,但是编译器却会对上述四条语句进行优化,认为只有a=4(即忽略前三条语句,只产生一条机器代码)。如果键入volatile,则编译器会逐一的进行编译并产生相应的机器代码(产生四条代码).
  • 相关阅读:
    Beyond Compare 4 使用30天后过期续用方法
    cookie和Session是啥?
    如何添加博客园访问次数统计
    获取DataFrame列名的3种方法
    GET与POST方法和用curl命令执行
    Series拼接回DataFrame
    pandas.to_json&to_dict&from_json&from_dict解读
    Mysql判断是否某个字符串在某字符串字段的4种方法
    alias 命令
    python中的pyc和pyo文件和__pyc__文件夹
  • 原文地址:https://www.cnblogs.com/junlinfeizixiao/p/6193412.html
Copyright © 2011-2022 走看看