【C++】C++的类型转换
文章目录
- 1. C语言中的类型转换
- 2. C++中的类型转换
- 2.1 static_cast
- 2.2 reinterpret_cast
- 2.3 const_cast
- 2.4 dynamic
1. C语言中的类型转换
在C语言中,经常会出现一种情况:运算符两边的类型不同,或者形参实参类型不匹配,此时就会发生类型转化。在C语言中,类型转化分为两种:隐式类型转换和显式类型转换。
- 隐式类型转换:编译器在变异阶段自动进行,如果能转换就自动转换,不能就报错
- 显示类型转换:用户自己处理
void test1()
{int i = 1;// 隐式类型转换double d = i;printf("%d, %.2f\n" , i, d);int* p = &i;// 显示的强制类型转换int address = (int)p;printf("%x, %d\n" , p, address);
}
隐式类型转化有些情况下可能会出问题:
- 比如数据精度丢失
- 显式类型转换将所有情况混合在一起,代码不够清晰
2. C++中的类型转换
由于C语言的类型转换的缺陷,C++为了加强类型转换的可视性,引入了四种命名的强制类型转换操作符:static_cast、reinterpret_cast、 const_cast、 dynamic_cast
2.1 static_cast
static_cast用于非多态类型的转换(静态转换),编译器隐式执行的任何类型转换都可用static_cast,但它不能用于两个不相关的类型进行转换
用法:static_cast<typename>(variablename);其中typename是将要转换的类型,variablename是要被转换的变量。
void test1()
{double d = 12.34;int a = static_cast<int>(d);int b = d;cout<< a << " " << b <<endl;
}
总结:static_cast对标C语言类型转换的隐式类型转换,要求两个类型必须要相关
2.2 reinterpret_cast
reinterpret_cast操作符通常为操作数的位模式提供较低层次的重新解释,用于将一种类型转换 为另一种不同的类型
void test2()
{int a = 12;//int* p = static_cast<int*>(a);//这里使用static_cast就会报错int* p = reinterpret_cast<int*>(a);cout << p << endl;
}
总结:reinterpret_cast对标的是C语言的强制类型转换,不要求两个类型是相关类型
2.3 const_cast
const_cast最常用的用途就是删除变量的const属性,方便赋值
void test3()
{const int a = 10;//a = 20;//这里由于a是const修饰的变量,所以不能修改int* p = const_cast<int*>(&a);*p = 20;cout << a << " " << *p << endl;
}
拓展知识:如果运行上述的test3代码就会发现,打印出来的
a和*p的值并不一样,这是什么原因呢?![]()
这是因为对于const修饰的变量,编译器会认为它不会被修改,所以会存放在一个寄存器内部,每次访问的时候直接访问寄存器内部的值,所以不会更改。如果想要让他每次都从内存中访问的话,需要加上
volatile关键字。
2.4 dynamic
dynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换)
这里补充一下向上转换和向下转换的概念:
向上转换:由子类(对象/指针/引用)向父类(对象/指针/引用)的转换
向下转换:由父类(对象/指针/引用)向子类(对象/指针/引用)的转换
其中,向上转换是天然被允许的,中间没有类型转换,也不会产生临时对象,但是向下转换可能会出现数组越界之类的问题,因此是不安全的
class A { public:virtual void f() {}int _a = 1; }; class B : public A { public:void f() {}int _b = 2; }; void func(A* ptr) {B* bptr = (B*)ptr;cout << bptr->_b << endl;cout << bptr->_a << endl; } void test4() {A aa;B bb;func(&aa);func(&bb); }这里对于A类型的对象,如果要访问_b成员就会出现越界访问的问题。
而dynamic_cast 的作用就是将一个父类对象的指针/引用转换为子类对象的指针或引用 (向下转型)。需要注意的是:
dynamic_cast只能用于父类含有虚函数的类。dynamic_cast会检查是否能转换成功,能则进行转换,不能则返回nullptr。
void func(A* ptr)
{//B* bptr = (B*)ptr;B* bptr = dynamic_cast<B*>(ptr);if(bptr == nullptr){cout << "类型转换错误:出现向下转换" << endl;return;}cout << bptr->_b << endl;cout << bptr->_a << endl;
}

