当前位置: 首页 > article >正文

C++类型转换详解

目录

一、内置 转 内置

二、内置 转 自定义

三、自定义 转 内置

四、自定义 转 自定义

五、类型转换规范化

1.static_case

2.reinterpret_cast

3.const_cast

4.dynamic_cast

六、RTTI


一、内置 转 内置

        C++兼容C语言,在内置类型之间转换规则和C语言一样的,C/C++语言因为允许类型转换所以不是类型安全的语言。

隐式转化:编译器识别出类型不同后,能转就转,不能转则报错。

例如:

  • int = 'a' 
  • char = 4
  • int = 8.26

除此之外函数调用中形参和实参的类型不同时,编译器会尝试进行隐式转化。

显示转化(强制类型转化):用户进行指定的显示转换。

例如:

  • int = (int)'a' 
  • char = (char)4
  • int = (int)8.26

什么时候能转什么时候不能转呢?

        通常有关联性的类型,有转换意义的类型都是可以转化的。比如int类型与double类型,float类型,short类型等,都是描述数字的大小,又或者各种指针类型之间。

        又比如int与指针不能隐式转换,因为转化后也是无意义的。但可以显示转化(强制类型转化)。

二、内置 转 自定义

        c++中支持内置类型转自定义类型,只需要提供相应的构造函数,就可以想怎么转就怎么转,全在于你的构造函数怎么实现。如下:

using namespace std;
class A
{
public:A(int x):a(x),b(x){}A(int x,int y,int z):a(x), b(y+z){}
private:int a;int b;
};
void fun(A x)
{//......
}
int main()
{int v = 10;A a1 = v;//int类型隐式转化为A类型A a2 = { 1,2,3 };fun(6);return 0;
}
  • A a1 = v:调用构造函数产生临时对象,然后调用拷贝赋值。逻辑上是这样,但实际上会被编译器优化。
  • A a2 = {1,2,3}:通过花括号传入多个参数构造临时对象,然后调用拷贝赋值。
  •  fun(6):在函数传参时,同样会隐式转换,不用单独构造出类型后传入,这样就显得方便得多。

在构造函数的函数名前加关键字explicit:不被允许隐式转换,要进行转换需要显示的进行。

三、自定义 转 内置

        c++中支持自定义类型转内置类型,提供相应的运算符重载函数(operator),同样可以想怎么转就怎么转,都是自己设定的。

        强制类型转化的运算符是(),按理来说应该重载()运算符,但是又与仿函数冲突,所以c++制定了特殊的函数来做类型转化,即:

  • operator 类型 ()

该函数不用写返回类型,但在函数名后面需要加目标类型,函数结束也需要return返回。

class A
{
public:A(int x,int y):_a(x),_b(y){}operator int(){return _a + _b;}
private:int _a;int _b;
};
int main()
{A a1 = { 1,3 };int x = a1;return  0;
}

同样可以使用explicit修饰,修饰后不支持隐式转化。

        比如在c++智能指针shared_ptr中使用了operator bool()把指针转换为bool类型来判断指针是否为空,如下:

测试如下:

#include <iostream>
#include <memory>
using namespace std;
int main()
{shared_ptr<int> p(new int(10));if (!p)//隐式转换为bool类型cout << "p为nullptr";else cout << "p不为nullptr";return 0;
}

四、自定义 转 自定义

        c++中自定义与自定义之间同样可以转换,核心是让构造函数产生临时对象。比如我们要让B类型转换为A类型,我们可以构造这样一个函数:

class A
{
public:A(int x):_a(x),_b(x){}int get_a(){return _a;}
private:int _a;int _b;
};
class B
{
public:B(A x):_val(x.get_a()){}
private:int _val;
};
int main()
{A a = 4;B b = a;return  0;
}

五、类型转换规范化

        C 风格的类型转换过于“暴力”,允许许多不安全的转换。C++提供的 显式类型转换运算符来替代传统的 C 风格强制类型转换(如 (int)x)。这种机制的目的是提高代码的 类型安全性可读性 和 维护性,同时限制不安全的隐式转换。

它有四种类型转换运算符,接下来我们依次来学习。

1.static_case

        用于意义相近的转换,比如int与double,char与int,左值与右值,如下:

int main()
{char ch = 'm';int x = static_cast<int>(ch);return 0;
}

2.reinterpret_cast

        reinterpret_cast用于高风险的类型转换,即意义不相近的类型之间,或各种指针之间的转换,比如int与int*,char*与int*。

