LiSheng's blog LiSheng's blog
首页
笔记
个人简历
随笔集
GitHub (opens new window)
首页
笔记
个人简历
随笔集
GitHub (opens new window)
  • golang

  • cplus

    • 内存相关

    • 面向对象

    • STL相关

    • 内置数据结构
    • 数据结构示例
    • go和c++对比
    • 关键字

      • static
      • const、volatile、mutable
      • const_cast、dynamic_cast
        • struct、class、union
        • new、delete
        • operator
        • c++20 range
    • leetcode

    • 存储技术

    • 分布式系统

    • 计算机网络

    • Linux操作系统

    • Redis

    • 其他

    • 笔记
    • cplus
    • 关键字
    lisheng
    2024-09-10
    目录

    constcast、dynamiccast

    在C++中,指针类型转换是一种常见操作,用于将一个类型的指针转换为另一种类型的指针。C++提供了四种类型的指针转换方式:static_cast、dynamic_cast、const_cast 和 reinterpret_cast。每种转换方式都有其特定的用途和限制。

    # 1. static_cast

    static_cast 是最常用的类型转换方式,用于在相关类型之间进行转换。它通常用于以下场景:

    • 基类指针和派生类指针之间的转换(必须确保转换是安全的)。
    • 基本数据类型之间的转换。
    class Base {};
    class Derived : public Base {};
    
    Base* basePtr = new Derived();
    Derived* derivedPtr = static_cast<Derived*>(basePtr); // 安全的向下转换
    
    1
    2
    3
    4
    5
    • 基本数据类型之间的转换:
    int a = 10;
    double b = static_cast<double>(a); // int 转 double
    
    1
    2

    注意:static_cast 不会进行运行时检查,因此,如果使用不当,可能会导致未定义行为。

    # 2. dynamic_cast

    dynamic_cast 主要用于在多态(polymorphic)类层次结构中进行安全的向下转换。它会在运行时进行类型检查,确保转换是合法的。

    • 主要用于基类指针转换为派生类指针时,确保转换合法。dynamic_cast 只能用于指向多态类型的指针或引用(即基类必须有虚函数)。
    class Base {
        virtual void func() {}
    };
    
    class Derived : public Base {};
    
    Base* basePtr = new Derived();
    Derived* derivedPtr = dynamic_cast<Derived*>(basePtr); // 安全的向下转换
    
    if (derivedPtr) {
        // 转换成功
    } else {
        // 转换失败
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14

    注意:如果转换失败,dynamic_cast 返回 nullptr。这种转换开销较大,因为它在运行时执行类型检查。

    # 3. const_cast

    const_cast 用于添加或移除 const 或 volatile 修饰符。它通常用于需要修改一个常量对象的场景。

    • 移除 const 修饰符:
    const int a = 10;
    int* p = const_cast<int*>(&a);
    *p = 20; // 修改 a 的值(未定义行为)
    
    1
    2
    3
    • 为非 const 对象添加 const 修饰符:
    int b = 30;
    const int* q = const_cast<const int*>(&b);
    
    1
    2

    注意:使用 const_cast 改变原本被定义为 const 的对象的值是未定义行为,应该谨慎使用。

    # 4. reinterpret_cast

    reinterpret_cast 是最底层的类型转换方式,用于将一种类型的指针转换为完全不相关的另一种类型的指针。它不进行任何类型检查,只是简单地重新解释指针的二进制表示。

    • 将指针转换为另一种不相关类型的指针:
    int* p = new int(10);
    char* c = reinterpret_cast<char*>(p);
    
    1
    2
    • 将指针转换为整数类型,或者将整数类型转换为指针:
    uintptr_t address = reinterpret_cast<uintptr_t>(p);
    int* p2 = reinterpret_cast<int*>(address);
    
    1
    2

    注意:reinterpret_cast 通常只有在特殊情况下才使用,例如与底层系统接口的交互。它的使用可能会破坏类型安全性,带来未定义行为,因此必须非常谨慎。

    # 总结

    • static_cast:用于相关类型之间的安全转换,不进行运行时检查。
    • dynamic_cast:用于多态类型之间的安全转换,具有运行时类型检查。
    • const_cast:用于添加或移除 const 或 volatile 修饰符。
    • reinterpret_cast:用于不相关类型之间的指针转换,最为底层且危险。
    编辑 (opens new window)
    上次更新: 2024/09/13, 11:59:12
    const、volatile、mutable
    struct、class、union

    ← const、volatile、mutable struct、class、union→

    最近更新
    01
    ceph分布式存储-对象存储(RGW)搭建
    10-27
    02
    ceph分布式存储-集群客户端连接
    10-27
    03
    ceph分布式存储-管理crushmap
    10-27
    更多文章>
    Theme by Vdoing
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式