高效C/C++之十:Coverity修复问题:尽量多使用 c++强制类型转化

news2025/5/10 23:32:20

【关注我,后续持续新增专题博文,谢谢!!!】

上一篇我们讲了

        这一篇我们开始讲 高效C/C++之十:Coverity修复问题:尽量多使用 c++强制类型转化

目录

【关注我,后续持续新增专题博文,谢谢!!!】

一、背景

二、:尽量多使用 c++强制类型转化

    2.1:static_cast 静态类型转换(编译时检查)

    2.2 :dynamic_cast 动态类型转换(运行时检查)

    2.3 :const_cast 去只读属性转换(const 转化)

    2.4 :reinterpret_cast 重解析类型转换(强制转化)(慎用)

【关注我,后续持续新增专题博文,谢谢!!!】


一、背景

异常代码

异常代码
Metadata::getMetadata((camera_metadata_t*)metaVirtualAddr, m_vendorTAG, "com.result.data", &data);
正确代码
Metadata::getMetadata(static_cast<camera_metadata_t*>(metaVirtualAddr), m_vendorTAG, "com.result.data", &data);

二、:尽量多使用 c++强制类型转化

    2.1:static_cast 静态类型转换(编译时检查)

可以用隐式转化的地方,都可以用 static_cast, 如果类型不支持 static_cast 会编译检查,会报错,比 c 风格的多了检查的步骤;与以下三个 c++的转化比,速度快一些;可以用于派生类和基类之间指针或引用的转换。

进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;

进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。

char a = 'a';
int b = static_cast<char>(a);//正确,将 char 型数据转换成 int 型数据
double *c = new double;
void *d = static_cast<void*>(c);//正确,将 double 指针转换成 void 指针
int e = 10;
const int f = static_cast<const int>(e);//正确,将 int 型数据转换成 const int 型数据
const int g = 20;
int *h = static_cast<int*>(&g);//编译错误,static_cast 不能转换掉 g 的 const 属性

类上行和下行转换:
if(Derived *dp = static_cast<Derived *>(bp)){//下行转换是不安全的
  //使用 dp 指向的 Derived 对象  
}
else{
  //使用 bp 指向的 Base 对象  
}
if(Base*bp = static_cast<Derived *>(dp)){//上行转换是安全的
  //使用 bp 指向的 Derived 对象  
}
else{
  //使用 dp 指向的 Base 对象  
}

   

    2.2 :dynamic_cast 动态类型转换(运行时检查)

dynamic_cast<type*>(e)
dynamic_cast<type&>(e)
dynamic_cast<type&&>(e)

主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。在类层次间进行上行转换时,dynamic_cast 和 static_cast 的效果是一样的;

在进行下行转换时,dynamic_cast 具有类型检查的功能,比 static_cast 更安全。

dynamic_cast 是唯一无法由旧式语法执行的动作,也是唯一可能耗费重大运行成本的转型动作。

(1)指针类型
举例,Base 为包含至少一个虚函数的基类,Derived 是 Base 的共有派生类,如果有一个指向 Base 的指针 bp,我们可以在运行时将它转换成指向 Derived 的指针,代码如下:
if(Derived *dp = dynamic_cast<Derived *>(bp)){
  //使用 dp 指向的 Derived 对象  
}
else{
  //使用 bp 指向的 Base 对象  
}
值得注意的是,在上述代码中,if 语句中定义了 dp,这样做的好处是可以在一个操作中同时完成类型转换和条件检查两项任务。

(2)引用类型
因为不存在所谓空引用,所以引用类型的 dynamic_cast 转换与指针类型不同,在引用转换失败时,会抛出 std::bad_cast 异常,该异常定义在头文件 typeinfo 中。
void f(const Base &b){
 try{
   const Derived &d = dynamic_cast<const Base &>(b);  
   //使用 b 引用的 Derived 对象
 }
 catch(std::bad_cast){
   //处理类型转换失败的情况
 }
}

    2.3 :const_cast 去只读属性转换(const 转化)

用来修改类型的 const(唯一有此能力的 C++-style 转型操作符)或 volatile 属性。除了 const 或 volatile 修饰之外,new_type 和 expression 的类型是一样的。

1、常量指针被转化成非常量的指针,并且仍然指向原来的对象;

