美文网首页
[C++进阶]最好使用C++转型操作符

[C++进阶]最好使用C++转型操作符

作者: 小鱼号的代码日记 | 来源:发表于2020-04-19 22:01 被阅读0次

    static_cast 基本上拥有与C旧式转型相同的威力与意义,以及相同的限制。不能够移除表达式的常量性(constness)

    const_cast用来改变表达式中的常量性(constness)或易变性(volatileness)

    const_cast 最常见的用途就是将某个对象的常量性去除掉

    dynamic_cast 将"指向base class objects的pointers或references"转型为"指向dervied(或sibing base)class objects的pointers或references”,并得知转型是否成功。如果转型失败,会以一个null指针(当转型对象是指针)或一个exception(当转型对象是references)表现出来。

    Reinterpret_cast的最常用用途是转换“函数指针”类型,平台相关不具移植性,尽量避免使用。

    /***************************
     more effectivre c++
     35个改善编程与设计的有效方法
     条款1:最好使用C++转型操作符
     ---------小鱼号的代码日记--------------
    ****************************/
    
    
    /*****************************************
    Static_cast 基本上拥有与C旧式转型相同的威力与意义,以及相同的限制。
    不能够移除表达式的常量性(constness)
    
    Const_cast用来改变表达式中的常量性(constness)或易变性(volatileness)
    const_cast 最常见的用途就是将某个对象的常量性去除掉
    
    dynamic_cast 将"指向base class objects的pointers或references"转型为
    "指向dervied(或sibing base)class objects的pointers或references”,
    并得知转型是否成功。如果转型失败,会以一个null指针(当转型对象是指针)
    或一个exception(当转型对象是references)表现出来。
    
    Reinterpret_cast的最常用用途是转换“函数指针”类型
    平台相关不具移植性,尽量避免使用。
    *******************************************/
    
    #include<iostream>
    #include<vector>
    using namespace std;
    
    class Widget{
    public:
        virtual ~Widget(){}
    };
    class SpecialWidget:public Widget{
    public:
        virtual ~SpecialWidget(){}
    };
    void update(SpecialWidget *psw){}
    void updateViaRef(SpecialWidget &rsw){}
    int doSomething(){}
    int main()
    {
       SpecialWidget sw;              //sw是一个non_const对象
       const SpecialWidget& csw = sw; //csw却是一个代表sw的reference,
                                      //并视为一个const对象
       ///update(&csw);               //错误!不能将const SpecialWidget*
                                      ///传给一个需要SpecialWidget*的函数。
       update(const_cast<SpecialWidget*>(&csw)); //可 &csw的常量性被去除了。也因此
                                                 //csw(亦即sw)在此函数中可能被更改
    
       update((SpecialWidget*)(&csw)); //情况同上,但是使用的是较难辨识的
                                       //C旧式转型语法
    
       Widget *pw = new SpecialWidget;
       ///update(pw);                     //错误!pw的类型是Widget* 但
                                         //update()需要的却是SpceicalWidget*
    
       ///update(const_cast<SpecialWidget*>(pw));//错误!const_cast只能用来影响
                                                 //常量性或易变性,无法进行继承体系的
                                                 //向下(cast down)动作
       ///const_cast 最常见的用途就是将某个对象的常量性去除掉
    
       update(dynamic_cast<SpecialWidget*>(pw));//很好,传给update()一个指针,指向pw
                                                //所指的SpecialWidget
                                                //如果pw真的指向这样的东西;否则传过去
                                                //的将是一个null指针
       updateViaRef(dynamic_cast<SpecialWidget&>(*pw));//很好,传给updateViaRef()的是pw
                                                //所指的SpecialWidget
                                                //如果pw真的指向这样的东西;否则传过去
                                                //抛出一个exception。
       ///dynamic_cast 只能协助你巡航于继承体系中。它无法应用在缺乏虚函数的类型身上
       /// 也不能改变类型的常量性
    
       int firstNumber,seconeNumber;
       ///double result = dynamic_cast<double>(firstNumber)/seconeNumber;
                                                 // 错误!未涉及继承机制
       {
       const SpecialWidget sw;
       ///update(dynamic_cast<SpecialWidget*>(&sw));
                                                //错误! dynamic_cast不能改变常量性
       }
    
       typedef void (*FuncPtr)();     //FuncPtr是个指针,指向某个函数。
                                      //后者无须任何自变量,返回值为void
       FuncPtr funcPtrArray[10];      //funcPtrArray是个数组 内有10个FuncPtrs
    
    
       ///funcPtrArray[0] = doSomething;
                                    //错误!类型不符
    
       funcPtrArray[0] = reinterpret_cast<FuncPtr>(&doSomething); //可以编译通过
    
       ///Reinterpret_cast的最常用用途是转换“函数指针”类型
       ///平台相关不具移植性,尽量避免使用。
       return 0;
    }
    

    内容选自:
    more effectivre c++
    35个改善编程与设计的有效方法

    相关文章

      网友评论

          本文标题:[C++进阶]最好使用C++转型操作符

          本文链接:https://www.haomeiwen.com/subject/hycwbhtx.html