MEC | 条款2 最好使用C++转型操作符

news2024/10/6 5:53:09

条款2 最好使用C++转型操作符

文章目录

  • 条款2 最好使用C++转型操作符
    • c++4个转型操作符
      • static_cast
      • const_cast
      • dynamic_cast
      • reinterpret_cast
    • 宏模仿新转换语法
      • 欢迎关注公众号【三戒纪元】

c++4个转型操作符

  • static_cast
  • const_cast
  • dynamic_cast
  • reinterpret_cast

原因是

  1. 新式转型方法容易便是出来,而且一眼能看出来是想做什么类型转换。
  2. 编译器得以判断转型错误(旧式转型无法做到)

static_cast

要从C的旧事转型,改为新的转型方法

(type) expression

==>

static_cast<type> (expression)

static_cast 拥有与C旧事转型相同的威力和意义,以及相同的限制。

const_cast

const_cast 用来改变表达式中的常量性(constness)或易变性(volatileness)

class Widget { ... };
 
class SpecialWidget : public Widget{ ... };

void update(SpecialWidget* psw) {}

SpecialWidget sw; // sw是一个非const对象
const SpecialWidget& csw = sw; // csw是sw的一个引用,它是一个const对象
update(&csw); // 错误,不能传递一个const SpecialWidget*变量给一个处理SpecialWidget*类型变量的函数
update(const_cast<SpecialWidget*>(&csw)); // 正确,csw的const显示地转换掉(csw和sw两个变量值在update函数中能被更新)
update((SpecialWidget*)&csw); // 同上,但用了一个更难识别的C风格的类型转换
 
Widget* pw = new SpecialWidget;
update(pw); // 错误,pw的类型是Widget*,但是update函数处理的是SpecialWidget*类型
update(const_cast<SpecialWidget*>(pw)); // 错误,const_cast仅能被用在影响constness or volatileness的地方,不能用在向继承子类进行类型转换

显然,const_cast 最常见的用途就是将某个对象的常量性去除掉

dynamic_cast

用来执行继承体系中的“安全向下转型或跨系转型动作”。

具体有2个作用:

  1. 将指向 base class objects的pointers 或 references 转型为 指向 derived(或sibling base) class objects 的 pointers 或 references,并得知转型是否成功。转型失败会返回 null 指针或 1个 expression
  2. 找出某个对象占用的内存的起始点
class Widget { ... };
 
class SpecialWidget : public Widget{ ... };

void update(SpecialWidget* psw) {}
void updateViaRef(SpecialWidget& rsw) {}

Widget* pw2 = nullptr;
update(dynamic_cast<SpecialWidget*>(pw2)); // 正确,传递给update函数一个指针是指向变量类型为SpecialWidget的pw2的指针, 
                                           // 如果pw2确实指向一个对象,否则传递过去的将是空指针
 
Widget* pw3 = new SpecialWidget;
updateViaRef(dynamic_cast<SpecialWidget&>(*pw3)); // 正确,传递给updateViaRef函数SpecailWidget pw3指针,
                                                  // 如果pw3确实指向了某个对象,否则将抛出异常
 
double result3 = dynamic_cast<double>(firstNumber) / secondNumber; // 错误,没有继承关系
const SpecialWidget sw4;
update(dynamic_cast<SpecialWidget*>(&sw4)); // 错误,dynamic_cast不能转换掉const

dynamic_cast 只能用来协助你巡航于继承体系中。

reinterpret_cast

这个操作符的转换结果几乎总是与编译平台息息相关,所以 reinterpret_cast 不具有移植性。

reinterpret_cast 最常用的用途是转换“函数指针”类型

比如想将一下函数的一个指针放进 funcPtrArray 中

type void (*FuncPtr); // FuncPtr 是个指针,指向某个函数
                      // 该函数无需任何自变量,返回值为void
FuncPtr funcPtrArray[10]; // funcPtrArray 是个数组,内有10个 FuncPtrs

int doSth();

funcPtrArray 内各函数指针所指函数的返回值为void,但 doSth 的返回值却是 int:

funcPtrArray[0] = &doSomething; // 错误,类型不匹配
funcPtrArray[0] = reinterpret_cast<FuncPtr>(&doSomething); // 编译通过

