什么时候应该使用static_cast、dynamic_cast、const_cast和reinterpret_cast?

2023-12-06

正确的使用方法有哪些:

  • static_cast
  • dynamic_cast
  • const_cast
  • reinterpret_cast
  • (type)value(C型演员阵容)
  • type(value)(函数式转换)

如何决定在哪些特定情况下使用哪一个?


static_cast

static_cast是您应该尝试使用的第一个演员表。它执行诸如类型之间的隐式转换之类的操作(例如int to float,或指向void*),并且它还可以调用显式转换函数(或隐式转换函数)。在许多情况下,明确说明static_cast不是必需的,但重要的是要注意T(something)语法相当于(T)something并且应该避免(稍后会详细介绍)。 AT(something, something_else)然而,它是安全的,并且保证调用构造函数。

static_cast也可以通过继承层次结构进行转换。当向上投射(朝向基类)时,这是不必要的,但是当向下投射时,只要它不穿透就可以使用virtual遗产。但是,它不进行检查,并且这是未定义的行为static_cast沿着层次结构下降到实际上不是对象类型的类型。

const_cast

const_cast可用于删除或添加const到一个变量;没有其他 C++ 强制转换能够删除它(甚至不能reinterpret_cast)。需要注意的是,修改之前的const仅当原始变量是时,值才是未定义的const;如果你用它来采取const关闭对未声明的内容的引用const,这是安全的。当基于以下内容重载成员函数时,这非常有用const, 例如。也可以用来添加const到一个对象,例如调用成员函数重载。

const_cast也同样适用于volatile,尽管这种情况不太常见。

dynamic_cast

dynamic_cast专门用于处理多态性。您可以将对任何多态类型的指针或引用强制转换为任何其他类类型(多态类型至少有一个声明或继承的虚函数)。您不仅可以使用它向下施法,还可以向侧面施法,甚至可以向上施法另一条链。这dynamic_cast将寻找所需的对象并在可能的情况下将其返回。如果不能的话就会返回nullptr在指针的情况下,或者抛出std::bad_cast在有参考的情况下。

dynamic_cast但有一些限制。如果继承层次结构中有多个相同类型的对象(所谓的“可怕的钻石”)并且您没有使用它,则它不起作用virtual遗产。它也只能通过公共继承——它总是无法通过protected or private遗产。然而,这很少是一个问题,因为这种形式的继承很少见。

reinterpret_cast

reinterpret_cast是最危险的演员,应该非常谨慎地使用。它将一种类型直接转换为另一种类型——例如将值从一个指针转换为另一个指针,或者将指针存储在int,或各种其他令人讨厌的事情。很大程度上,这是您获得的唯一保证reinterpret_cast通常情况下,如果将结果转换回原始类型,您将得到完全相同的值(但是not如果中间类型小于原始类型)。有很多转换,reinterpret_cast也做不到。它主要用于特别奇怪的转换和位操作,例如将原始数据流转换为实际数据,或者将数据存储在指向对齐数据的指针的低位中。

C 风格转换和函数风格转换

C 风格的强制转换和函数风格的强制转换是使用(type)object or type(object),分别,并且在功能上是等效的。它们被定义为以下第一个成功的:

  • const_cast
  • static_cast(尽管忽略访问限制)
  • static_cast(见上文),那么const_cast
  • reinterpret_cast
  • reinterpret_cast, then const_cast

因此,在某些情况下,它可以用作其他演员的替代品,但由于能够转变为reinterpret_cast,当需要显式转换时,应该首选后者,除非您确定static_cast会成功或reinterpret_cast将失败。即便如此,请考虑更长、更明确的选项。

C 风格的强制转换在执行时也会忽略访问控制static_cast,这意味着他们有能力执行其他演员无法执行的操作。不过,这主要是一个拼凑,在我看来,这只是避免 C 风格强制转换的另一个原因。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么时候应该使用static_cast、dynamic_cast、const_cast和reinterpret_cast? 的相关文章