2、常量引用被转换成非常量的引用,并且仍然指向原来的对象;

3、const_cast一般用于修改底指针。如const char *p形式。

const int g = 20;
int *h = const_cast<int*>(&g);//去掉 const 常量 const 属性
const int g = 20;
int &h = const_cast<int &>(g);//去掉 const 引用 const 属性
const char *g = "hello";
char *h = const_cast<char *>(g);//去掉 const 指针 const 属性

    2.4 :reinterpret_cast 重解析类型转换(强制转化)(慎用)

new_type 必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,再把该整数转换成原类型的指针,还可以得到原先的指针值)。

reinterpret_cast 意图执行低级转型,实际动作(及结果)可能取决于编辑器,这也就表示它不可移植。

【关注我,后续持续新增专题博文,谢谢!!!】

下一篇讲解

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

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

相关文章

相机的方向和位置

如何更好的控制相机按照我们需要来更好的观察我们需要的地貌呢? 使用 // setview瞬间到达指定位置,视角//生成position是天安门的位置var position Cesium.Cartesian3.fromDegrees(116.397428,39.90923,100)viewer.camera.setView({//指定相机位置destination: position, 在…

suna界面实现原理分析(二):浏览器工具调用可视化

这是一个基于React的浏览器操作可视化调试组件&#xff0c;主要用于在AI开发工具中展示网页自动化操作过程&#xff08;如导航、点击、表单填写等&#xff09;的执行状态和结果。以下是关键技术组件和功能亮点的解析&#xff1a; 一、核心功能模块 浏览器操作状态可视化 • 实时…

操作系统面试问题(4)

32.什么是操作系统 操作系统是一种管理硬件和软件的应用程序。也是运行在计算机中最重要的软件。它为硬件和软件提供了一种中间层&#xff0c;让我们无需关注硬件的实现&#xff0c;把心思花在软件应用上。 通常情况下&#xff0c;计算机上会运行着许多应用程序&#xff0c;它…

C++ Dll创建与调用 查看dll函数 MFC 单对话框应用程序(EXE 工程)改为 DLL 工程

C Dll创建 一、添加 DllMain&#xff08;必要&#xff09; #include <fstream>void Log(const char* msg) {std::ofstream f("C:\\temp\\dll_log.txt", std::ios::app);f << msg << std::endl; }BOOL APIENTRY DllMain(HMODULE hModule, DWORD u…

【prometheus+Grafana篇】基于Prometheus+Grafana实现Linux操作系统的监控与可视化

&#x1f4ab;《博主主页》&#xff1a; &#x1f50e; CSDN主页 &#x1f50e; IF Club社区主页 &#x1f525;《擅长领域》&#xff1a;擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控&#xff1b;并对SQLserver、NoSQL(MongoDB)有了…

CurrentHashMap的整体系统介绍及Java内存模型(JVM)介绍

当我们提到ConurrentHashMap时&#xff0c;先想到的就是HashMap不是线程安全的&#xff1a; 在多个线程共同操作HashMap时&#xff0c;会出现一个数据不一致的问题。 ConcurrentHashMap是HashMap的线程安全版本。 它通过在相应的方法上加锁&#xff0c;来保证多线程情况下的…

spring ai alibaba 使用 SystemPromptTemplate 很方便的集成 系统提示词

系统提示词可以是.st 文件了&#xff0c;便于修改和维护 1提示词内容&#xff1a; 你是一个有用的AI助手。 你是一个帮助人们查找信息的人工智能助手。 您的名字是{name} 你应该用你的名字和{voice}的风格回复用户的请求。 每一次回答的时候都要增加一个65字以内的标题形如:【…

网络的搭建

1、rpm rpm -ivh 2、yum仓库&#xff08;rpm包&#xff09;&#xff1a;网络源 ----》网站 本地源 ----》/dev/sr0 光盘映像文件 3、源码安装 源码安装&#xff08;编译&#xff09; 1、获取源码 2、检测环境生成Ma…

C++学习之类和对象_1

1. 面向过程与面向对象 C语言是面向过程的&#xff0c;注重过程&#xff0c;通过调用函数解决问题。 比如做番茄炒蛋&#xff1a;买番茄和鸡蛋->洗番茄和打鸡蛋->先炒蛋->把蛋放碟子上->炒番茄->再把蛋倒回锅里->加调料->出锅 而C是面向对象的&#xff…

