• c++四种强制类型转换


    四个关键字static_castdynamic_castconst_castreinterpret_cast是C++中的类型转换运算符。它们都用于在不同类型之间进行类型转换,但每个关键字有其特定的用途和限制。

    1. static_cast

    • 用于基本数据类型之间的转换,如int到double的转换。
    • 用于隐式类型转换,如派生类指针到基类指针的转换。
    • 不能用于没有相互关联的类之间的转换。
    • 编译时进行类型检查,不会进行运行时检查。

    例如,将一个整数转换为浮点数的例子如下:

    int num = 10;
    double result = static_cast<double>(num);
    
    • 1
    • 2
    int *intPtr;
    double *doublePtr;
    
    double value = 3.14159;
    doublePtr = &value;
    
    // 使用 static_cast 将 double 指针转换为 int 指针
    intPtr = static_cast<int*>(static_cast<void*>(doublePtr));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在你的示例中,将double指针转换为int指针确实需要两次转换即首先将double指针转换为void指针,然后将void指针转换为int指针。这是因为C++要求你在进行这样的指针类型转换时,必须通过中间的void指针来避免直接将不相关的指针类型进行转换。这是为了确保类型安全性和避免未定义行为。
    所以,在你的代码中,两次转换是必要的:

    1.第一次转换:doublePtr转换为void*。
    2.第二次转换:void转换为int

    这种方式可以确保类型转换遵守C++的类型安全规则,避免出现潜在的错误或未定义行为。虽然看起来有点冗长,但这是一种安全的做法。

    2. dynamic_cast

    • 用于在继承关系中进行类型转换,用于在运行时检查指针或引用的类型安全性。
    • 只能用于具有虚函数的类类型之间的转换。
    • 如果转换失败,返回空指针(对于指针)或抛出bad_cast异常(对于引用)。
    • 比较耗时,运行时检查类型信息。

    当需要在继承关系中进行类型转换时,可以使用dynamic_cast。例如,有一个基类Shape和派生类Rectangle,我们可以将一个指向基类对象的指针转换为指向派生类对象的指针:

    class Shape 
    {
    public:
        virtual void print() 
        {
            cout << "Shape" << endl;
        }
    };
    
    class Rectangle : public Shape 
    {
    public:
        void print() override 
        {
            cout << "Rectangle" << endl;
        }
    };
    
    Shape* shape = new Rectangle();
    Rectangle* rect = dynamic_cast<Rectangle*>(shape);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    3. const_cast

    • 用于添加或删除const、volatile修饰符。
    • 仅用于指针或引用类型。
    • 用于去除指针或引用的const性质,可以修改被指向的对象的值
    • 进行不安全的转换,应慎用。

    当需要修改指针或引用的const性质时,可以使用const_cast。例如,将一个常量指针转换为非常量指针的例子如下:

    移除 const 修饰符:

    const int num = 10;
    int* ptr = const_cast<int*>(&num);
    *ptr = 20; // 修改了const修饰的变量,潜在的不安全操作
    
    • 1
    • 2
    • 3

    4. reinterpret_cast

    • 用于将一个指针转换为另一个类型的指针,也可以将一个整数类型转换为一个指针或指针转换成整数类型。
    • 不能用于不相关的类型之间的转换。
    • 进行非常底层的类型转换,无需类型之间有任何关联
    • 风险较大,可能导致未定义的行为,应慎用。

    当需要进行底层的类型转换时,可以使用reinterpret_cast。例如,将一个整数转换为指针的例子如下:

    int num = 10;
    int* ptr = reinterpret_cast<int*>(num);
    
    • 1
    • 2

    需要注意的是,在程序中合理使用类型转换运算符也是很重要的,尽可能避免潜在的错误和不安全的操作。

  • 相关阅读:
    `算法题解` `AcWing` 4508. 移动的点
    基于嵌入式的密码访问的门锁系统
    线上数据监测,可以监测哪些平台
    云计算平台建设总体技术方案参考
    C++信息学奥赛1168:大整数加法
    【故障公告】没有龙卷风,k8s集群翻船3次,投用双集群恢复
    详解Istio服务治理技术及环境搭建
    【学习笔记】CF559E Gerald and Path
    【神印王座】易军献身为林鑫挡箭,万万没想到林鑫太坑,大跌眼镜
    Django后台忘记管理员的账号
  • 原文地址:https://blog.csdn.net/mankeywang/article/details/134304379