• Effective C++ 条款27


    尽量少做转型动作

    尽量少做转型动作有什么目的?非常明显无非就是提高程序的稳定性。提高程序的运行效率。
    那么。有哪些转型方式?每种方式都有什么弱点? 这是我们本节学习的重点。


    C++有四种转型:

    const_cast<T>(expression)
    dynamic_cast<T>(expression)
    reinterpret_cast<T>(expression)
    static_cast<T>(expression)

    每种转型的作用例如以下:
    1.const_cast通常被用来将对象的常量特性转除(cast away the constness)。它也是唯一由此能力的C++-style转型操作符。
    2.dynamic_cast主要用来运行“安全向下转型”(safe downcasting),也就是用来决定某对象是否归属继承体系中的某个类型。

    它是唯一无法由旧式语法运行的动作。也是唯一可能耗费重大运行成本的转型动作(后面细讲)。
    3.reinterpret_cast意图运行低级转型。实际动作(结果)可能 取决于编译器,这表明其不可移植。比如将pointer to int转为int,这类转型经常使用在低级代码。

    比如。讨论讨论怎样针对原始内存(raw memory)写一个调试用的分配器(debugging allocator),见条款50.
    4.static_cast运行强迫隐式转换(implicit conversions)。比如将int转为double,non-const转为constant等。

    它也能够用来运行一些转换的反响转换。但无法将const转为non-const。

    我来总结一下以上的四点。
    首先对于const_cast是起到一个去除const特性的作用。
    去掉const属性:const_case

    class Window{
    public:
        virtual void onResize(){……};
        ……
    };
    class specialWindow:public Window{
    public:
        virtual void onResize(){
            static_cast<Window>(*this).onResize();//调用的是副本。

    …… } };

    上面代码的运行结果是基类中的数据没有变化,derived类中的数据发生变化。这是由于static_cast<Window>(*this).onResize();这句调用的是基类的副本,和当前对象无关。

    作者非常强调这部分内容。但是,大家不要变傻。我们细致看一下代码,他转型的本来就是一个副本!仅仅需修改一点点就能实现一致性。

    例如以下

    class Window{
    public:
        virtual void onResize(){……};
        ……
    };
    class specialWindow:public Window{
    public:
        virtual void onResize(){
            static_cast<Window*>(this).onResize();//ok
            ……
        }
    };
  • 相关阅读:
    opendressinghash //use resize array
    ChainingHash
    Hash function
    stack && queue
    random_select
    counting sort
    master theorem
    各排序算法及其比较
    视图中添加主键的方法
    oracle表空间的扩展
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/6700784.html
Copyright © 2020-2023  润新知