• C++四种类型转换


    C++有4种类型转换,reinterpret_cast, static_cast, dynamic_cast 和 const_cast

    reinterpret_cast 

    reinterpret_cast 可以将一个指针转换为任意其它类型的指针或int,或反之亦可。

    可以在互不相关的类之间进行指针转换,它只是简单地将一个指针的二进制数据复制到另一个指针,对指针指向的内容不做任何检查或转换。

    class A {};
    class B {};
    A * a = new A;
    B * b = reinterpret_cast<B*>(a);

    static_cast

    static_cast 可以执行所有能够隐含执行的类型转换,以及它们的反向操作(即使这种方向操作是不允许隐含执行的)。所谓能够隐含执行的类型转换,简单点说就是合法的转换(不合法的转换比如:指向父类对象的父类指针转为子类指针;两个不相关的类的转换等)

    class Base {};
    class Derived: public Base {};
    Base* a = new Base;
    Derived* b = static_cast<Derived*>(a);

      

    dynamic_cast

    dynamic_cast 完全被用来进行指针的操作。它可以用来进行任何可以隐含进行的转换操作以及它们被用于多态类情况下的合法方向操作。

    class Base { virtual void dummy(){}; }; //Base必须有虚函数才能保证多态,编译器会检查Base是否有虚函数
    class Derived : public Base { }; 
    Base* b1 = new Derived; 
    Base* b2 = new Base; 
    Derived* d1 = dynamic_cast<Derived*>(b1); // succeeds (父类指针指向子类对象,该指针可以转为子类指针)
    Derived* d2 = dynamic_cast<Derived*>(b2); // 编译通过!但returns NULL (父类指针指向父类对象,该指针不可转为子类指针)

    const_cast

    设置或取消常量属性

    class A {public:void hello(){}};
    A b;
    const A a = b;    //const 声明时必须初始化
    //a.hello();    //error, because a is a const object
    A *a2 = const_cast<A*>(&a);    //指针
    a2->hello();    //ok
    A& a3 = const_cast<A&>(a);    //常量
    a3.hello();    //ok
  • 相关阅读:
    产品交付物
    Java对redis的基本操作
    SourceTree使用方法
    分享几套bootstrap后台模板【TP5版】
    ThinkPHP5在PHP7以上使用QueryList4, ThinkCMF在PHP5中使用QueryList3教程
    delphi 控件背景透明代码
    delphi 程序嵌入桌面效果的实现
    delphi 半透明窗体类
    delphi 一个关于xml文件导入数据库的问题
    Delphi 自带了 Base64 编解码的单元
  • 原文地址:https://www.cnblogs.com/chenyg32/p/3773703.html
Copyright © 2020-2023  润新知