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

相关文章

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包

s let 和const的区别 ,它们可以变量提升吗

在 JavaScript 中,let 和 const 是 ES6 引入的新变量声明关键字,它们与之前的 var 关键字相比,有几个重要的区别。特别是关于变量提升(hoisting)的行为不同。 变量提升(Hoisting) 在 JavaScript 中,“变量提升”是指变量声明会被提升到作用域的顶部,但变量的初始化不会。这意味着你可以先使用变量,然后再声明它。然而,let 和 const 的行

【硬刚ES】ES基础(十三)Dynamic Template和Index Template

本文是对《【硬刚大数据之学习路线篇】从零到大数据专家的学习指南(全面升级版)》的ES部分补充。

C++中const关键字的使用方法,烦透了一遍一遍的搜,总结一下,加深印象!!!

之前一直在学习C/C++,关于const的使用,这里出现一点,那里出现一点。知识用时方恨少,这一段时间正好各种笔试题,其中关于const的用法也是层出不穷,所以疲于在书本上各种翻,这里汇总一下,加深自己的印象的同时,也方便以后查阅和学习。菜鸟一个,若有错误,望指正! const关键字 常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。不管出现在任何上