转换函数指针的代码是不可移植的, C++不保证所有的函数指针都被用一样的方法表示,在一些情况下这样的转换会产生不正确的结果,所以应该避免转换函数指针类型

宏模仿新转换语法

如果编译器不支持新式转型动作,使用宏可达到同样效果

#define static_cast(TYPE, EXPR) ((TYPE)(EXPR))
#define CONST_cast(TYPE, EXPR) ((TYPE)(EXPR))
#define  reinterpret_cast(TYPE, EXPR) ((TYPE)(EXPR))

宏方法不能保证转换安全,而且不能得知是否转换成功。


欢迎关注公众号【三戒纪元】

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

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

相关文章

chatgpt赋能python:Python在SEO中如何确定主语?

Python在SEO中如何确定主语&#xff1f; Python是一种高级编程语言&#xff0c;广泛应用于Web开发、数据分析和机器学习等领域。但是&#xff0c;Python编写的网页是否符合SEO标准&#xff0c;是一个需要重视的问题。在SEO中&#xff0c;主语是一个非常重要的因素。那么&#…

CLickhouse 物化视图--干货记录(亲验证)

1、普通视图VS物化视图 普通视图不保存数据&#xff0c;保存的仅仅是查询语句&#xff0c;查询的时候还是从原表读取数据&#xff0c;可以将普通视图理解为是个子查询。--中看不中用 物化视图则是把查询的结果根据相应的引擎存入到了磁盘或内存中&#xff0c;对数据重新进行了…

Duilib中禁止一个窗口双击最大化

1、Duilib中禁止一个窗口双击最大化 用duilib开发了一个窗口&#xff0c;比如是登录窗口&#xff0c;那么这个窗口的窗口的双击最大化就毫无意义&#xff0c;甚至带来灾难&#xff0c;我们就要明确禁止这样的行为。 我们应该明确&#xff0c;一个窗口创建的时候就赋予了它一些…

内核链表、JSON的序列化与反序列化

1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除&#xff1b; 2) 结构体每个成员相对结构体首地址的偏移量(offset)都是成员大小的整数倍&#xff0c;如有需要编译器会在成员之间加上填充字节(internal adding)&#xff1b; 3) 结构体的总大小为结构体最宽基本类型…

计算机组成原理(考研408)练习题#3

用于复习408或计算机组成原理期末考试。如有错误请在评论区指出。 So lets start studying with questions! それでは、問題の勉強を始めましょう&#xff01; 1. 定点整数原码编码[x]原1110100B 的真值为_________。 首先&#xff0c;1110100B是一个8位二进制数&#xff0c…

Spring Cloud Sleuth使用简介

Spring-Cloud Spring Cloud为开发者提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性Token、全局锁、决策竞选、分布式会话和集群状态)操作的开发工具。使用SpringCloud开发者可以快速实现上述这些模式。 SpringCloud Sleuth Distribu…

【0基础教程】Javascript 正则表达式里的分组捕捉 Capturing Groups 使用方法及原理

一、从最简单开始 现有一个字符串&#xff1a; “1-apple” 需要解析出 1 和 apple 来&#xff0c;对应的正则表达式很简单&#xff1a; ^(\d)-(.)$ 其中&#xff0c; ^ 表示字符串的开始&#xff0c;然后一个圆括号包裹的内容表示一个"组"&#xff1a;(\d) 表示一组…

【深度学习】2-1 神经网络 - 激活函数

激活函数 将输入信号的总和转换为输出信号&#xff0c;一般称为激活函数&#xff08;activation function&#xff09;。激活函数作用在于决定如何来激活输入信号的总和。 对激活函数&#xff0c;一般要求&#xff1a; 非线性&#xff1a;为提高模型的学习能力&#xff0c;如…

Nginx reuseport导致偶发性卡顿

背景 从2018年开始&#xff0c;我们有个业务陆续接到反馈 Nginx 线上集群经常出现不响应或者偶发性的“超慢”请求。这种卡顿每天都有少量出现。而只有多个集群中的一个出现&#xff0c;其他压力更大的集群皆未出现。 业务结构比较简单&#xff1a;LVS->Nginx->后端&…

Advanced-C.01.基础知识

