static_cast reinterpret_cast const_cast dynamic_cast

2024-08-21 07:12

本文主要是介绍static_cast reinterpret_cast const_cast dynamic_cast,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在 C++ 中,类型转换是一个常见的操作,特别是在处理不同类型的变量或对象时。C++ 提供了四种主要的类型转换运算符:static_castreinterpret_castconst_castdynamic_cast。每种转换运算符都有其特定的用途和行为。本文将详细介绍这四种类型转换运算符及其用法。


1. static_cast

简介

static_cast 是 C++ 中最常用的类型转换运算符之一,用于执行编译时类型检查的安全转换。它主要用于在相关类型之间转换,比如基类和派生类之间、整数和浮点数之间等。

用法

  • 基本用法:将一种数据类型转换为另一种数据类型,通常用于转换可以安全地进行编译时检查的类型。

  • 例子

     

    int intVal = 10;
    double doubleVal = static_cast<double>(intVal);  // int 转换为 doubleclass Base {};
    class Derived : public Base {};Base* basePtr = new Derived();
    Derived* derivedPtr = static_cast<Derived*>(basePtr);  // 基类指针转换为派生类指针
    

特点

  • 编译时类型检查:static_cast 会在编译时进行类型检查,确保转换的安全性。
  • 不适用于多态转换:如果涉及到虚函数或运行时类型信息的转换,应使用 dynamic_cast

2. reinterpret_cast

简介

reinterpret_cast 是 C++ 中最强大的类型转换运算符,它用于在不进行任何类型检查的情况下,将一种指针或引用转换为另一种指针或引用。通常用于低级操作和特定的类型转换。

用法

  • 基本用法:用于在不同的指针类型之间进行转换,如将 int* 转换为 float*

  • 例子

     

    int* intPtr = new int(10);
    float* floatPtr = reinterpret_cast<float*>(intPtr);  // int* 转换为 float*
    

特点

  • 不进行类型检查:reinterpret_cast 不会对转换进行任何检查,因此可能导致未定义行为。
  • 用于特定情况:主要用于需要直接操作底层内存或系统级编程的场景。

3. const_cast

简介

const_cast 用于修改对象的常量性。它可以去掉或添加 constvolatile 限定符。这个转换运算符通常用于需要在修改了常量数据的情况下工作时。

用法

  • 基本用法:去除或添加 const 限定符。

  • 例子

     

    const int constantValue = 10;
    int* nonConstPtr = const_cast<int*>(&constantValue);  // 去掉 const
    *nonConstPtr = 20;  // 修改原始的常量值(未定义行为)

特点

  • 修改常量性:const_cast 主要用于处理常量性。
  • 可能导致未定义行为:如果尝试修改原本定义为 const 的对象,可能会导致未定义行为。

4. dynamic_cast

简介

dynamic_cast 用于在具有虚函数的类层次结构中进行安全的运行时类型转换。它主要用于将基类指针或引用转换为派生类指针或引用,并在转换失败时返回 nullptr(对于指针)或抛出 std::bad_cast 异常(对于引用)。

用法

  • 基本用法:在运行时检查对象的实际类型。

  • 例子

     
    class Base {
    public:virtual ~Base() {}
    };class Derived : public Base {};Base* basePtr = new Derived();
    Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);  // 安全的运行时转换
    if (derivedPtr) {// 转换成功
    } else {// 转换失败
    }
    

特点

  • 运行时类型检查:dynamic_cast 在运行时进行类型检查,确保转换的安全性。
  • 仅用于有虚函数的类:dynamic_cast 仅适用于有虚函数的类(即具有虚表的类)。

总结

  • static_cast:用于安全的编译时类型转换,适用于相关类型之间的转换。
  • reinterpret_cast:用于低级别的、不进行类型检查的转换,通常用于系统级编程。
  • const_cast:用于修改对象的常量性,添加或去掉 const 或 volatile 限定符。
  • dynamic_cast:用于有虚函数的类之间的安全运行时类型转换,可以检查类型转换是否成功。

这篇关于static_cast reinterpret_cast const_cast dynamic_cast的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1092479

