C++类型转换

static_cast(编译阶段)

  • 用于类型相关的指针之间相互转换
  • 用于基本类型的数据之间进行类型转换
#include <iostream>

class Base
{
public:
    int a;
};

class Derived : public Base
{
public:
    int b;
};

int main()
{
    Derived *p1 = new Derived();
    Base *p2 = static_cast<Base*>(p1);

    Base *p3 = new Base();
    Derived *p4 = static_cast<Derived*>(p3);

    int aa = 10;
    double bb = static_cast<double>(aa);

    double cc = 3.14f;
    int dd = static_cast<int>(cc);
}

dynamic_cast(运行阶段)

  • 运行阶段执行类型检查
#include <iostream>

using namespace std;

class Fish
{
public:
    virtual void swim()
    {
        cout << "Fish swim in water" << endl;
    }

    virtual ~Fish()
    {}
};

class Tuna : public Fish
{
public:
    void swim()
    {
        cout << "tuna swims real fast in the sea" << endl;
    }
};

class Carp : public Fish
{
public:
    void swim()
    {
        cout << "carp swims real slow in the lake" << endl;
    }
};

void DetectFishType(Fish *fish)
{
    Tuna* p1 = dynamic_cast<Tuna *>(fish);
    if (p1)
        p1->swim();

    Carp* p2 = dynamic_cast<Carp *>(fish);
    if (p2)
        p2->swim();
}

int main()
{
    Tuna tuna;
    Carp carp;

    DetectFishType(&tuna);
    DetectFishType(&carp);
}

reinterpret_cast

  • 能够让程序员能够将一种对象类型转换为另一种


应尽量避免在应用程序中使用reinterpret_cast,因为它让编译器将类型X视为不相关的类型Y,这看起来不像是优秀的设计或实现。


const_cast

  • 让程序员能够关闭对象的访问修饰符const
    使用场景:拿到一个const引用的对象,通过这个对象操作非const的成员函数,编译器会报错,为了解决这个错误,需要使用到const_cast解除对象的const访问修饰符
#include <iostream>

using namespace std;

class A
{
public:
    void print()
    {
        cout << "A print" << endl;
    }
};

void printAllData(const A& a)
{
    A& ra = const_cast<A&>(a);

    ra.print();
}

int main()
{
    A a;

    printAllData(a);

    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • C++类型转换总结 本章内容:1 前言2 static_cast3 dynamic_cast4 const_cas...
    Haley_2013阅读 968评论 0 50
  • 隐式类型转换: C++的隐式转换发生在以下四种情况: 在混合类型的算术表达式中。 在表达式赋值中。 表达式传给函数...
    CapJon阅读 662评论 1 2
  • 这篇介绍C++的4种类型转换 dynamic_cast, static_cast, reinterpret_cas...
    CodingCode阅读 505评论 0 0
  • static_cast 用于类层次结构中,基类和子类之间指针和引用的转换。进行上行转换,也就是把子类的指针或引用转...
    第八区阅读 501评论 0 0
  • 这样懂庄子的人,还有民国诗人闻一多。闻一多说庄子的人生:“庄子只管穷困了一生,寂寞了一生”。对于庄子的贫穷,他说:...
    香蕉芒果阅读 296评论 0 0