c/c++类型转换

目录

1、c语言中的类型转换

c++中的类型转换

1、内置类型和自定义类型的隐式转换(借助构造)

2、自定义类型和自定义类型的隐式转换(借助构造)

3、内置类型转自定义类型的隐式转换(重载一个operator 类型)

新增的四种强制类型转换

1、static_cast

2、reinterpret_cast

3、const_cast

4、dynamic_cast

总结:

4、RTTI

重点:


1、c语言中的类型转换

在c语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接受返回值类型不一致时,就需要发生类型转化。

c语言中有2种类型转换:隐式类型转换、显式类型转换

隐式:编译器在编译阶段自动进行,能赚就转,不能转就编译失败

显示:需要用户自己处理。

1、有一定关联的才可以互相转换
    跟整型搭边的,才可以进行隐式类型转换,如下
    char-整型,浮点数-整型 ,有符合-无符号,这些转换会涉及截断、提升
    截断和提升可以看我另外的文章《关于操作符的内容》
    bool和整形 bool和指针(指针为空指针就是0,0就是假,非空指针就是非0,非0就是真)
    

2、指针和整型,有一定关联,指针本身也是数字编号
    所以虽然不能隐式类型转换,但强制的、显式的转换是可行的

3、不同类型之间可以借用指针进行强制转换
    比如h1是个自定义对象,我们如果只想要这个对象的前4个字节
    arc *p1=&h1;
    int* x=(int*)p1;
    这样就可以把指针强制转换类型,然后就可以访问前4个字节(int占4字节)。

int main()
{int a1 = 1;//隐式double a2 = a1;printf("%d,%.2f\n", a1, a2);int* p = &a1;//显式int ad = (int)p;printf("%x,%d\n", p, ad);return 0;
}

缺陷:隐式类型转换,可能出现精度丢失的问题(如double-int)

显式转换把所有情况都混合在一起,代码不清晰

比如无符号无法小于0,导致无符号与无符号比较时,可能出现死循环等问题

又比如int跟size_t比较,int会隐式转换成size_t,而负数的int也会照样转,所以还是会出问题。

size_t x=0;
size_t a=10;
while(a>=x)
{cout<<a<<endl;x--;
}
//会死循环size_t x=0;
int a=10;
while(a>=x)
{cout<<a<<endl;x--;
}//会死循环

c++中的类型转换

 c++是兼容c的,所以c的也能用,c++只是较于c新增了一些内容。

1、内置类型和自定义类型的隐式转换(借助构造)

string s = "231213";
//单参数的构造函数,支持内置类型隐式转换成自定义类型。

上面就是将const char*通过隐式类型转换,在编译器不优化的情况下:先用const char*构造一个临时的string对象,再调用s的拷贝构造,把这个临时对象拷贝给s。优化之后就是直接用const char*构造s。

2、自定义类型和自定义类型的隐式转换(借助构造)

比如vector增加的initializer_list参数的构造函数,stack<pair<int,int>>,都是把一个自定义对象作为构造的参数之一,来构造一个新的自定义对象。

3、内置类型转自定义类型的隐式转换(重载一个operator 类型)

class pl {
public://特殊写法,不要加返回值,否则会跟仿函数冲突operator int() {return x1 * x2;}
private:int x1 = 1, x2 = 2;
};int main()
{pl x3;//int a = (int)x3;也可以int a = x3;cout << a << endl;return 0;
}

新增的四种强制类型转换

1、static_cast

用于非多态类型的转换(静态转换),编译器隐式执行的任何类型转换都可用static_cast,但不能用于两个不相关的类型进行转换。

int main()
{float x = 10.10;int f = static_cast<int>(x);cout << f << endl;//10return 0;
}

2、reinterpret_cast

通常为操作数的位模式提供较低层次的重新解释,比如指针。对应c语言的强制类型转换

int main()
{int a = 10;//int* p = static_cast<int*>(a);会报错,因为指针必须用强转int* p = reinterpret_cast<int*>(&a);return 0;
}

3、const_cast

const_cast最常用的用途就是删除变量的const属性,方便赋值,但本身也是强制类型转换,只是单独的把去const的功能拎出来,并且提醒const有一定编译器优化的风险,具体看下面。

int main()
{const int a = 10;int* p = const_cast<int*>(&a);*p = 10;return 0;
}

这个要注意一个坑

int main()
{const int a = 10;int* p = const_cast<int*>(&a);*p = 5;cout << a << endl;//10cout << (*p) << endl;//5return 0;
}

因为编译器的优化,导致对于这些const修饰的变量会复制一份到寄存器,而p接受的地址,是a变量的内存的地址,虽然修改成了5,也只是改了在内存的那一份,而寄存器的仍旧是10

如果用监视窗口查看,会发现在监视窗口a已经被改成了5,因为监视窗口针对的是内存。