int main()
{int x = 10;int* p = reinterpret_cast<int*>(x);return 0;
}

3.const_cast

        const_cast用来添加/移除const属性的类型间转换,或者添加/移除volatile属性的类型间转换,如下:

int main()
{volatile const int n = 10;int* v = const_cast<int*>(&n);//移除const属性const int& m = const_cast<const int&>(m);//移除volatile属性return 0;
}

4.dynamic_cast

用于基类与派生类之间的类型转换。

        派生类转基类也叫切片,天然就可以实现的,但是基类转派生类可能会存在越界访问的问题。用这个关键字可以有效避免。

class Base { 
public:virtual ~Base() {} 
};
class Derived : public Base {};Base* base_ptr = new Base(); // 基类指针指向基类对象// 尝试向下转型
Derived* derived_ptr = dynamic_cast<Derived*>(base_ptr);
if (derived_ptr == nullptr) { // 转换失败!
}

六、RTTI

        RTTI(Runtime Type Information,运行时类型信息) 是 C++ 提供的一种在程序运行时获取对象类型信息的机制。它允许程序在运行时检测对象的实际类型,并支持安全的类型转换(如 dynamic_cast)和类型查询(如 typeid)。

        注意:typeid并不是每次都是运行时类型识别。RTTI依赖多态类型,只有类有虚函数时才能体现 。

相关文章:

C++类型转换详解

目录 一、内置 转 内置 二、内置 转 自定义 三、自定义 转 内置 四、自定义 转 自定义 五、类型转换规范化 1.static_case 2.reinterpret_cast 3.const_cast 4.dynamic_cast 六、RTTI 一、内置 转 内置 C兼容C语言&#xff0c;在内置类型之间转换规则和C语言一样的&am…...

【前端】【React】性能优化三件套useCallback,useMemo,React.memo

一、总览&#xff1a;性能优化三件套 useCallback(fn, deps)&#xff1a;缓存函数&#xff0c;避免每次渲染都新建函数。useMemo(fn, deps)&#xff1a;缓存值&#xff08;计算结果&#xff09;&#xff0c;避免重复执行计算。React.memo(Component)&#xff1a;缓存组件的渲染…...

excel数据透视表大纲格式改为表格格式

现有这样一个数据透视表&#xff1a; 想要把他变成这样的表格格式&#xff1a; 操作步骤&#xff1a; 第一步&#xff1a; 效果&#xff1a; 第二步&#xff1a; 效果&#xff1a; 去掉分类汇总&#xff1a; 效果&#xff1a; 去掉展开/折叠按钮&#xff1a; 操作方式&#xf…...

pycharm中安装Charm-Crypto

一、安装依赖 1、安装gcc、make、perl sudo apt-get install gcc sudo apt-get install make sudo apt-get install perl #检查版本 gcc -v make -v perl -v 2、安装依赖库m4、flex、bison(如果前面安装过pypbc的话,应该已经装过这些包了) sudo apt-get update sudo apt…...

天梯集训+代码打卡笔记整理

1.着色问题 直接标注哪些行和列是被标注过的&#xff0c;安全格子的数量就是未标注的行*列 #include <bits/stdc.h> using namespace std;const int N 1e510; int hang[N],lie[N];int main(){int n,m;cin>>n>>m;int q;cin>>q;while(q--){int x,y;ci…...

python基础语法:缩进规则

Python 的缩进规则是其语法的重要组成部分&#xff0c;它通过缩进来表示代码块的层次结构&#xff0c;而不是像其他语言&#xff08;如 C 或 Java&#xff09;那样使用大括号 {}。以下是 Python 缩进规则的详细说明&#xff1a; 1. 缩进的基本规则 代码块的标识&#xff1a;Pyt…...

支付系统设计入门:核心账户体系架构

&#x1f449;目录 1 账户记账理论 2 账户设计 3 账户性能问题 4 账户核心架构 5 小结 第三方支付作为中立的第三方&#xff0c;截断了用户和商户的资金流&#xff0c;资金先从用户账户转移到第三方支付平台账户&#xff0c;得到双方确认后再从支付平台账户转移到商户账户。 支…...

[LevelDB]Block系统内幕解析-元数据块(Meta Block)元数据索引块(MetaIndex Block)索引块(Index Block)

本文内容组织形式 Block的基本信息作用示意图举例说明 源码解析Footer格式写入&读取编码&解码 元数据块&#xff08;Meta Block&#xff09;构建&读取 元数据索引块构建&读取 索引块定义构建&读取核心方法-FindShortestSeparator&FindShortSuccessor作…...

