c++11: 类型转换
目录
一 C语言中的类型转换
二 . C++强制类型转换
1. static_cast
2. reinterpret_cast
3. const_cast
4. dynamic_cast
三 explicit 关键字
一 C语言中的类型转换
在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值 类型不一致时,就需要发生类型转化,C语言中总共有两种形式的类型转换:隐式类型转换和显式类型转换
- 隐式类型转化:编译器在编译阶段自动对相近类型进行转换
int main()
{int i = 1;double d = 6.66;i = d;//在这里编译器进行了隐式类型转换(前提相近类型)//将double转成int类型cout << i << endl;return 0;
}
运行结果会有一定的精度损失
- . 显式类型转化:需要用户自己处理 (处理不相近类型)
int* p = nullptr;p = (int*)i;//不相近类型,需要我们手动进行强制转换类型cout << p << endl;
缺陷: 转换的可视性比较差,所有的转换形式都是以一种相同形式书写,难以跟踪错误的转换。
二 . C++强制类型转换
c++兼容c语言留下来的隐式类型转换和显示类型转换,但是c++觉得c语言做的不规范,且可视性比较差,为了加强类型转换的可视性,引入了四种命名的类型转换操作符。
static_cast、 reinterpret_cast、 const_cast、 dynamic_cast
1. static_cast
//对应c语言的隐式类型转换(相近类型)d=static_cast<double>(i);
2. reinterpret_cast
//对应c语言的强制类型转换(不相近类型)p = reinterpret_cast<int*>(i);
static_cast<>() 类似个类的使用,所以在使用上我们传模板<double>已经传参数(i)
3. const_cast
const int ci = 10;int* pi = const_cast<int*>(&ci);//去掉const属性//对应c语言的强制类型转换 int* pi = (int*)&ci;
接下来我们看一个测试题
int main()
{const int ci = 10;int* pi = const_cast<int*>(&ci);//去掉const属性//对应c语言的强制类型转换 int* pi = (int*)&ci;*pi = 20;cout << *pi << endl;cout << ci << endl;//return 0;}
测试结果
按理说所得结果ci应该为ci=20的,但是这里为啥还是10? 关于这种问题,在linux相关文章中也介绍过了,在main()中, 由于const int ci=10, 编译器会认为 const ci不会改变的,所以cpu会把ci存储在cpu里的寄存器中,不再每次向内存中读取ci的值了,所以后面尽管*pi=20即将ci对应的内存值改成20,但因为cpu并没有去读取,所以输出结果依然ci=10.
🍎在之前的文章中也介绍过,要想让寄存器到内存中读取const int ci 的值,我们需要在其前面加一个关键词 volatile (即内存可见)
volatile const int ci = 10;int* pi = const_cast<int*>(&ci);//去掉const属性//对应c语言的强制类型转换 int* pi = (int*)&ci;*pi = 20;cout << *pi << endl;cout << ci << endl;//
测试结果:这样就符号我们的预期了
4. dynamic_cast
dynamic_cast 用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换)
- c++中子类对象可以赋值给父亲的对象指针引用,这个过程会发生切片,天然支持
A a;B b;A* pa = &a;pa = &b;
- 如果父类的指针或引用传给子类的指针,这个过程有可能成功
class A
{
public://虚函数virtual void f(){}int _a;
};
class B :public A
{
public://虚函数virtual void f(){}int _b;
};//A a;
//B b;
//A* pa = &a;
//f_cast(pa);
//pa = &b;
//f_cast(pa);
void f_cast(A* pa)
{//如何区分pa是指向父类还是子类B* pb = (B*)pa;pb->_a = 1;pb->_b = 2;cout << pb->_a << endl;cout << pb->_b << endl;}
int main()
{A a;B b;A* pa = &a;//pa = &b;f_cast(pa);return 0;
}
这个测试例子主要是用于:pa是父类对象A的指针,当我们传过去给f_cast(pa),函数内部会将pa转成B* 类型的,那我们传入了父类指针能调用 pb->_a = 1; pb->_b = 2;吗?答案是不行的
若我们 pa = &b; f_cast(pa);即将子类对象指针传入会怎么样呢?
所以c语言中的 void f_cast(A* pa) B* pb = (B*)pa;pb->_a = 1; pb->_b = 2; 并不能帮我们区分pa是指向父类还是子类。而c++中的dynamic_cast<B*>(pa) 就能很好解决这个问题。
void f_cast(A* pa)
{//如何区分pa是指向父类还是子类//如果pa指向子类对象,则转换成功//如果pa指向父类对象转换失败返回nullptrB* pb = dynamic_cast<B*>(pa);if (pb != nullptr){cout << "指向子类对象" << endl;pb->_a = 1;pb->_b = 2;}else{cout << "转换失败" << endl;}
}
注意:dynamic_cast只能用于含有虚函数的类 (父类需要有虚函数)这是为什么呢?
因为dynamic_cast通过 ---->去虚表上方的存储标识信息来知道到底是那个类。
还有一个混淆点,虚继承对应有虚基表,虚函数的多态对应虚表。
三 explicit 关键字
我们先看一个例子:
class A{public ://构造函数A (int a){cout<<"A(int a)" <<endl;}//拷贝构造A(const A& a){cout<<"A(const A& a)" <<endl;}private :int _a ;};int main (){A a1 (1);// 隐式转换-> A tmp(1); A a2(tmp);//即先构造tmp(1) 然后再拷贝A a2(tmp)A a2 = 1;}
这也是我们之前在写模拟STL的时候为什么构造函数和拷贝构造创建好之后也可以不用重载=
因为A a2=1;编译器会进行 隐式转换。
为了阻止这种行为我们可以用explicit 关键字。explicit关键字阻止经过转换构造函数进行的隐式转换的发生
explicit A (int a){cout<<"A(int a)" <<endl;}
当不进行=赋值重载再运行代码的时候会报错。
相关文章:
c++11: 类型转换
目录 一 C语言中的类型转换 二 . C强制类型转换 1. static_cast 2. reinterpret_cast 3. const_cast 4. dynamic_cast 三 explicit 关键字 一 C语言中的类型转换 在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配ÿ…...
Matlab自学笔记五十二:变量名称:检查变量名称是否存在或是否与关键字冲突
1.变量名称的命名规则 有效的变量名称以字母开头,后跟字母、数字或下划线,Matlab变量名称对字母大小写是区分的,A和a是不相同的变量,不能使用与Matlab关键字冲突的变量名称,例如if、end等,判断一个字符是不…...
西门子PLC结构化编程_水处理系统水泵多备多投
文章目录 前言一、功能概述二、程序编写1. 需求分析2. 编写运行时间累计功能块3. 创建自定义数据类型1. 时间排序数据类型2. 多备多投数据类型3. 多备多投切换数据类型 4. 编程1. 创建DB数据块1. 多备多投数据块2. 多备多投切换数据块 2. 创建FB功能块 三、程序调用总结 前言 …...
AutoGen 框架深度解析:构建多智能体协作的事件驱动架构
在当下多智能体(Multi-Agent)AI系统快速发展的背景下,AutoGen 作为微软研究院开源的编程框架,为构建可扩展、灵活且可调试的智能体协作应用提供了完备的工具与最佳实践。本文将从设计动机、核心架构、关键概念、安装与快速上手、典型场景、进阶特性、生态与扩展、最佳实践,…...
算法相关概念
1 算法概述 1.1 算法概念 算法是特定问题求解步骤的描述,也是独立存在的一种解决问题的思想和方法 对于算法而言,实现他的编程语言无关紧要,重要的是思想和方法!!! 公式:程序算法数据结构&a…...
《Astro 3.0岛屿架构让内容网站“脱胎换骨”》
内容优先的网站越来越成为主流。无论是新闻资讯、知识博客,还是电商产品展示,用户都希望能快速获取所需内容,这对网站的性能和体验提出了极高要求。而Astro 3.0的岛屿架构,就像是为内容优先网站量身定制的一把神奇钥匙,…...
Vue3 + Element-Plus + 阿里云文件上传
Element-Plus 阿里云文件上传 1、选择文件夹方法2、Chrome 浏览器查看 input typefile 元素上传的文件方法3、上传文件4、FormDataFormData 是什么创建 FormDataFormData 常用方法FormData 的实际应用性能与注意事项总结 1、选择文件夹方法 input typefile 元素想要上传文件夹…...
【Linux】第十一章 管理网络
目录 1.TCP/IP网络模型 物理层(Physical) 数据链路层(Date Link) 网络层(Internet) 传输层(Transport) 应用层(Application) 2. 对于 IPv4 地址&#…...
用vite动态导入vue的路由配置
在Vue应用中,通过路由可以实现不同页面之间的切换,同时也可以实现页面之间的传参和控制页面的显示与隐藏。但是我们在开发的过程中,会发现在路由配置中的路由配置和我们的项目结构高度重复,在我们修改页面文件结构时非常的麻烦与复…...
sources.list.d目录
sources.list可能大家很熟悉,是配置镜像链接的地方。 sources.list.d其实就是一个目录,在linux系统中.d后缀一般定义为一个目录,且很喜欢用这种方式。 这种方式有一个好处,就是修改不会影响到sources.list文件, 在这里…...
【C语言】文件操作
目录 一为什么使用文件 二什么是文件 程序文件 数据文件 文件名 二进制文件和文本文件? 三文件的打开与关闭 流的概念 标准流 文件指针 指针的声明 指针的初始化 四文件的打开与关闭 打开 fopen()函数 五总结: 前言: …...
静态库与动态库简介
静态库与动态库简介 基本概念 静态库 静态库是在编译链接阶段被直接整合到可执行文件中的代码集合。链接器会从静态库中提取程序所需的所有对象,并将它们复制到最终的可执行文件中。 特点: 可执行文件包含了所有代码,运行时无需外部依赖…...
02《小地图实时》Unity
创建一个新的项目 创建一个球体 作为主角 重命名为Player 在主角上创建空的子物体 重命名为MiniMapIcon 增加一个精灵图片 并设置为绿色 增加一个层(目的是在小地图中看的到 而在场景中看不到这个绿色Icon) 命名为MiniMap 在主摄像机中设置剔除遮罩Culli…...
【Redis】基础4:作为分布式锁
文章目录 1. 一些概念2. MySQL方案2.1 方案一:事务特性2.1.1 存在的问题2.1.2 解决方案 2.2 方案二:乐观锁2.3 方案三:悲观锁 3. Redis3.1 实现原理3.2 实现细节3.2.1 问题1:持有期间锁过期问题3.2.2 问题2:判断和释放…...
迭代器与生成器
目录 Iterator 的作用 Iterator 的遍历过程 Symbol.iterator方法 实现iterator接口的自定义类示例 Generator函数 迭代器对象的next方法的运行逻辑 迭代器对象除了具有next方法,还可以具有return方法。 Iterator 的作用 为各种数据结构,提供一个统…...
Python 实现的运筹优化系统数学建模详解(动态规划模型)
相关代码链接:https://download.csdn.net/download/heikediguoshinib/90713747?spm1001.2014.3001.5503 一、引言 在计算机科学与数学建模的广阔领域中,算法如同精密的齿轮,推动着问题的解决与系统的运行。当面对复杂的优化问题时&…...
miniconda在ARM64位芯片上面的安装
文章目录 前言一、特点二、适用场景三、下载安装及使用1.下载脚本文件2.安装命令3.常见用法 总结 前言 Miniconda 是一个轻量级的 Python 发行版,它是 Anaconda 的一个简化版本。Anaconda 是一个广泛使用的数据科学平台,包含了众多的 Python 包和工具&a…...
vue跨域问题总结笔记
目录 一、Websocket跨域问题 1.nginx配置 2.VUE CLI代理 3.env.development配置 4.nginx日志 5.解决 一、解决跨域的几种常用方法 1.Vue CLI代理 2.JSONP 3.WebSocket 4.NGINX解决跨域问题 6.Java解决跨域 二、Vue跨域问题详解 1. 什么是跨域 2. 跨域的例子 3.…...
自动驾驶领域专业词汇(专业术语)整理
以下是分类整理的自动驾驶领域专业词汇表,涵盖 AI、芯片、传感器、自动驾驶核心、辅助驾驶、安全、通信、车灯、泊车、测试标准 等类别: AI相关 缩写英文全称中文解释AIArtificial Intelligence人工智能,模拟人类智能的技术体系NNNeural Ne…...
说一下react更新的流程
beginWork 使用v-dom和current fiber去生成子节点的workInProgress Fiber 期间会执行函数组件、类组件、diff子节点 给我需要变更的节点,打赏effectTag 增placement 2 0010 删deletion 8 1000 改 update 4 0100 增和改 placementAndUpdate…...
C 语言函数指针与指针函数详解
一、引言 在 C 语言的编程世界中,函数指针和指针函数是两个既强大又容易混淆的概念。它们为 C 语言带来了更高的灵活性和可扩展性,广泛应用于回调函数、动态链接库、状态机等多种场景。深入理解和掌握函数指针与指针函数,对于提升 C 语言编程…...
政策支持与市场驱动:充电桩可持续发展的双轮引擎
随着全球能源转型加速,新能源汽车成为实现低碳交通的重要方向。然而,充电基础设施不足仍是制约其普及的关键瓶颈。当前,国际主流的充电桩运营模式包括政府推动、电网企业推动及汽车厂商推动三种模式,但单一模式均存在显著局限性。…...
在 Ubuntu 22.04 x64 系统安装/卸载 1Panel 面板
一、 1Panel 是什么? 1Panel 是一款基于 Go 语言开发的现代化开源服务器管理面板(类似宝塔面板),专注于容器化(Docker)和云原生环境管理,提供可视化界面简化服务器运维操作。 1. 1Panel主要功…...
dummy cli-tool ubuntu22.04使用
项目场景:dummy cli-tool ubuntu22.04使用 提示:这里简述项目相关背景:执行python3 run_shell.py时报错 例如:项目场景:示例:通过蓝牙芯片(HC-05)与手机 APP 通信,每隔 5s 传输一批传感器数据(不是很大) …...
厚铜板的镀前处理差异:工艺参数与成本影响
在现代电子设备中,厚铜电路板因其优异的导电性能和良好的热管理能力而备受青睐。生产过程中,对铜层进行电镀加厚是一个关键步骤,它涉及到一系列复杂的化学和物理过程。在进行电镀之前,必须对电路板进行适当的准备工作,…...
【C到Java的深度跃迁:从指针到对象,从过程到生态】第四模块·Java特性专精 —— 第十六章 多线程:从pthread到JMM的升维
一、并发编程的范式革命 1.1 C多线程的刀耕火种 C语言通过POSIX线程(pthread)实现并发,需要开发者直面底层细节: 典型pthread实现: #include <pthread.h> int counter 0; pthread_mutex_t lock PTHREAD…...
数据库学习笔记(十三)---存储过程
前言: 学习和使用数据库可以说是程序员必须具备能力,这里将更新关于MYSQL的使用讲解,大概应该会更新30篇,涵盖入门、进阶、高级(一些原理分析);这一篇存储过程,下一篇是存储函数;虽然MYSQL命令很多,但是自…...
JWT(JSON Web Token)源码分析
Java - JWT的简单介绍和使用 Java JWT:原理、机制及案例示范 什么是JWT? 1.1 JWT的基本概念 JWT(JSON Web Token)是一种用于在各方之间传递JSON格式信息的紧凑、URL安全的令牌(Token)。JWT的主要作用是验…...
Vue 3 中通过 createApp 创建的 app 实例的所有核心方法,包含完整示例、使用说明及对比表格
以下是 Vue 3 中通过 createApp 创建的 app 实例的所有核心方法,包含完整示例、使用说明及对比表格: 1. app.component() 作用:注册全局组件 参数: name:组件名称(字符串)componentÿ…...
Hadoop 单机模式(Standalone Mode)部署与 WordCount 测试
通过本次实验,成功搭建了 Hadoop 单机环境并运行了基础 MapReduce 程序,为后续分布式计算学习奠定了基础。 掌握 Hadoop 单机模式的安装与配置方法。 熟悉 Hadoop 环境变量的配置及 Java 依赖管理。 使用 Hadoop 自带的 WordCount 示例程序进行简单的 …...
线段树合并与分解
合并 #include <bits/stdc.h> using namespace std; #define asd(i,a,b) for(int ia;i<b;i) #define int long long const int inf 0x3f3f3f3f, N 1e5 5, Z 1e5; int n, m, fa[N], o[N][25], dep[N], tot, root[N], ans[N]; vector<int> g[N]; struct node…...
驱动开发硬核特训 │ 深度解析 fixed regulator 驱动与 regulator_ops
一、引言:本次目标 本篇聚焦于: Regulator 子系统基础概念设备树节点与驱动代码的对应关系regulator_desc、regulator_ops、regulator_dev 的完整讲解驱动端的实际注册与管理流程 通过一个实际案例,系统掌握 regulator 子系统 的全貌。 二…...
Linux中的shell脚本练习
1.判断字符串是否为空 #!/usr/bin/bash while : #:默认值为真 do read -p "请输入你的密码: " a pass123456 if [ -z $a ];thenecho "您输入的密码不能为空"exit 1 elseif [ $a $pass ];thenecho "登录成功"breakelseecho "您的密码输入有…...
MySQL基础篇 | 1-数据库概述与MySQL安装
【MySQL基础篇-1】数据库概述与MySQL安装 1. 数据库概述2. MySQL环境搭建2.1. MySQL的四大版本2.2. 软件下载1. 数据库概述 MySQL官网网站:https://dev.mysql.com/doc/relnotes/mysql/8.0/en/ SQL Server:SQL Server是微软开发的大型商业数据库。C#、.net等语言常使用,与wi…...
JVM 自动内存管理
一、运行时数据区域详解 Java 虚拟机在运行 Java 程序时,会将所管理的内存划分为多个不同的数据区域,各区域有着独特的用途、创建和销毁时间。 程序计数器:作为线程私有的较小内存空间,它是当前线程执行字节码的行号指示器。字节…...
InitializingBean接口和@PostConstruct-笔记
1. InitializingBean 简介 1.1 功能简介 InitializingBean 是 Spring 框架中的一个接口,用在 Bean 初始化后执行自定义逻辑。它提供了 afterPropertiesSet() 方法,该方法在以下时机被 Spring 容器自动调用: 属性注入完成后(即所…...
考研408-计算机组成原理冲刺考点(1-3章)
第一章 计算机系统概述 1.计算机核心 早期的冯诺依曼计算机是以运算器为中心的,而现在的计算机是以存储器为中心的 2.五大部件 3.汇编程序、编译程序、解释程序的辨析...
模板方法模式(Template Method Pattern)
模板方法模式(Template Method Pattern)是一种行为型设计模式,它定义了一个操作中的算法骨架,将一些步骤的实现延迟到子类中。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。 一、基础 1. 意图 定义一个操作中的算法骨架,将某些步骤延迟到…...
一文了解无人机系统
无人机系统,又称无人驾驶航空器系统(Remotely Piloted Aircraft System,RPAS),作为一个由无人机平台、遥控站、指令与控制数据链及其他部件构成的完整技术体系,其系统架构包含多个核心分系统。具体而言&…...
系统架构师2025年论文《论软件的设计模式》
论软件的设计模式 摘要: 2016 年,我所在的公司承担了某市医院预约挂号系统的研发任务。我作为公司的技术总监,希望能打造基于该系统的系列产品,参与到项目的设计中,以期开发扩展性和可维护性良好的预约挂号系统,为以后的产品开发打下基础。网络靶场是网络安全技术研究的…...
集成电路流片随笔19:full_handshake
全双工握手接收模块 (full_handshake_rx),它的功能是接收来自发送端 (tx) 的数据,并对发送端进行应答(ACK)。模块实现了基于握手的通信机制,以确保数据的可靠传输。模块的输入输出分别连接于发送端和接收端,…...
Android Framework 探秘
以下文字来源AI,准确性不敢保证! 安卓Framework层概述 安卓的 Framework(框架层) 是安卓系统的核心组成部分,位于应用层和系统底层(如Linux内核)之间,负责为应用提供统一的接口和功…...
亚马逊云科技2025战略解析:AI驱动下的全球生态重塑
一、战略转向:从“云优先”到“AI优先”的核心逻辑 1. 千亿美元资本投入AI基建 芯片自研突破:2025年资本支出70%投向AI芯片与液冷数据中心。自研芯片矩阵全面升级,包括3纳米工艺的Trainium3(算力提升4倍)、单核性能…...
NGINX ngx_http_addition_module 模块响应体前后注入内容
一、模块概述 模块名称:ngx_http_addition_module引入版本:自 0.7.9 起支持 addition_types,0.8.29 起支持“*”通配;功能:对符合 MIME 类型的响应,在响应体前后分别插入指定子请求 URI 返回的内容&#x…...
SpringMVC 使用thymeleaf 进行数据展示
thymeleaf 是前端的视图解析器,可以用于html页面上变量的渲染,如何来使用thymeleaf,下面我们来说一下: 首先引入相关的依赖: <dependency><groupId>org.thymeleaf</groupId><artifactId>thym…...
Github两种鉴权模式PAT与SSH
Github两种鉴权模式PAT与SSH 文章目录 Github两种鉴权模式PAT与SSH1. PAT鉴权2. SSH鉴权3.两种鉴权的切换 1. PAT鉴权 通过 HTTPS 协议克隆和推送代码,使用用户名/密码或个人访问令牌(PAT)鉴权,所以PAT是与HTTPS协议相关的。该鉴…...
XrayR启动失败
公司要用服务器之间进行数据加密,这里用的XrayR 我使用的Centos 7。 我这里使用一键脚本安装后,/etc/XrayR目录下没有配置文件。 解决方案 XrayR安装时,系统没有unzip工具,也是会安装失败的,因为Centos7已经停止维…...
FPGA-数字时钟
FPGA-数字时钟 总体设计 用FPGA驱动数码管按照HH-MM-SS的格式显示时间,每秒用串口向上位机发送当前时间,当串口收到HH:MM:SS,对时间进行校准。由于年月要考虑到大小月,闰年等。为了简单起见,只考虑时分秒。 数码管…...
数据结构 RBT 插入操作的 Python 代码实现
目录 一、红黑树的性质二、红黑树的插入1. 插入根节点或根节点变红2. 双亲节点 P 为黑色3. 双亲结点 P 和叔伯结点 U 均为红色4. 双亲结点 P 为红色,叔伯结点 U 为黑色或缺失1)情形一2)情形二 三、插入的 Python 代码实现 红黑树动画演示网站…...
颖儿生活提案:用海信璀璨505U6真空冰箱重建都市鲜食自由
热播剧《六姊妹》中,演员颖儿饰演的何家艺以泼辣坚韧的形象深入人心,一双手撑起家庭的"烟火气";戏外,她平衡事业与家庭,以自律姿态书写鲜活人生。 近日,颖儿向公众展示家中厨房,意外…...