为此,我们可以a加个修饰  volatile const int a   加了这个修饰,就不会复制一份到寄存器

4、dynamic_cast

用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换)

向上转型:子类对象指针/引用 -》父类指针/引用(不需要转换,直接切片拷贝过去,是遵循继承的赋值兼容规则的)

向下转型:父类对象指针/引用-》子类指针/引用(用dynamic_cast转型是安全的)

因为子类对象可能会有新的成员,而如果利用赋值兼容,把父类对象给了子类指针,那么子类指针访问子类的新的成员,会有越界的风险问题。

注意事项:

1、dynamic_cast只用于父类含有虚函数的类。

2、dynamic_cast会先检查是否能转化成功,能成功则转换,不成功返回0。

class F {
public:virtual void f() {}
};
class X :public F
{};
void fun(F* pa)
{//有风险//X* pb = (X*)pa;X* pb = dynamic_cast<X*>(pa);if (pb){cout << "成功" << endl;}else{cout << "失败" << endl;}
}
int main()
{F a;X b;fun(&a);//失败fun(&b);//成功return 0;
}

总结:

强制类型转换关闭或者说是挂起了正常的类型检查,每次使用强转前,先想想能不能不转也达到目的,如果非转不可,就限制转换出来的值的作用域,减少发生错误的概率。

4、RTTI

 RTTI:Run-time Type identification 的简称,即:运行时类型识别

c++通过以下方式支持RTTI:

typeid、dynamic_cast、decltype

重点:

 c++新增的4种强制类型转换是什么

这几个转换的应用场景是什么

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

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

相关文章

Bitbucket 设置SSH KEY方法

0 Preface/Foreword SSH具有传输安全特点&#xff0c;受到广泛使用。 1 添加方法 Bitbucket也是代码托管平台&#xff0c;跟GitLab类似。SSH key的设置方法也跟GitLab类似。 在个人profile设置界面&#xff0c;添加SSH KEY。

和鲸科技推出人工智能通识课程解决方案,助力AI人才培养

2025年2月&#xff0c;教育部副部长吴岩应港澳特区政府邀请&#xff0c;率团赴港澳宣讲《教育强国建设规划纲要 (2024—2035 年)》。在港澳期间&#xff0c;吴岩阐释了教育强国目标的任务&#xff0c;并与特区政府官员交流推进人工智能人才培养的办法。这一系列行动体现出人工智…

Ollama下载安装+本地部署DeepSeek+UI可视化+搭建个人知识库——详解!(Windows版本)

目录 1️⃣下载和安装Ollama 1. &#x1f947;官网下载安装包 2. &#x1f948;安装Ollama 3.&#x1f949;配置Ollama环境变量 4、&#x1f389;验证Ollama 2️⃣本地部署DeepSeek 1. 选择模型并下载 2. 验证和使用DeepSeek 3️⃣使用可视化工具 1. Chrome插件-Page …

STM32中使用PWM对舵机控制

目录 1、硬件JIE 2、PWM口配置 3、角度转换 4、main函数中应用 5、工程下载连接 1、硬件介绍 单片机&#xff1a;STM32F1 舵机&#xff1a;MG995 2、PWM口配置 20毫秒的PWM脉冲占空比&#xff0c;对舵机控制效果较好 计算的公式&#xff1a; PSC、ARR值的选取&#xf…

Java+Vue+uniapp微信小程序校园自助打印系统(程序+论文+讲解+安装+调试+售后)

感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望帮助更多的人。 系统介绍 在当今时代&#xff0c;网络与科学技术正以前所未有的速度迅猛发展&#xff0c;这股强大…

如何利用爬虫测试1688商品详情接口

在电商数据分析、市场调研以及商品信息管理等领域&#xff0c;获取1688商品详情数据具有重要意义。虽然1688开放平台提供了官方API接口&#xff0c;但通过爬虫技术获取数据也是一种高效且灵活的方式。本文将详细介绍如何利用爬虫测试1688商品详情接口&#xff0c;包括环境搭建、…

期权帮|国内期权交易投资人做卖出期权价差交易收取的保证金是单边的还是双向的?

锦鲤三三每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 国内期权交易投资人做卖出期权价差交易收取的保证金是单边的还是双向的? 在国内期权交易中&#xff0c;投资人做卖出期权价差交易时收取的保证金通常是单边的&#xff0c;但具…

spring security

DefaultLoginPageGeneratingFilter 生成默认的登录页 只有当 登录请求、登录错误、退出登录成功时&#xff0c;才返回登录页面 DefaultLogoutPageGeneratingFilter 退出登录页 只有 logout时返回 spring security 开箱即用&#xff0c;主要是做一些配置&#xff0c;下面是基本…

vue2版本elementUI的table分页实现多选逻辑

