C++ 强制类型转换总结

C++ 强制类型转换总结

  • 简介
  • static_cast
    • 介绍
    • 场景
    • 示例
  • dynamic_cast
    • 介绍
    • 场景
    • 示例
  • const_cast
    • 介绍
    • 示例
  • reinterpret_cast
    • 介绍
    • 特点
    • 示例

简介

在开发时候,对强制类型转换经常感觉很迷糊,什么场景用哪个没有一个确切的认识,因此借着这个机会好好总结下,下面我们开始来分析吧。

static_cast

介绍

static_cast 是最常用的类型转换运算符,用于执行非多态类型的转换。不执行运行时类型检查(转换安全性不如 dynamic_cast)

场景

  • 用来进行基本数据类型之间的转换,如整型和浮点型,
  • 在类层次结构中进行上行和下行转换(只要不存在虚继承),下行(把基类指针转换为子类指针)转换不安全

示例

#include <iostream>int main() {double d = 9.5;int i = static_cast<int>(d); // 将 double 转换为 intstd::cout << i << std::endl; // 输出 9// 类层次结构的转换class Base {};class Derived : public Base {};Derived* derived = new Derived();Base* base = static_cast<Base*>(derived); // 安全的上行转换Derived* newDerived = static_cast<Derived*>(base); // 不安全的下行转换return 0;
}

dynamic_cast

介绍

dynamic_cast 用于处理具有多态性的类型转换,主要用于类层次结构中的安全向下转换。它在运行时检查对象类型,确保转换的安全性。如果转换失败,对于指针类型返回 nullptr,对于引用类型抛出异常

场景

  • 用于具有多态性的类型转换,主要用于类层次结构中的安全向下转换
  • 只适用于指针或引用
  • 可以在整个类层次结构中移动指针,包括向上转换、向下转换

示例

#include <iostream>class Base {
public:virtual void print() { std::cout << "Base class" << std::endl; }virtual ~Base() {}
};class Derived : public Base {
public:void print() override { std::cout << "Derived class" << std::endl; }
};int main() {Base* base = new Derived();Derived* derived = dynamic_cast<Derived*>(base);if (derived) {derived->print(); // 输出 "Derived class"}delete base;return 0;
}

const_cast

介绍

用于删除 const、volatile 和 __unaligned 特性(如将 const int 类型转换为 int 类型 )

示例

#include <iostream>void print(char* str) {std::cout << str << std::endl;
}int main() {const char* cStr = "Hello, world!";char* modifiableStr = const_cast<char*>(cStr);print(modifiableStr); // 输出 "Hello, world!"return 0;
}

reinterpret_cast

介绍

reinterpret_cast 用于进行低级别的重新解释转换,它可以将任何指针类型转换为任何其他指针类型,甚至可以将指针转换为足够大的整型。这种转换是不安全的,应谨慎使用。

特点

  • 用于位的简单重新解释
  • 滥用 reinterpret_cast 运算符可能很容易带来风险。 除非所需转换本身是低级别的,否则应使用其他强制转换运算符之一。
  • 允许将任何指针转换为任何其他指针类型(如 char* 到 int* 或 One_class* 到 Unrelated_class* 之类的转换,但其本身并不安全)
  • 也允许将任何整数类型转换为任何指针类型以及反向转换。
  • reinterpret_cast 运算符不能丢掉 const、volatile 或 __unaligned 特性。
  • reinterpret_cast 的一个实际用途是在哈希函数中,即,通过让两个不同的值几乎不以相同的索引结尾的方式将值映射到索引。
哈希函数是将任意长度的数据映射到固定长度的值(称为哈希值)的一种算法。在使用哈希表(hash table)这种数据结构时,哈希函数起到了关键作用。哈希表通过哈希函数将键值映射到数组中的索引,然后在该索引位置存储相关的值。
理想情况下,哈希函数应该能够将不同的输入值映射到尽可能分散的输出索引,这样可以避免冲突(即不同键值映射到同一个索引)的发生,提高哈希表的查询性能。
这就是 reinterpret_cast 在哈希函数中的用途:利用它可以将不同的输入值转换成不同的比特模式,从而使哈希函数生成的索引更加分散。例如,可以将整数或浮点数通过 reinterpret_cast 转换成字节序列,然后将这些字节序列作为哈希函数的输入,以获得更加均匀分散的索引分布。
总之,reinterpret_cast 在哈希函数中的作用是提高哈希值的分散性,从而减少哈希冲突,提高哈希表的性能。这是该类型转换的一个重要应用场景。