注意:一般情况下我们应该避免使用强制类型转换,因为强制类型转换关闭或挂起了正常的类型检查;所以每次在使用强制类型转换前,程序员应该仔细考虑是否还有其他不同的方法达到同一目的,如果非强制类型转换不可,则应限制强制转换值的作用域,以减少发生错误的机会。
本节完…
相关文章:
【C++】C++的类型转换
文章目录 1. C语言中的类型转换2. C中的类型转换2.1 static_cast2.2 reinterpret_cast2.3 const_cast2.4 dynamic 1. C语言中的类型转换 在C语言中,经常会出现一种情况:运算符两边的类型不同,或者形参实参类型不匹配,此时就会发生…...
ahk系列——ahk_v2实现win10任意界面ocr
前言: 不依赖外部api接口,界面简洁,翻译快速,操作简单, 有网络就能用 、还可以把ocr结果非中文翻译成中文、同样可以识别中英日韩等60多个国家语言并翻译成中文,十分的nice 1、所需环境 windows10及其以上…...
linux下端口映射
linux下端口映射 1. 允许数据包转发 echo 1 >/proc/sys/net/ipv4/ip_forwardiptables -t nat -A POSTROUTING -j MASQUERADEiptables -A FORWARD -i [内网网卡名称] -j ACCEPTiptables -t nat -A POSTROUTING -s [内网网段] -o [外网网卡名称] -j MASQUERADE# 例:…...
C++ 迭代器(iterator)
迭代器介绍 迭代器(iterator):容器类型内置的“指针” - 使用迭代器可以访问某个元素,迭代器也能从一个元素移动到另一个元素。 - 有迭代器的类型都拥有 begin 和 end 成员- begin:返回指向第一个元素(或字…...
基于Python3搭建qt开发环境
Python可视化编程相信大部分刚接触都是tkinter,tkinter是Python自带的库,不需要安装第三方库即可使用,在我的Python专栏中也有很多基于tkinter来设计的可视化界面。本篇文章将尝试另外一个Python的可视化编程库(pyqt),与tkinter编…...
Linux常见操作命令(1)
前言:作者也是初学Linux,可能总结的还不是很到位 ♈️今日夜电波:达尔文—林俊杰 0:30━━━━━━️💟──────── 4:06 🔄 ◀️ …...
GEO生信数据挖掘(一)数据集下载和初步观察
检索到目标数据集后,开始数据挖掘,本文以阿尔兹海默症数据集GSE1297为例 目录 GEOquery 简介 安装并加载GEOquery包 getGEO函数获取数据(联网下载) 更换下载数据源 对数据集进行初步观察处理 GEOquery 简介 GEOquery是一个…...
Tensorflow2 GPU 安装方法
一、Tensorflow2 GPU 安装方法 1. 首先安装Anaconda3环境2. 在Anaconda Prompt 中安装tensorflow23. 验证GPU是否可以使用 1. 首先安装Anaconda3环境 https://www.anaconda.com/ 2. 在Anaconda Prompt 中安装tensorflow2 conda update conda conda create -n tensorflow pyt…...
QSS之QLineEdit
QLineEdit我们在开发过程中是经常使用的,一般情况下默认的风格是不适合设计师的要求,本篇介绍QLineEdit的基本qss风格: 1.基本属性设置 QLineEdit{background-color:#FFFFFF;color:#333333;border:none;} 2.悬浮状态设置 QLineEdit:hover…...
在比特币上支持椭圆曲线 BLS12–381
通过使用智能合约实现来支持任何曲线 BLS12–381 是一种较新的配对友好型椭圆曲线。 与常用的 BN-256 曲线相比,BLS12-381 的安全性明显更高,并且安全目标是 128 位。 所有其他区块链,例如 Zcash 和以太坊,都必须通过硬分叉才能升…...
简单讲解 glm::mat4
文章目录 前言一、下载glm库二、基本数学知识1. 三维中的 4 x 4 矩阵2.旋转3. 位移4. 缩放5. 组合 三、行向量或列向量四、总结 前言 glm库是OpenGL的官方数学库,里面内置多种跟几何变换相关的函数,熟练掌握glm库可以省下很多麻烦。 因为最近在项目中主…...
第3章-指标体系与数据可视化-3.1.1-Matplotlib绘图库
目录 3.1 Python可视化 3.1.1 Matplotlib绘图库 1. 线图 2. 饼图 3. 条形图 4. 直方图 5.散点图...
探索视听新纪元: ChatGPT的最新语音和图像功能全解析
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🐅🐾猫头虎建议程序员必备技术栈一览表📖: 🤖 人工智能 AI: 🧠 Machine …...
华为乾坤区县教育安全云服务解决方案(1)
华为乾坤区县教育安全云服务解决方案(1) 课程地址方案背景客户痛点分析区县教育网概述区县教育网业务概述区县教育网业务安全风险分析区县教育网安全运维现状分析区县教育网安全建设痛点分析 安全解决方案功能概述架构概述方案架构设备选型 课程地址 本…...
《Jetpack Compose从入门到实战》第三章 定制 UI 视图
目录 配置颜色、字体与形状Welcome PageLogin PageHome Page 主题CompositionLocal 配置颜色、字体与形状 -ui.theme.Color.kt val pink100 Color(0xFFFFF1F1) val pink900 Color(0xFF3F2C2C) val white Color(0xFFFFFFFF) val white850 Color(0xD9FFFFFF) val gray Col…...
Kubernetes组件和架构简介
目录 一.概念简介 1.含义: 2.主要功能: 3.相关概念: 二.组件和架构介绍 1.master:集群的控制平面,管理集群 2.node:集群的数据平面,为容器提供工作环境 3.kubernetes简单架构图解 一.概…...
ElementUI实现增删改功能以及表单验证
目录 前言 BookList.vue action.js 展示效果 前言 本篇还是在之前的基础上,继续完善功能。上一篇完成了数据表格的查询,这一篇完善增删改,以及表单验证。 BookList.vue <template><div class"books" style"pa…...
C++中有哪些运算符以及它们的优先级?
C中常用的运算符包括算术运算符、赋值运算符、关系运算符、逻辑运算符、位运算符等。这里列举一些常见的运算符以及它们的优先级(从高到低): 圆括号()一元正号、一元负号-数组下标[]成员选择符(点号.、箭头…...
uboot启动流程-涉及_main汇编函数
一. uboot启动流程涉及函数 本文简单分析一下 save_boot_params_ret调用的函数:_main汇编函数。 本文继之前文章的学习,地址如下: uboot启动流程-涉及s_init汇编函数_凌肖战的博客-CSDN博客 二. uboot启动流程涉及的 _main汇编函数 经过之…...
此芯科技加入百度飞桨硬件生态共创计划,加速端侧AI生态布局
近日,此芯科技(上海)有限公司(以下简称“此芯科技”)与百度签署硬件生态共创计划合作协议,正式加入由百度发起的硬件生态共创计划。双方将共同推动端侧AI和大模型在个人计算、车载计算以及元宇宙计算等领域…...
告别重复配置,用快马生成可共享的virtualbox开发环境模板提升团队效率
在团队协作开发中,最让人头疼的莫过于每个成员都要重复配置相同的开发环境。尤其是使用VirtualBox这类虚拟机时,从安装系统到配置依赖,往往要耗费数小时。最近我发现了一个能大幅提升效率的方法——通过InsCode(快马)平台生成可共享的Virtual…...
Fish Speech 1.5企业落地手册:对接CRM/知识库构建智能语音助手
Fish Speech 1.5企业落地手册:对接CRM/知识库构建智能语音助手 想象一下,你的客户服务系统能自动用自然、亲切的声音回答客户咨询,你的内部知识库能“开口说话”,为员工提供语音指引。这听起来像是科幻场景,但今天&am…...
多语言支持测试:OpenClaw对接Qwen3-32B镜像处理非英语任务
多语言支持测试:OpenClaw对接Qwen3-32B镜像处理非英语任务 1. 测试背景与实验设计 最近在探索如何用本地化AI工具处理多语言工作流时,我注意到OpenClaw框架的灵活性——它不仅能对接各类大模型,还能通过技能扩展实现跨语言自动化。这次我决…...
保姆级教程:用Python和Open3D玩转激光雷达点云与图像融合(附KITTI数据集实战)
从零实现激光雷达与相机融合:Open3DKITTI实战指南 当激光雷达的精确测距遇上相机的丰富纹理,自动驾驶感知系统便拥有了"立体视觉"——这正是多模态融合技术的魅力所在。本文将带您用Python和Open3D构建一个完整的点云-图像融合流水线ÿ…...
Sinkhorn算法实战:用Python手把手教你解决最优传输问题(附完整代码)
Sinkhorn算法实战:用Python手把手教你解决最优传输问题(附完整代码) 最优传输理论在机器学习领域正掀起一场静默的革命。想象一下这样的场景:你需要将一组资源从A地运往B地,同时希望运输成本最低;或者你需要…...
春联生成模型-中文-base实战教程:对接企业微信机器人自动发春联
春联生成模型-中文-base实战教程:对接企业微信机器人自动发春联 春节将至,给同事、客户或社群成员发送一份AI生成的专属春联,是不是既新颖又有心意?手动一个个生成再发送,效率太低。今天,我们就来实战一个…...
tinyECC:Arduino嵌入式平台的轻量级ECC密码库
1. tinyECC 库概述:面向 Arduino 微控制器的轻量级椭圆曲线密码学实现tinyECC 是一个专为资源受限的 Arduino 微控制器平台设计的嵌入式椭圆曲线密码学(Elliptic Curve Cryptography, ECC)库。其核心目标是在仅有几 KB RAM 和数十 KB Flash 的…...
MOS管LC震荡电路偏置电压调整全攻略:LTspice仿真与实测对比
MOS管LC震荡电路偏置电压调整全攻略:LTspice仿真与实测对比 在电子电路设计中,MOS管LC震荡电路因其结构简单、频率稳定而被广泛应用。然而,要让这种电路发挥最佳性能,偏置电压的精确调整往往成为工程师面临的最大挑战。本文将带您…...
AudioSeal Pixel Studio代码实例:检测结果可视化图表生成脚本
AudioSeal Pixel Studio代码实例:检测结果可视化图表生成脚本 1. 工具概述与核心价值 AudioSeal Pixel Studio是一款基于Meta开源的AudioSeal算法构建的专业音频水印工具。它能够在保持原始音频质量的前提下,为音频文件嵌入几乎不可察觉的数字水印&…...
颗粒结构:基础但容易被忽视
在COMSOL中二氧化碳电化学还原过程中不同催化剂结构对离子传输的影响的模拟分析搞电化学的小伙伴们都知道,催化剂长得像撒了把芝麻似的颗粒结构最省事。但在COMSOL里建模时千万别直接右键画球体——试试这个骚操作:model.geom("geom1").featur…...