1. 需求 我们需要在表格页上实现多选要求&#xff0c;该表格支持分页逻辑。 2. 认识属性 表格属性 参数说明类型可选值默认值data显示的数据array——row-key行数据的 Key&#xff0c;用来优化 Table 的渲染&#xff1b;在使用 reserve-selection 功能与显示树形数据时&…

专业的UML开发工具StarUML

专业的UML开发工具StarUML 可靠的软件建模软件StarUML StarUML 是一款支持统一建模语言 (UML)框架的开源建模软件。它提供了几种类型的图表&#xff0c;并允许用户生成多种语言的代码。在它的帮助下&#xff0c;软件开发人员可以创建设计、概念和编码解决方案。但是&#xff0…

wav格式的音频压缩,WAV 转 MP3 VBR 体积缩减比为 13.5%、多个 MP3 格式音频合并为一个、文件夹存在则删除重建,不存在则直接建立

&#x1f947; 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 &#x1f389; 声明: 作为全网 AI 领域 干货最多的博主之一&#xff0c;❤️ 不负光阴不负卿 ❤️ 文章目录 问题一&#xff1a;wav格式的音频压缩为哪些格式&#xff0c;网络传输给用户播放…

利用node.js搭配express框架写后端接口(一)

Node.js 凭借其高效的非阻塞 I/O 操作、事件驱动架构以及轻量级的特点&#xff0c;成为了开发高性能服务器应用的热门选择。Express 框架作为 Node.js 上最流行的 Web 应用框架之一&#xff0c;以其简洁的 API 和丰富的中间件生态系统&#xff0c;极大地简化了 Web 后端开发流程…

黑马Java面试教程_P5_微服务

系列博客目录 文章目录 系列博客目录1.引言2.Spring Cloud2.1 Spring Cloud 5大组件有哪些?面试文稿 2.2 服务注册和发现是什么意思?Spring Cloud 如何实现服务注册发现?面试文稿 2.3 我看你之前也用过nacos、你能说下nacos与eureka的区别?面试文稿 2.4 你们项目负载均衡如…

深入了解 Python 中的 MRO(方法解析顺序)

文章目录 深入了解 Python 中的 MRO&#xff08;方法解析顺序&#xff09;什么是 MRO&#xff1f;如何计算 MRO&#xff1f;C3 算法的合并规则C3 算法的合并步骤示例&#xff1a;合并过程解析 MRO 解析失败的场景使用 mro() 方法查看 MRO示例 1&#xff1a;基本用法 菱形继承与…

信息系统的安全防护

文章目录 引言**1. 物理安全****2. 网络安全****3. 数据安全****4. 身份认证与访问控制****5. 应用安全****6. 日志与监控****7. 人员与管理制度****8. 其他安全措施****9. 安全防护框架**引言 从技术、管理和人员三个方面综合考虑,构建多层次、多维度的安全防护体系。 信息…

Tailwind CSS 4【实用教程】

官网 https://tailwindcss.com/docs/installation/using-vite Tailwind CSS 是一个实用优先的 CSS 框架 特色 原子化样式类名可深度定制主题插件丰富 安装配置导入 vite 中 pnpm add tailwindcss tailwindcss/vitevite.config.ts 中配置 import tailwindcss from tailwindcs…

ChatGPT 提示词框架

作为一个资深安卓开发工程师&#xff0c;我们在日常开发中经常会用到 ChatGPT 来提升开发效率&#xff0c;比如代码优化、bug 排查、生成单元测试等。 但要想真正发挥 ChatGPT 的潜力&#xff0c;我们需要掌握一些提示词&#xff08;Prompt&#xff09;的编写技巧&#xff0c;并…

毕业项目推荐:基于yolov8/yolo11的苹果叶片病害检测识别系统(python+卷积神经网络)

文章目录 概要一、整体资源介绍技术要点功能展示&#xff1a;功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出&#xff08;xls格式&#xff09;功能6 支持切换检测到的目标查看 二、数据集三、算法介绍1. YO…

【Python 入门基础】—— 人工智能“超级引擎”,AI界的“瑞士军刀”,

欢迎来到ZyyOvO的博客✨&#xff0c;一个关于探索技术的角落&#xff0c;记录学习的点滴&#x1f4d6;&#xff0c;分享实用的技巧&#x1f6e0;️&#xff0c;偶尔还有一些奇思妙想&#x1f4a1; 本文由ZyyOvO原创✍️&#xff0c;感谢支持❤️&#xff01;请尊重原创&#x1…

VM虚拟机安装与配置Ubuntu Linux操作系统详细教程~

一、下载VM虚拟机 VMware16.0.zip百度网盘下载链接:https://pan.baidu.com/s/1-l-CcAVNINqhRLSiQ26R7w?pwd=tznn 提取码: tznn 二、软件介绍 VMware(虚拟机)是指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统,通过它可在一台电脑上同…