leetcode:905. 按奇偶排序数组(python3解法)

难度&#xff1a;简单 给你一个整数数组 nums&#xff0c;将 nums 中的的所有偶数元素移动到数组的前面&#xff0c;后跟所有奇数元素。 返回满足此条件的 任一数组 作为答案。 示例 1&#xff1a; 输入&#xff1a;nums [3,1,2,4] 输出&#xff1a;[2,4,3,1] 解释&#xff1a…...

抖音视频下载工具

抖音视频下载工具 功能介绍 这是一个基于Python开发的抖音视频下载工具&#xff0c;可以方便地下载抖音平台上的视频内容。 主要特点 支持无水印视频下载自动提取视频标题作为文件名显示下载进度条支持自动重试机制支持调试模式 使用要求 Python 3.10Chrome浏览器必要的P…...

断言与反射——以golang为例

断言 x.(T) 检查x的动态类型是否是T&#xff0c;其中x必须是接口值。 简单使用 func main() {var x interface{}x 100value1, ok : x.(int)if ok {fmt.Println(value1)}value2, ok : x.(string)if ok {//未打印fmt.Println(value2)} }需要注意如果不接受第二个参数就是OK,这…...

【家政平台开发(27)】商务部信用对接、法律咨询与视频面试功能开发全攻略

本【家政平台开发】专栏聚焦家政平台从 0 到 1 的全流程打造。从前期需求分析,剖析家政行业现状、挖掘用户需求与梳理功能要点,到系统设计阶段的架构选型、数据库构建,再到开发阶段各模块逐一实现。涵盖移动与 PC 端设计、接口开发及性能优化,测试阶段多维度保障平台质量,…...

【数据结构】排序算法(下篇·开端)·深剖数据难点

前引&#xff1a;前面我们通过层层学习&#xff0c;了解了Hoare大佬的排序精髓&#xff0c;今天我们学习的东西可能稍微有点难度&#xff0c;因此我们必须学会思想&#xff0c;我很受感慨&#xff0c;借此分享一下&#xff1a;【用1520分钟去调试】&#xff0c;如果我们遇到了任…...

山东大学软件学院创新项目实训开发日志(9)之测试前后端连接

在正式开始前后端功能开发前&#xff0c;在队友的帮助下&#xff0c;成功完成了前后端测试连接&#xff1a; 首先在后端编写一个测试相应程序&#xff1a; 然后在前端创建vue 并且在index.js中添加一下元素&#xff1a; 然后进行测试&#xff0c;测试成功&#xff1a; 后续可…...

【VUE3】Eslint 与 Prettier 的配置

目录 0 前言 1 VSCode 中的 Eslint 与 prettier 插件 2 两种方案 3 eslint.config.js 4 eslint-plugin-prettier 插件 5 eslint-config-prettier 插件 6 安装插件命令 7 其他配置 8 参考资料 0 前言 黑马程序员视频地址&#xff1a;160-Vue3大事件项目-ESlint配合P…...

蓝桥杯C++组算法知识点整理 · 考前突击(上)【小白适用】

【背景说明】本文的作者是一名算法竞赛小白&#xff0c;在第一次参加蓝桥杯之前希望整理一下自己会了哪些算法&#xff0c;于是有了本文的诞生。分享在这里也希望与众多学子共勉。如果时间允许的话&#xff0c;这一系列会分为上中下三部分和大家见面&#xff0c;祝大家竞赛顺利…...

springboot调用python文件,python文件使用其他dat文件,适配windows和linux,以及docker环境的方案

介绍 后台是用springboot技术&#xff0c;其他同事做的算法是python&#xff0c;现在的需求是springboot调用python&#xff0c;python又需要调用其他的数据文件&#xff0c;比如dat文件&#xff0c;这个文件是app通过蓝牙获取智能戒指数据以后&#xff0c;保存到后台&#xf…...

GSO-YOLO:基于全局稳定性优化的建筑工地目标检测算法解析

论文地址:https://arxiv.org/pdf/2407.00906 1. 论文概述 《GSO-YOLO: Global Stability Optimization YOLO for Construction Site Detection》提出了一种针对建筑工地复杂场景优化的目标检测模型。通过融合全局优化模块(GOM)​、稳定捕捉模块(SCM)​和创新的AIoU损失函…...

Python 中使用单例模式