YOLOv12云端GPU谷歌免费版训练模型

1.效果 2.打开 https://colab.research.google.com/?utm_sourcescs-index 3.上传代码 4.解压 !unzip /content/yolov12-main.zip -d /content/yolov12-main 5.进入yolov12-main目录 %cd /content/yolov12-main/yolov12-main 6.安装依赖库 !pip install -r requirements.…

OpenCV进阶操作:图像直方图、直方图均衡化

文章目录 一、图像直方图二、图像直方图的作用三、使用matplotlib方法绘制直方图2.使用opencv的方法绘制直方图&#xff08;划分16个小的子亮度区间&#xff09;3、绘制彩色图像的直方图 四、直方图均衡化1、绘制原图的直方图2、绘制经过直方图均衡化后的图片的直方图3、自适应…

基环树(模板) 2876. 有向图访问计数

对于基环树&#xff0c;我们可以通过拓扑排序去掉所有的树枝&#xff0c;只剩下环&#xff0c;题目中可能会有多个基环树 思路&#xff1a;我们先利用拓扑排序将树枝去掉&#xff0c;然后求出每个基环树&#xff0c;之后反向dfs求得所有树枝的长度即可 class Solution { publi…

【物联网】基于树莓派的物联网开发【1】——初识树莓派

使用背景 物联网开发从0到1研究&#xff0c;以树莓派为基础 场景介绍 系统学习Linux、Python、WEB全栈、各种传感器和硬件 接下来程序猫将带领大家进军物联网世界&#xff0c;从0开始入门研究树莓派。 认识树莓派 正面图示&#xff1a; 1&#xff1a;树莓派简介 树莓派…

学习Python的第一天之网络爬虫

30岁程序员学习Python的第一天&#xff1a;网络爬虫 Requests库 1、requests库安装 windows系统通过管理员打开cmd&#xff0c;运行pip install requests!测试案例&#xff1a; 2、Requests库的两个重要对象 Response对象Resoponse对象包含服务器返回的所有信息&#xff…

linux下的Redis的编译安装与配置

配合做开发经常会用到redis&#xff0c;整理下编译安装配置过程&#xff0c;仅供参考&#xff01; --------------------------------------Redis的安装与配置-------------------------------------- 下载 wget https://download.redis.io/releases/redis-6.2.6.tar.gz tar…

无人机相关技术与故障排除笔记

无人机相关技术与故障排除笔记 本文档整理了关于无人机电调、电机、通信协议、传感器以及硬件故障排除相关的笔记和解释。 1. 电调 (ESC) PWM 输出初始化设置 初始化电调&#xff08;电子调速器&#xff09;的 PWM 输出功能时&#xff0c;设置 频率 400Hz、分辨率 10000、初…

SpringSecurity(自定义异常处理)

文末有本篇文章的项目源码可供下载学习。 在实际的项目开发过程中&#xff0c;我们对于认证失败或者授权失败需要像接口一样返回相同结构的json数据&#xff0c;这样可以让前端对响应进行统一的处理。要实现这个功能我们需要知道SpringSecurity的异常处理机制。 在SpringSecu…

Java——反射

目录 5 反射 5 反射 类信息&#xff1a;方法、变量、构造器、继承和实现的类或接口。反射&#xff1a;反射是 Java 中一项强大的特性&#xff0c;它赋予了程序在运行时动态获取类的信息&#xff0c;并能够调用类的方法、访问类的字段以及操作构造函数等的能力。通过反射&#…

本地玩AI绘画 | StableDiffusion安装到绘画

环境须知 Cuda必须安装 不需要安装Python&#xff0c;因为该项目会自动安装Python3.10的虚拟环境 1.下载StableDiffusionWebUI压缩包并解压 下载方式一&#xff1a; 从Github下载https://github.com/AUTOMATIC1111/stable-diffusion-webui 的压缩包&#xff0c;解压后名为…

project从入门到精通(四)

目录 日程表的设置和妙用 为日程表视图添加任务 用日程表视图的好处 ​编辑 查找任务的前置任务和后续任务 方法1&#xff1a;采用复合视图的方式 方法3&#xff1a;关系图法 方法4&#xff1a;通过任务路径的方式检查所选任务的前置任务 前置任务和驱动前置任务的区…