zoukankan      html  css  js  c++  java
  • C++的四种cast(显示类型转换)

    旧式的类型转换中有俩种(Effect C++)

    //C风格
    (T)expression

    (int)a//比如这样子
    //函数风格 T(expression)

    doSomeWork(Widget(15)) 这里15作为一个参数给类Widget,会以转型动作创建一个Widget

    而C++提供了四种新式转换。

    (1)const_cast:通常用来把对象的常量性一处掉,是唯一有此能力的C++ style转型操作符。

    (2)dynamic_cast:用来指向安全向下转型

    是这样的,比如有一个base类,有很多派生类,在这个继承体系里,可以用来决定对象是否归属于继承体系中的某个类型(向下的,也就是从基类指针转变到某个派生类指针)

    这是唯一一个无法通过旧式语法执行的动作,是唯一可能耗费重大运行成本的转型动作。

    成本非常高昂。

    (3)static_cast:用来强迫隐式转换。

    比如把non-const对象转换为const对象(反过来不行,只有const_cast能做到),或者把int转为double等,还可以把void*指针转为typed指针,把pointer-to-base转为pointer-to-derived。

    (4)reinterpret_cast:意图执行低级转型,效果取决于编译器。

    用于进行各种不同类型的指针之间、不同类型的引用之间以及指针和能容纳指针的整数类型之间的转换。

    这个类型转换会重新去解释内存中存放的数据的类型,比如说我们强行把一个指向int型的指针(在内存中就是一个整数,只不过是用来解释为地址的),去解释为一个int,它可以满足各种类型的转换,但是对结果不做保证。

    #include <iostream>
    using namespace std;
    int main()
    {
        int a = 1;
        int* p1 = &a;
        char* p2 = reinterpret_cast<char*>(p1);
        double* p3 = reinterpret_cast<double*>(p1);
    
        cout << a << "  " << *p2 << "  " << *p3 << endl;
    }

    不管是p1,p2,还是p3,指向的都是同一个地址0x0116FA10,里面存放的是a的值,1。

     ,其他都是一样的。

     输出结果确是按各自指针类型来解释的。

    转型实际上是会产生一些代码的,比如说int和double在内存里表示形式不同,如果我们把int数转型为double,那在内存中存储的数据肯定是会改变的,是做了改变的。

    //还有一个有趣的事情,

    //基类
    class Window{
    publicvirtual void onRize(){...}
      ...
    }
    
    //派生类
    class SpecialWindow:public Window{
    publicvirtual void onResize()
      {
         //转型,试图调用Window的onRize();
        //这是行不通的!
        static_cast<Window>(*this).onResize();
      }
    
      ...//secialWindows专属行为
    }

    这一段程序希望吧*this转型为Window,然后调用Window::onResize。但是实际上,它调用的并不是当前对象上的函数,而是稍早转型动作所建立的一个"*this对象之base class成分”的暂时副本身上的onResize

    函数就是函数,成员函数只有一份,“调用哪个对象身上的函数”有什么关系呢,关键在于成员函数身上都有一个(非静态的)*this指针,会影响到成员函数操作的数据。

    所以实际上!他不是在当前对象身上,调用Window::onResize之后,再执行SecialWindow专属动作,他调用的是哪个临时副本,。如果Window::onResize修改了对象的内容,当前的对象其实没有改动,改动的是副本。而SecialWindow::如果改动对象,就真的会改动。

    为了避免这种情况,最好这样写

    virtual void onResize()
    {
       Window::onResize();//调用Window::onResize作用于*this的指针上
    }

    //-----之后也许需要补充一些dynamic_cast相关的问题。参见cherno的dynamic_cast相关视频

  • 相关阅读:
    回溯算法
    回溯算法
    回溯算法
    回溯算法思想
    贪心算法
    C#多线程操作界面控件的解决方案
    jQuery教程
    html css JavaScript网页渲染
    jQuery与JavaScript与ajax三者的区别与联系
    asp.net MVC中form提交和控制器接受form提交过来的数据
  • 原文地址:https://www.cnblogs.com/EvansPudding/p/12566210.html
Copyright © 2011-2022 走看看