示例

#include <iostream>int main() {int a = 42;int* aPtr = &a;char* charPtr = reinterpret_cast<char*>(aPtr);std::cout << *charPtr << std::endl; // 可能输出不确定的结果,取决于系统和编译器uintptr_t p = reinterpret_cast<uintptr_t>(aPtr);std::cout << p << std::endl; // 输出指针的整数值return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/28816.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新办理北京广播电视节目制作许可证需要什么条件

在北京想要从事广播电视节目制作&#xff0c;那就需要企业拥有广播电视节目制作经营许可证。此许可证不仅是企业合法经营的基础&#xff0c;同时也是保障节目制作质量和内容合规的标志。如何办理&#xff0c;详情致电咨询我或者来公司面谈。 北京广播电视节目制作经营许可证申请…

<tbody>出现滚动条后,同<thead>对不齐的解决方案

需求是需要表格滚动&#xff0c;并且表头不动 <table classtable-style><thead>表头部分</thead><tbody>表体部分</tbody> </table><style>.table-style {width: 100%;border: 1px solid silver; /* 有边框 */border-collapse: col…

Web前端精通教程:深入探索与实战指南

Web前端精通教程&#xff1a;深入探索与实战指南 在数字化时代&#xff0c;Web前端技术已经成为构建优秀用户体验的基石。想要精通Web前端&#xff0c;不仅需要掌握扎实的基础知识&#xff0c;还需要具备丰富的实战经验和深入的思考。本文将从四个方面、五个方面、六个方面和七…

访问jlesage/firefox镜像创建的容器中文乱码问题

目录 介绍总结 介绍 最近在使用jlesage/firefox镜像创建容器的时候&#xff0c;发现远程管理家里网络的时候中文会出现乱码&#xff0c;导致整个体验非常的不好&#xff0c;网上查找资料说只要设置环境变量ENABLE_CJK_FONT1 就可以解决问题&#xff0c;抱着试一试的态度还真的成…

「网络原理」IP 协议

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;计网 &#x1f387;欢迎点赞收藏加关注哦&#xff01; IP 协议 &#x1f349;报头结构&#x1f349;地址管理&#x1f34c;动态分配 IP 地址&#x1f34c;NAT 机制&#xff08;网络地址映射&am…

示例:WPF中应用DataGrid读取实体DisplayAttribute特性自动自动生成列名

一、目的&#xff1a;通过重写DataGrid的OnAutoGeneratingColumn方法实现根据定义特性自动生成列头信息功能 二、实现 <DataGrid ItemsSource"{local:GetStudents Count50}"/>实体定义如下 public class Student{[DataGridColumn("*")][Display(Na…

iOS18那些隐藏有趣的新功能分享!

WWDC 2024开幕式结束后&#xff0c;苹果迅速向开发者推送了iOS 18的首个测试版更新。很多果粉和小编一样&#xff0c;第一时间进行了升级。 自定义应用图标位置和颜色、应用锁、隐藏图标、全新控制中心、新增密码应用以及照片重新排版等新功能都表现出色。这些明面上的新功能大…

java.lang.ClassCastException的java类型转换异常解决方案

一、问题描述 在系统中应用了spring的Cacheable注解功能&#xff0c;首次请求方法没问题&#xff0c;但在二次加载中&#xff0c;会抛出类转换异常&#xff0c;根本原因是&#xff1a;同一个类的加载类不同&#xff0c;既&#xff1a;applicationClassLoader 和 RestartClassL…

ncnn 和 rknn 自定义算子对比实现

你提供了两种实现自定义 Sigmoid 算子的代码。第一种是使用NCNN 并行化的实现,第二种是一个自定义算子函数用于 RKNN(Rockchip Neural Network)的实现。下面我将详细解释这两种实现,并提供一些优化建议。 实现 1:使用NCNN 并行化实现的 Sigmoid 算子 int Sigmoid::forwa…

rxjava 3.0 BehaviorProcessor底层源代码分析

