• C++ 四大强制类型转换


    在C++中,有四种强制类型转换方式,它们分别是:静态转换(static_cast)、const_cast、动态转换(dynamic_cast)、重新解释转换(reinterpret_cast)。

    静态转换(static_cast):

    用于非多态类型之间的转换。在进行静态转换时,编译器会在编译时检查转换的合法性,因此在使用时要确保转换是安全的。
    静态转换通常用于基本类型之间的转换,例如将整数转换为浮点数,或者在类之间进行显式的转换。

    整数转换为浮点数:
    int intValue = 10;
    double doubleValue = static_cast(intValue);
    
    类之间进行显式的转换:
    #include 
    class Base {
    public:
        virtual ~Base() {} // 基类析构函数需要为虚函数,以便正确销毁派生类对象
        virtual void print() const {
            std::cout << "Base" << std::endl;
        }
    };
    
    class Derived : public Base {
    public:
        void print() const override {
            std::cout << "Derived" << std::endl;
        }
    };
    
    int main() {
        Base base;
        Derived derived;
    
        // 在基类指针和派生类指针之间进行静态转换
        Base* basePtr = &base;
        Derived* derivedPtr = static_cast(basePtr);
    
        // 执行转换后,调用派生类的成员函数
        derivedPtr->print(); // 输出 "Derived"
    
        return 0;
    }
    
    

    const_cast

    用于添加或删除 const 和 volatile 修饰符。
    这种转换通常用于修复传入的函数参数的 const 修饰符,或者在需要时去除 const 修饰符以修改变量。

    #include 
    
    void modifyValue(int* ptr) {
        *ptr = 20;
    }
    
    int main() {
        const int constValue = 10;
    
        // 尝试修改 const 变量会导致编译错误
        // constValue = 20;
    
        // 使用 const_cast 去除 const 修饰符以修改变量
        int* nonConstPtr = const_cast(&constValue);
        modifyValue(nonConstPtr);
    
        // 输出修改后的值
        std::cout << "Modified constValue: " << constValue << std::endl;
    
        return 0;
    }
    
    运行结果:
    Modified constValue: 20
    
    

    动态转换(dynamic_cast):

    用于在继承关系中进行安全的向下转型(派生类向基类)和向上转型(基类向派生类)。
    动态转换会在运行时进行类型检查,如果转换是不安全的,则返回空指针(对于指针类型)或抛出std::bad_cast异常(对于引用类型)。

    Base* basePtr = new Derived();
    Derived* derivedPtr = dynamic_cast(basePtr);
    if (derivedPtr) {
        // 转换成功
    } else {
        // 转换失败
    }
    
    

    重新解释转换(reinterpret_cast):

    提供了最不安全的类型转换,允许在不同类型之间进行任意位模式的转换。
    这种转换通常用于将指针转换为整数类型或者将整数类型转换为指针类型,但使用时要特别小心,因为它会绕过类型系统的检查。

    int intValue = 10;
    double* doublePtr = reinterpret_cast(&intValue);
    
    

    C++中的这四大强制类型转换的函数,我们一般代码中前两个是用的比较多的,使用比较熟悉,后两个大家可以根据自身情况按需使用。

  • 相关阅读:
    cpolar+LightPicture,将个人电脑改造成公网图床服务器
    C++哈希+哈希改造
    【Java基础面试十四】、 封装的目的是什么,为什么要有封装?
    设计模式之命令模式
    OKR 及其对员工的重要性
    CSDN编程竞赛-第六期(下)
    安卓数据恢复工具哪个强? 10 个最佳 Android 数据恢复应用程序
    [Cmake Qt]找不到文件ui_xx.h的问题?有关Qt工程的问题,看这篇文章就行了。
    如何使用idea来查找所有未使用的代码?
    【Python】数据科学之多维数组对象笔记(一)
  • 原文地址:https://blog.csdn.net/cl122763974/article/details/139397402