有这么一种场景&#xff0c;Web服务中有一个全局资源池&#xff0c;在需要使用的地方就自然而言引用该全局资源池即可&#xff0c;此时可以将该资源池以单例模式实现。随后&#xff0c;需要为某一特殊业务场景专门准备一个全局资源池&#xff0c;于是额外复制一份代码新建了一个…...

系统思考—提升解决动态性复杂问题能力

感谢合作伙伴的信任推荐&#xff01; 客户今年的人才发展重点之一&#xff0c;是提升管理者应对动态性、复杂性问题的能力。 在深入交流后&#xff0c;系统思考作为关键能力模块&#xff0c;最终被纳入轮训项目——这不仅是一次培训合作&#xff0c;更是一场共同认知的跃迁&am…...

Java基础 - 反射(2)

文章目录 示例5. 通过反射获得类的private、 protected、 默认访问修饰符的属性值。6. 通过反射获得类的private方法。7. 通过反射实现一个工具BeanUtils&#xff0c; 可以将一个对象属性相同的值赋值给另一个对象 接上篇&#xff1a; 示例 5. 通过反射获得类的private、 pro…...

Python proteinflow 库介绍

ProteinFlow是一个开源的Python库,旨在简化蛋白质结构数据在深度学习应用中的预处理过程。以下是其详细介绍: 功能 数据处理:支持处理单链和多链蛋白质结构,包括二级结构特征、扭转角等特征化选项。 数据获取:能够从Protein Data Bank (PDB)和Structural Antibody Databa…...

P1162 洛谷 填涂颜色

题目描述 思考 看数据量 30 而且是个二维的&#xff0c;很像走迷宫 直接深搜&#xff01; 而且这个就是搜连通块 代码 一开始的15分代码&#xff0c;想的很简单&#xff0c;对dfs进行分类&#xff0c;如果是在边界上&#xff0c;就直接递归&#xff0c;不让其赋值&#xff0c…...

docker安装nginx,基础命令,目录结构,配置文件结构

Nginx简介 Nginx是一款轻量级的Web服务器(动静分离)/反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器。其特点是占有内存少&#xff0c;并发能力强. &#x1f517;官网 docker安装Nginx &#x1f433; 一、前提条件 • 已安装 Docker&#xff08;dock…...

SQLI漏洞公开报告分析

文章目录 1. 闭合 )2. 邀请码|POST参数|时间盲注 | **PostgreSQL**3. POST|order by参数|布尔盲注|Oracle4. SOAP请求|MSSQL|布尔盲注5. MySQL 时间盲注漏洞6. GET|普通回显注入7. ImpressCMS 1.4.2 | CVE | POST | 布尔盲注8. Mysql | post | 布尔/时间盲注9. 登录口 | post |…...

SpringBoot项目部署之启动脚本

一、启动脚本方案 1. 基础启动方式 1.1 直接运行JAR java -jar your-app.jar --spring.profiles.activeprod优点&#xff1a;简单直接&#xff0c;适合快速测试缺点&#xff1a;终端关闭即终止进程 1.2 后台运行 nohup java -jar your-app.jar > app.log 2>&1 &…...

用Django和AJAX创建一个待办事项应用

用Django和AJAX创建一个待办事项应用 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 用Django和AJAX创建一个待办事项应用让我们创建一个简单的 Django 项目,其中包含不同类型的 A…...

JavaScript:游戏开发的利器

在近年来的科技迅速发展中&#xff0c;JavaScript 已逐渐成为游戏开发领域中最受欢迎的编程语言之一。它的跨平台特性、广泛的社区支持、丰富的库和框架使得开发者能够快速、有效地创建各种类型的游戏。本文将深入探讨 JavaScript 在游戏开发中的优势。 一、跨平台支持 JavaSc…...

C语言今天开始了学习

好多年没有弄了&#xff0c;还是捡起来弄下吧 用的vscode 建议大家参考这个配置 c语言vscode配置 c语言这个语言简单&#xff0c;但是今天听到了一个消息说python 不知道怎么debug。人才真多啊...

Elasticsearch 系列专题 - 第五篇:集群与性能优化

随着数据量和访问量的增长,单节点 Elasticsearch 已无法满足需求。本篇将介绍集群架构、性能优化方法以及常见故障排查,帮助你应对生产环境中的挑战。 1. 集群架构 1.1 节点角色(Master、Data、Ingest 等) Elasticsearch 集群由多个节点组成,每个节点可扮演不同角色: M…...