首页 > 其他分享 >reinterpret_cast 和 static_cast 的区别

reinterpret_cast 和 static_cast 的区别

时间:2024-03-28 19:22:22浏览次数:30  
标签:类型转换 转换 reinterpret cast static 类型

安全性:

static_cast 是一个安全的类型转换,它只能转换具有继承关系或密切相关的类型,并且在编译时进行类型检查。

reinterpret_cast 是一个不安全的类型转换,它可以将任何类型的指针转换为任何其他类型的指针,而无需考虑类型安全性。

用途:

static_cast 用于转换具有继承关系或密切相关的类型,例如基类和派生类、整数类型和浮点类等。

reinterpret_cast 用于转换不相关的类型,例如指针类型和整数类型、结构体和联合体等。

使用场景

static_cast

  • 从基类转换为派生类
  • 从派生类转换为基类
  • 从整数类型转换为浮点类型
  • 从浮点类型转换为整数类型
  • 从枚举类型转换为整数类型

reinterpret_cast

  • 将指针类型转换为整数类型
  • 将整数类型转换为指针类型
  • 将结构体转换为联合体
  • 将联合体转换为结构体
  • 将函数指针转换为 void* 类型
  • 将 void* 类型转换为函数指针

示例

static_cast

class Base {
public:
    virtual void print() { std::cout << "Base" << std::endl; }
};

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

int main() {
    Base* base = new Derived();
    Derived* derived = static_cast<Derived*>(base);  // 安全的类型转换
    derived->print();  // 输出:Derived
    return 0;
}

reinterpret_cast

int* ptr = new int(10);
void* voidPtr = reinterpret_cast<void*>(ptr);  // 不安全的类型转换
int* newPtr = reinterpret_cast<int*>(voidPtr);  // 不安全的类型转换
std::cout << *newPtr << std::endl;  // 输出:10

需要注意的是,在使用 reinterpret_cast 时需要格外小心,因为它可能会导致未定义的行为或程序崩溃,如果转换的类型不兼容!

 

标签:类型转换,转换,reinterpret,cast,static,类型
From: https://www.cnblogs.com/gchenghu/p/18102451

相关文章

  • 记一次cast使用问题
    适用范围PostgreSQL问题概述昨天开发请求一个问题,在PostgreSQL数据库中创建了CAST(numericasvarchar),但是在进行模糊查询时,抛出如下错误:ERROR:operatordoesnotexist:integer~~unknownLINE1:select*fromt1whereidlike'%1%';......
  • java中的static关键字
    Java中的static关键字修饰变量static修饰的变量属于类变量,被所有类所创建的对象共享修饰方法this关键字不能在static方法中使用static修饰的方法不能直接使用非static修饰的方法非static修饰的方法可以直接使用static修饰的方法修饰代码块静态的代码块是为了优化程......
  • C语言关键字——static和extern
    大家好,今天和大家分享C语言中的两个关键字以及作⽤域和⽣命周期的有关知识,创作不易,三连支持一下吧!一、作用域和生命周期在了解static和extern之前,我们先了解一下作用域和生命周期。1.作用域作⽤域(scope)是程序设计概念,通常来说,⼀段程序代码中所⽤到的名字并不总是有效(可⽤......
  • C++面向对象整理(9)之类型转换 dynamic_cast、static_cast、const_cast及其安全性
    C++面向对象整理(9)之C++的类型转换dynamic_cast、static_cast、const_cast注:整理一些突然学到的C++知识,随时mark一下例如:忘记的关键字用法,新关键字,新数据结构C++的类型转换C++面向对象整理(9)之C++的类型转换dynamic_cast、static_cast、const_cast一、C++的类型转换......
  • bouncycastle
    把下载的安装包放在%JAVA_HOME%\jre\lib\ext目录下面修改配置文件%JAVA_HOME%\jre\lib\security\java.security,在末尾添加security.provider.11=org.bouncycastle.jce.provider.BouncyCastleProvider;具体如下:导入jar包demo.java点击查看代码importorg.bouncycastle.j......
  • ENSP Demo2 RIP & static & OSPF
    各个路由器配置命令syssysnR1intg0/0/0ipadd10.1.1.130intg0/0/1ipadd192.168.255.230rip1version2net10.0.0.0iproute-static0.0.0.00192.168.255.1syssysnR2intg0/0/0ipadd10.1.1.230intlo1ipadd2.2.2.232rip1version2n......
  • C++ static函数调用问题
    静态成员变量虽然在类中,但它并不是随对象的建立而分配空间的,也不是随对象的撤销而释放(一般的成员在对象建立时会分配空间,在对象撤销时会释放)。静态成员变量是在程序编译时分配空间,而在程序结束时释放空间。静态成员的定义和声明要加个关键static。静态成员可以通过双冒号来使用......
  • C++ static
    1.隐藏(static函数,static变量均可)当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。如果加了static,就会对其它源文件隐藏。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。static可以用作函数和变量的前缀,对于函数来讲,sta......
  • Java中static
    一、被static修饰的成员变量叫做静态变量特点:被该类所有对象共享,不属于对象,属于类,随着类的加载而加载,优先于对象存在调用方式:1.类名调用   2.对象名调用二、被static修饰的成员方法,叫做静态方法特点:多用在测试类和工具类中,JavaBean类中很少会用调用方式:1.类名调用 ......
  • C++ static和const
    const定义的常量在超出其作用域之后其空间会被释放;static定义的静态常量在函数执行后不会释放其存储空间;1.staticstatic表示的是静态的。类的静态成员函数、静态成员变量是和类相关的,而不是和类的具体对象相关的。即使没有具体对象,也能调用类的静态成员函数和成员......