C++类型转换

 

种类

graph LR;
    X(类型转换)
    X-->S(static_cast)-->S1(用于基本类型之间转换和安全指针转换)
    X-->D(dynamic_cast)-->D1(用于多态类型安全转换, 支持运行时类型检查)
    X-->C(const_cast)-->C1(用于修改常量性)
    X-->R(reinterpret_cast)-->R1(用于指针和整型之间低级转换,不进行安全检查)

static_cast

用于基本数据类型、指针和引用之间显式转换, 适用于非多态类型转换, 其在编译时检查类型安全性

类型转换

int a = 10;

// int转为double
double b = static_cast<double>(a); 

多态类型转换

  • 示例, 将父类指针转换为子类指针
#include <iostream>

class Base {};

class Derived : public Base {
public:
    void Show() {
        std::cout << "Derived called" << std::endl;
    }
};

int main() {
    Base* base = new Base();
    // 向下转换
    Derived* derived = static_cast<Derived*>(base);
    derived->Show();
    delete derived;
    return 0;
} 

dynamic_cast

用于进行安全多态类型转换, 主要在有虚函数类之间使用, 其在运行时检查类型

若转换不成功, 对于指针类型返回nullptr, 对于引用类型抛出异常

#include <iostream>

class Base {
public:
    virtual void DoFunc() {}
};

class Derived : public Base {};

int main() {
    Base* base = new Derived();
    // 安全地向下转换
    Derived* derived = dynamic_cast<Derived*>(base); 
    if (derived) {
        // 转换成功
    } else {
        // 转换失败
    }

    return 0;
}

const_cast

用于修改对象常量性, 可添加或去除对象const或volatile属性

#include <iostream>

int main() {
    const int x = 5;
    // 去掉const修饰符
    int* y = const_cast<int*>(&x); 
    // 若x原本是常量, 修改它会导致未定义行为
    *y = 10;
    return 0; 
}

reinterpret_cast

用于在指针类型之间进行低级别强制转换, 例如将一个类型指针转换为另一个不相关类型指针, 此转换不进行类型安全检查