随机推荐

  • 如何在使用 splitViewController 的 iPad 上引用detailViewController

    我在 XCode 4 3 和 IOS 5 上设置了一个项目 没有使用 iPhone 和 iPad 的情节提要 使用创建新项目对话框中的默认主 细节设置 iPhone端运行得很好 我在 tableView 中选择一个选项 detailView
  • Angular 2 - 共享服务的实现

    我正在尝试实现我在 Stack Overflow 中找到的解决方案 但面临困难 我有一个服务和一个组件 但实现上有些东西不正确 错误 TypeError 无法读取未定义的属性 下一个 可能有什么问题或缺失 还缺少什么吗 同样在我的终端窗口上
  • 如何将 Node.js 应用程序作为后台服务运行?

    由于多年来这篇文章引起了很多关注 我在这篇文章的底部列出了每个平台的顶级解决方案 原帖 我希望我的 Node js 服务器在后台运行 即 当我关闭终端时 我希望我的服务器继续运行 我用谷歌搜索了这个并想出了这个tutorial 但是它没有按
  • Objective C 中的维基百科 API?

    有谁知道在 Objective C 中是否有维基百科 api 的实现 与普通网站相比 它可以更好地访问和显示信息 我正在考虑类似 wikipanion 应用程序的东西 但不是那么复杂 Thanks Joerg 我知道这个问题很老了 但仅适用
  • 如何用ajax显示在线用户

    我想在我的网站上实时显示所有在线用户 但不知道该怎么做 添加新用户登录后并不困难 但我还需要删除不再登录的用户 知道如何做到这一点吗 我应该使用 jQuery 检查哪些用户已注销并将其从列表中删除等吗 您的问题是人们在没有注销的情况下离开
  • 禁用 Alt 键的正常行为

    When pressing the Alt key normally the focus goes to the window s menu I need to disable it globally Because my applicat
  • psr4 自动加载器不会从类内自动加载

    当我使用它时 自动加载器可以工作index php 但是当我在其中创建一个对象时index php并且这个对象必须创建其他对象 它们都在同一个命名空间中 它会抛出错误Uncaught Error Class xxx not found in
  • 我应该使用“from package import utils, settings”还是“from .import utils, settings”

    我正在开发一个Python应用程序 当然 它的所有代码都在一个包中 并在其中运行 用户对应用程序的 Python 包不感兴趣 它只是一个 GUI 应用程序 问题是 在应用程序包内导入模块时首选哪种样式 from application im
  • 从 XML 列中选择所有 XML 节点

    我有一个带有 XML 列的表 每个条目的 XML 结构都是完全扁平的 甚至没有父标签 这是一个条目的示例
  • 添加 NA 以使所有列表元素长度相等

    我正在做一系列的事情dplyr tidyr 因此如果可能的话希望保留管道解决方案 我有一个列表 每个组件中的元素数量不均匀 lolz lt list a c 2 4 5 2 3 b c 3 3 2 c c 1 1 2 4 5 3 3 d c
  • 阿拉伯字符在 JavaScript 中无法正确显示

    当我在 JavaScript 中添加阿拉伯字符时 它无法正确显示 我猜这是一个 ASCII 问题 有什么建议么 JavaScript document getElementById div msg innerText HTML div st
  • 在 SwiftUI 中循环字典

    I have var countriesGroupedByRegion Dictionary
  • Opengl 3.3 不绘制任何东西。使用 GLSL 330 核心

    我正在遵循以下指南这个网站并已停止第 2 课 起初 我尝试编写自己的代码 但在它不起作用后 我只是从网站上获取了代码 除了glClearColor 我做了什么 检查编译和链接 工作正常 已检查错误 不确定我是否做得对 但似乎一切都好 我收到
  • NFC 的跨平台移动开发框架

    我想为多个移动平台 android BB iOS 等 创建一个应用程序 该应用程序能够使用 nfc 对等功能 例如 读取 写入 NFC 读取器 写入器 我研究了 mosync 因为它允许我们编写我喜欢的 C C 代码 但他们的 API 没有
  • 如何使用 imwrite 从一个文件夹中获取图像并使用 Opencv 将它们保存到另一个文件夹?

    我想增强文件夹内的图像 我还想在不同的文件夹中增强后保持图像的名称相同 我如何使用 OpenCV 来做到这一点 Defining path INPUT IMG DIR NORMAL OUTPUT AUG DIR AUGMENT seq ia
  • Java级计算器if语句返回错误值(新手)

    我正在学习一些Java 并决定做一些简单的事情 但它不断返回错误的值 我不知道为什么我确信我未经训练的眼睛没有注意到一些东西 如果您有我的代码的替代方案 请先回答我的问题 然后推荐替代方案 我真的很讨厌无知傲慢的人 他们忘记了我们都是从哪里
  • jquery 函数在没有 document.ready 的情况下无法工作,为什么?

    在我们使用 Document ready 之前 这段代码不起作用 a on click function a fadeOut 200 document ready function a on click function shad fade
  • 从 Excel 工作表中读取随机单元格值

    我已存储 RANDBETWEEN 10 20 在我的Excel工作表中 这个公式在Excel工作表中生成10到20之间的随机值 我需要在我的java程序中读取这5个随机值 虽然该函数在我的 Excel 工作表中给出了不同的值 但我的 jav
  • UnboundLocalError:赋值前引用的局部变量“cursor”[重复]

    这个问题在这里已经有答案了 所以我是一个新手 但正在使用 Flask MYSQL 开发注册系统表单 我收到此错误 UnboundLocalError 赋值前引用的局部变量 cursor 经过几个小时的代码研究和研究后 我需要你的帮助 这是我
  • 什么时候应该使用static_cast、dynamic_cast、const_cast和reinterpret_cast?

    正确的使用方法有哪些 static cast dynamic cast const cast reinterpret cast type value C型演员阵容 type value 函数式转换 如何决定在哪些特定情况下使用哪一个 sta