这段代码是 RxJava 中 BehaviorProcessor 类的实现&#xff0c;它是一个特殊的处理器&#xff08;Processor&#xff09;&#xff0c;可以缓存并向新的订阅者发出最后一个观察到的项以及所有后续的项。以下是对该类的详细分析&#xff1a; 类的结构和字段 字段 subscribers: 存…

Python中的np.setdiff1d()函数

Python中的np.setdiff1d()函数可用于找出两个序列集合中元素的差异 API及参数说明如下&#xff1a; np.setdiff1d(ar1,ar2,assume_unique)&#xff1a;找出序列1在序列2中的差异&#xff0c;并返回序列1中不在序列2中的元素 ar1&#xff1a;输入数组ar2&#xff1a;输入比较…

网络安全等级保护制度详解,一文掌握核心要点!

一、等级保护制度发展情况 等级保护制度的法律依据 《计算机信息系统安全保护条例》&#xff08;1994年General Office of the State Council第147号令&#xff09; 公安部主管全国计算机信息系统安全保护工作。 计算机信息系统实行安全等级保护&#xff0c;安全等级的划分…

目录文件管理

文章目录 Linux目录结构树形目录结构根目录常见的子目录子目录的作用 查看及检索文件查看文件内容cat格式 more格式操作方法 less格式操作方法 head格式 tail格式 统计文件内容wc格式选项 检索和过滤文件内容grep格式选项查找条件 备份及恢复文档压缩命令gzip bzip2格式压缩解压…

Redis 网络模型

一、用户空间和内核空间 1.1 linux 简介 服务器大多采用 Linux 系统&#xff0c;这里我们以 Linux 为例来讲解&#xff0c;下面有两个不同的 linux 发行版&#xff0c;分别位 ubuntu 和 centos&#xff0c;其实发行版就是在 Linux 系统上包了一层壳。 任何 Linux 发行版&#…

Draw.io

Draw.io Draw.io是一款很实用的思维导图软件&#xff0c;现在已经推出了桌面版&#xff0c;对于很多办公人士而言画张流程图可以轻松的罗列整个流程&#xff0c;比使用文字或者幻灯片制作简单并且容易理解&#xff0c;该应用程序不仅免费&#xff0c;还拥有专业的工具&#xf…

详细图文手把手教你阿里云注册域名如何托管到CloudFlare DNS服务

1.第一步&#xff1a;注册并登录Cloudflare账号&#xff0c;点击右上角“添加站点”&#xff0c;进入下图页面填写域名&#xff0c;点击继续。 2.第二步&#xff1a;进入页面滑动到最下方&#xff0c;选择Free免费套餐&#xff0c;再次点击继续。 3.第三步&#xff1a;这个页面…

基于starknet构建应用链之Madara

文章目录 什么是Madara应用链模板其他仓库为何要构建应用链?什么是Madara 欢迎来到Madara,使用Cairo和Starknet技术构建链的模块化堆栈。像dYdX V3、Immutable和Sorare这样的应用程序已经使用StarkEx进行扩展有一段时间了,现在有了Madara,它是开源的,每个人都可以使用。 …

c# 二维图形绘制实践

1.等边三角形 1.1 概述 1.2 代码 using System; using System.Drawing; using System.Windows.Forms;public partial class TriangleForm : Form {public TriangleForm(){//InitializeComponent();// 确保窗体大小足够大&#xff0c;以容纳三角形 this.ClientSize new Siz…

AbMole带你探索细胞的“铁”门:Piezo1通道在椎间盘退变中的关键角色

在生物医学领域&#xff0c;铁是细胞功能不可或缺的元素&#xff0c;但铁的异常积累却可能成为细胞的“隐形杀手”。最近&#xff0c;一项发表在《Bone Research》上的研究&#xff0c;为我们揭开了铁代谢与椎间盘退变之间神秘联系的一角。这项研究不仅深化了我们对铁离子通道P…

5个超实用1688选品技巧!轻松出单999+

1、研究市场需求 通过市场调查和分析&#xff0c;了解目标市场的消费者喜好和趋势。选择具有市场需求且竞争相对较小的产品类别。 用店雷达热销商 品榜和飙升商 品榜。比如做女装类目&#xff0c;选择“女士T恤”我们可以根据日、周、月为时间维度下商品的销售笔数、件数、销…