相关文章

SpringBoot利用dynamic-datasource-spring-boot-starter解决多数据源问题

《SpringBoot利用dynamic-datasource-spring-boot-starter解决多数据源问题》dynamic-datasource-spring-boot-starter是一... 目录概要整体架构构想操作步骤创建数据源切换数据源后续问题小结概要自己闲暇时间想实现一个多租户平台,

解读静态资源访问static-locations和static-path-pattern

《解读静态资源访问static-locations和static-path-pattern》本文主要介绍了SpringBoot中静态资源的配置和访问方式,包括静态资源的默认前缀、默认地址、目录结构、访... 目录静态资源访问static-locations和static-path-pattern静态资源配置

C# dynamic类型使用详解

《C#dynamic类型使用详解》C#中的dynamic类型允许在运行时确定对象的类型和成员,跳过编译时类型检查,适用于处理未知类型的对象或与动态语言互操作,dynamic支持动态成员解析、添加和删... 目录简介dynamic 的定义dynamic 的使用动态类型赋值访问成员动态方法调用dynamic 的

native和static native区别

本文基于Hello JNI  如有疑惑,请看之前几篇文章。 native 与 static native java中 public native String helloJni();public native static String helloJniStatic();1212 JNI中 JNIEXPORT jstring JNICALL Java_com_test_g

c++的初始化列表与const成员

初始化列表与const成员 const成员 使用const修饰的类、结构、联合的成员变量,在类对象创建完成前一定要初始化。 不能在构造函数中初始化const成员,因为执行构造函数时,类对象已经创建完成,只有类对象创建完成才能调用成员函数,构造函数虽然特殊但也是成员函数。 在定义const成员时进行初始化,该语法只有在C11语法标准下才支持。 初始化列表 在构造函数小括号后面,主要用于给

论文精读-Supervised Raw Video Denoising with a Benchmark Dataset on Dynamic Scenes

论文精读-Supervised Raw Video Denoising with a Benchmark Dataset on Dynamic Scenes 优势 1、构建了一个用于监督原始视频去噪的基准数据集。为了多次捕捉瞬间,我们手动为对象s创建运动。在高ISO模式下捕获每一时刻的噪声帧,并通过对多个噪声帧进行平均得到相应的干净帧。 2、有效的原始视频去噪网络(RViDeNet),通过探

java基础总结08-面向对象4(static关键字)

原来一个类里面的成员变量,每new一个对象,这个对象就有一份自己的成员变量,因为这些成员变量都不是静态成员变量。对于static成员变量来说,这个成员变量只有一份,而且这一份是这个类所有的对象共享。 静态成员变量与非静态成员变量的区别 以下面的例子为例说明 package cn.galc.test;public class Cat {/*** 静态成员变量*/private static

Flask 创建app 时候传入的 static_folder 和 static_url_path参数理解

Flask 在创建app的时候 是用 app = Flask(__name__) 来创建的,不传入 static_folder参数的话 ,默认的静态文件的位置是在 static目录下 我们可以进入 Flask的源码里面查看 ctrl+鼠标左键进入 这是Flask的 __init__源码(后面还有一些,我就选了需要的代码)     def __init__(self,import_

C#static用法和扩展方法

一.static可用于修饰成员和类 1.1 静态成员 静态成员始终按类名(而不是实例名称)进行访问。 静态成员只有一个副本存在(与创建的类的实例数无关)。 静态方法和属性无法在其包含类型中访问非静态字段和事件,它们无法访问任何对象的实例变量,除非在方法参数中显式传递它。 更典型的做法是声明具有一些静态成员的非静态类(而不是将整个类都声明为静态)。 静态字段的两个常见用途是保留实例化的对象数的

org.hibernate.transaction.JDBCTransaction cannot be cast to javax.transaction.Transaction

org.hibernate.transaction.JDBCTransaction cannot be cast to javax.transaction.Transaction 这部分的具体地方为Transaction tr =(Transaction) session.beginTransaction();  错误原因:包倒错了,应该导入的包是hibernate的Transaction包