zoukankan      html  css  js  c++  java
  • C++强制类型转换操作符 static_cast

    ---恢复内容开始---

    static_cast是一个强制类型转换操作符。强制类型转换,也称为显式转换,C++中强制类型转换操作符有static_cast、dynamic_cast、const_cast、reinterpert_cast四个。

    编译器隐式执行的任何类型转换都可以由static_cast来完成,比如int与float、double与char、enum与int之间的转换等。

    double a = 1.999;
    int b = static_cast<double>(a); //相当于a = b ;

    当编译器隐式执行类型转换时,大多数的编译器都会给出一个警告:

    e:vs 2010 projectsstatic_caststatic_caststatic_cast.cpp(11): warning C4244: “初始化”: 从“double”转换到“int”,可能丢失数据

      使用static_cast可以明确告诉编译器,这种损失精度的转换是在知情的情况下进行的,也可以让阅读程序的其他程序员明确你转换的目的而不是由于疏忽。

      把精度大的类型转换为精度小的类型,static_cast使用位截断进行处理。

    使用static_cast可以找回存放在void*指针中的值。

        double aa = 1.999;
        void * vptr = & aa;
        double * dptr = static_cast<double*>(vptr);
        cout<<*dptr<<endl;//输出1.999

    static_cast也可以用在于基类与派生类指针或引用类型之间的转换然而它不做运行时的检查,不如dynamic_cast安全static_cast仅仅是依靠类型转换语句中提供的信息来进行转换,而dynamic_cast则会遍历整个类继承体系进行类型检查,因此dynamic_cast在执行效率上比static_cast要差一些。现在我们有父类与其派生类如下:

    static_cast是一个强制类型转换操作符。强制类型转换,也称为显式转换,C++中强制类型转换操作符有static_cast、dynamic_cast、const_cast、reinterpert_cast四个。

    编译器隐式执行的任何类型转换都可以由static_cast来完成,比如int与float、double与char、enum与int之间的转换等。

    double a = 1.999;
    int b = static_cast<double>(a); //相当于a = b ;

    当编译器隐式执行类型转换时,大多数的编译器都会给出一个警告:

    e:vs 2010 projectsstatic_caststatic_caststatic_cast.cpp(11): warning C4244: “初始化”: 从“double”转换到“int”,可能丢失数据

      使用static_cast可以明确告诉编译器,这种损失精度的转换是在知情的情况下进行的,也可以让阅读程序的其他程序员明确你转换的目的而不是由于疏忽。

      把精度大的类型转换为精度小的类型,static_cast使用位截断进行处理。

    使用static_cast可以找回存放在void*指针中的值。

        double aa = 1.999;
        void * vptr = & aa;
        double * dptr = static_cast<double*>(vptr);
        cout<<*dptr<<endl;//输出1.999

    static_cast也可以用在于基类与派生类指针或引用类型之间的转换然而它不做运行时的检查,不如dynamic_cast安全static_cast仅仅是依靠类型转换语句中提供的信息来进行转换,而dynamic_cast则会遍历整个类继承体系进行类型检查,因此dynamic_cast在执行效率上比static_cast要差一些。现在我们有父类与其派生类如下:

    class ANIMAL
    {
    public:
        ANIMAL():_type("ANIMAL"){}
        virtual void OutPutname(){cout<<"ANIMAL" << endl;}
    private:
        string _type ;
    };
    class DOG:public ANIMAL
    {
    public:
        DOG():_name("dahuang"),_type("DOG"){}
        void OutPutname(){cout<<_name << endl;}
        void OutPuttype(){cout<<_type << endl;}
    private:
        string _name ;
        string _type ;
    };

    此时我们进行派生类与基类类型指针的转换:注意从下向上的转换是安全的,从上向下的转换不一定安全

    int main()
    {
        //基类指针转为派生类指针,且该基类指针指向基类对象。
        ANIMAL * ani1 = new ANIMAL ;
        DOG * dog1 = static_cast<DOG*>(ani1);
        //基类指针转为派生类指针,且该基类指针指向派生类对象
        ANIMAL * ani3 = new DOG;
        DOG* dog3 = static_cast<DOG*>(ani3);
        dog3->OutPutname(); //正确
    
        //子类指针转为派生类指针
        DOG *dog2= new DOG;
        ANIMAL *ani2 = static_cast<DOG*>(dog2);
        ani2->OutPutname(); //正确,结果输出为大黄
    
        //
        system("pause");
    
    }

    static_cast可以把任何类型的表达式转换成void类型。

    另外,与const_cast相比,static_cast不能把换掉变量的const属性,也包括volitale或者__unaligned属性。

    参考:https://www.cnblogs.com/QG-whz/p/4509710.html

  • 相关阅读:
    博客园
    未释放的已删除文件
    ssh连接缓慢
    剑指 Offer 38. 字符串的排列
    剑指 Offer 37. 序列化二叉树
    剑指 Offer 50. 第一个只出现一次的字符
    剑指 Offer 36. 二叉搜索树与双向链表
    剑指 Offer 35. 复杂链表的复制
    剑指 Offer 34. 二叉树中和为某一值的路径
    剑指 Offer 33. 二叉搜索树的后序遍历序列
  • 原文地址:https://www.cnblogs.com/xiangtingshen/p/10851349.html
Copyright © 2011-2022 走看看