C语言程序设计概述 一个简单句的C程序 #include <stdio.h> int main(){printf("This is a C program.\n");retrun 0; }C程序的执行过程 数据单位 bit&#xff1a;位&#xff0c;计算机中最小的数据单位Byte&#xff1a;字节&#xff0c;计算机中信息组织和存…

C++ 搜索二叉树

目录 C 搜索二叉树一. 介绍二.简单实现搜索二叉树1. 基本框架2. 插入节点a. 图示&#xff1a;b. 递归实现&#xff1a;c. 非递归&#xff1a; 3. 删除节点a. 图示&#xff1a;b. 递归实现&#xff1a;c. 非递归&#xff1a; 三. 小结 C 搜索二叉树 又名&#xff1a;二叉搜索树…

bean的三种实例化方式

实例化bean的三种方式&#xff0c;构造方法,静态工厂和实例工厂 构造方法实例化&#xff08;常用&#xff09; 步骤1&#xff1a;准备一个BookDao和BookDaoImpl类 public interface BookDao {public void save(); } ​ public class BookDaoImpl implements BookDao {public…

Vue中如何进行表单图片裁剪与预览

Vue中如何进行表单图片裁剪与预览 在前端开发中&#xff0c;表单提交是一个常见的操作。有时候&#xff0c;我们需要上传图片&#xff0c;但是上传的图片可能会非常大&#xff0c;这会增加服务器的负担&#xff0c;同时也会降低用户的体验。因此&#xff0c;我们通常需要对上传…

Python:关于flask框架的flask_scrip._compat

关于flask框架的flask_scrip._compat compat是什么源码Flask版本书写不同 compat是什么 compat 英文单词同胞的意思 compat的功能是在py的不同版本之间做兼容处理 一些py2/py3兼容性支持基于精简版的six&#xff0c;因此我们不必依赖于它的特定版本。 源码 # -*- coding: u…

使用芯片和贴片天线解决多频带射频问题

智能手机和可穿戴电子设备等手持和便携式无线产品依赖可置入设备的微型芯片、贴片和印制线天线。尽管这些小型器件解决了在小尺寸系统中携带多频带天线阵列的问题&#xff0c;但它们也引入了辐射效率下降、阻抗匹配以及与附近物体和人体的交互等相关问题。 为解决这些问题&…

ASO优化之如何降低应用的卸载率

不管是苹果应用商店&#xff0c;还是国内的安卓市场和国外的Google Play&#xff0c;拥有超过200万个应用&#xff0c;每个应用都面临着众多的竞争对手&#xff0c;当应用在承诺之后没有及时兑现可以提供的功能&#xff0c;就会面临被卸载的风险。 对应用在不同平台的应用商店…

chatgpt赋能python:Python数据类型的确定方法

Python数据类型的确定方法 在Python中&#xff0c;一个变量可以保存任何类型的数据。数据类型是指数据的种类和形式。在使用Python时&#xff0c;数据类型通常是自动推断的&#xff0c;但有时我们需要手动确定数据类型。本文介绍了Python中确定变量数据类型的几种方法。 使用…

如何部署免交互脚本

目录 一、免交互 什么是免交互 Here Document免交互 二、Expect概述 expect sed命令 三、如何用ssh实现免交互 四、监控硬盘实现免交互 五、创建硬盘分区如何实现免交互 一、免交互 什么是免交互 交互&#xff1a;需要人工发出指令&#xff0c;来控制程序的运行&…

走向实用的AI编解码

基于AI的端到端数据压缩方法受到越来越多的关注&#xff0c;研究对象已经包括图像、视频、点云、文本、语音和基因组等&#xff0c;其中AI图像压缩的研究最为活跃。图像编解码的研究和应用历史悠久&#xff0c;AI方法要达到实用&#xff0c;需要解决诸多问题才能取得相比于传统…

金融大数据平台是怎么构建的?

大数据对银行业的价值不言而喻。 在业务上,如何去挖掘客户的内在需求,为客户提供更有价值的服务是目前金融机构的战略转型和业务创新的关键。大数据技术正是金融机构深挖数据资产、实现差异化竞争、推动业务创新的重要工具。 在运营上,通过大数据应用和分析,金融机构能够定位…