【C++】类型转换 | IO流 | 空间配置器

C语言类型转换

C语言总共有两种形式的类型转换:隐式类型转换 和 显示类型转换。
C语言的转换格式虽然很简单,但也存在不少缺陷:

  1. 隐式类型转换有些情况下可能会引发意料之外的结果,比如数据精度丢失。
  2. 显示类型转换的可视性比较差,它将所有转换的情况都混合在一起,使代码不够清晰。

C++之所以还要提出自己的类型转换,主要是为了更好地规避C语言风格类型转换所带来的的缺陷和风险。

C++类型转换

  • static_cast
    static_cast相当于C语言中的隐式类型转换,用于意义相近的类型。
  • reinterpret_cast
    reinterpret_cast用于将一种类型转换为另一种类型。
  • const_cast
    const_cast通常用于删除变量的const属性,以方便赋值。

reinterpret_castconst_cast都是C语言角度下的强制类型转换。

void Test1()
{const int a = 2;int* p = const_cast<int*>(&a);*p = 3;cout << a << endl;cout << *p << endl;
}

在这里插入图片描述
上面的输出结果不一样,这是由于const变量作为常变量,在使用的地方可能预处理阶段就被替换成了常量;或者说编译器是将const变量存储在寄存器中等特殊处理的结果。要想避开这种处理,让const变量保持以内存存储的形式,可以使用volatile关键字:volatile const int a = 2;
在这里插入图片描述

dynamic_cast

dynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针/引用(父类对象是无论如何都不能转换成子类对象)。
向上转型:子类对象指针/引用 --> 父类指针/引用(不需要转换,本来就赋值兼容);
所有的类型转换都会出现临时变量,而向上转型并不会有临时变量产生,所以向上转型本质并不属于类型转换。
向下转型:父类对象指针/引用 --> 子类指针/引用(用dynamic_cast转型)。

class A
{
public:// dynamic_cast只能用于父类含有虚函数的类virtual void f() {}
public:int _a = 0;
};class B : public A
{
public:int _b = 1;
};// pa可能指向父类,也可能指向子类
void fun(A* pa)
{// 如果pa指向子类,那么可以转换,转换表达式返回正确的地址// 如果pa指向父类,那么不能转换,转换表达式返回nullptrB* pb = dynamic_cast<B*>(pa);if (pb){cout << "转换成功" << endl;cout << pb->_a << pb->_b << endl;}else{cout << "转换失败" << endl;cout << pa->_a << endl;}
}void Test2()
{A a1;B b1;fun(&a1);fun(&b1);
}

在这里插入图片描述

RTTI

RTTI(Run-time Type identification),即运行时类型识别。
C++通过以下方式来支持RTTI:

  1. typeid运算符
  2. dynamic_cast运算符
  3. decltype

IO流

“流”即流动的意思,是物质从一处向另一处流动的过程,是对一种连续有序且有方向性的数据的抽象描述。
为了实现IO流,C++实现了一个庞大的IO标准类库。
在这里插入图片描述
库中提供了4个全局流对象cincoutcerrclog
cincout可以直接输入和输出内置类型数据,是因为库中已经将所有内置类型的输入和输出进行了重载。
对于自定义类型,如果想要支持cincout的输入输出,就需要自行对>><<进行重载。
如果想要实现循环输入,需要在istream中重载operator bool

istream& operator>> (type& val);
explicit operator bool() const;
class A
{
public:A(int a): _a(a){}explicit operator int(){return _a;}
private:int _a;
};void Test1()
{// 内置类型转换成自定义类型A a = 1;// 自定义类型转换成内置类型int i1 = (int)a;int i2 = static_cast<int>(a);
}

cin去读取数据时,调用的是operator>>,返回的istream类型的对象。如果想要判断是否读取成功,则需要通过operator bool来判断。
stringstream类型的对象,在进行多次数据类型转换时,一定要用clear来清空,才能正确地转化。
clear不会将stringstream底层的string对象清空,可以使用str("")方法将底层string对象设置为""空字符串。

空间配置器

空间配置器,就是用于为各个容器高效地管理空间(空间的申请与回收)的。
空间配置器相比用户自己申请空间,主要优势在于,效率更高且能一定程度缓解内存碎片问题。
SGI版本的空间配置器设计中,对申请空间的大小做了一个划分。以128byte作为分界线,分别设计了一级空间配置器(处理大块内存申请)和二级空间配置器(处理小块内存申请)。
对于二级空间配置器,采用了内存池的技术来提高申请空间的速度并减少额外的空间浪费,采用哈希桶的结构来提高用户获取空间的速度并做高效的管理。
所谓内存池就是先申请一块大的内存块,当用户需要内存时,直接去内存池中去取即可。直到内存池中的空间不足时,才再次去向系统索取(大块内存)。当用户使用的内存不再需要,直接返回给内存池即可。这样的设计避免了用户频繁向系统申请小块内存所导致的效率低下,内存碎片问题。

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

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

相关文章

移植LVGL到单片机的一个demo简单介绍

简介 背景&#xff1a; 本文使用的是主控IC为stm32f103zet6, 显示IC为ST7735s&#xff0c;它是128*160的像素&#xff0c;色深为RGB565颜色。 官方虽然说LVGL移植平台只需 64kB 闪存和 8kB RAM 就足以满足简单的用户界面。但我移植到stm32f103c8t6&#xff0c;不管怎么修改配…

我干了8年测试,告诉你现在软件测试还能不能找到工作!

观点&#xff1a;如果你还是以前的思维来学习测试&#xff0c;那你肯定是找不到工作&#xff01; 我做测试工作有将近8年的时间&#xff0c;蚂蚁金服做过2年&#xff0c;因为加班太多离职了。目前在一家国企上市公司&#xff0c;一年能拿三四十个左右&#xff0c;对比头部互联…

可视化 | echarts饼图改编

echarts模板来源 &#x1f4da;改编点 &#x1f407;基本样式 去掉legend、label&#xff1a;show: false背景透明&#xff1a;backgroundColor: "transparent"去除功能标签添加载入动态animationEasing: elasticOut, animationDelay: function (idx) {return Mat…

【数据结构】顺序表 | 详细讲解

在计算机中主要有两种基本的存储结构用于存放线性表&#xff1a;顺序存储结构和链式存储结构。本篇文章介绍采用顺序存储的结构实现线性表的存储。 顺序存储定义 线性表的顺序存储结构&#xff0c;指的是一段地址连续的存储单元依次存储链性表的数据元素。 线性表的&#xf…

10-Docker-分布式存储算法

01-哈希取余算法分区 哈希取余分区&#xff08;Hash Modulus Partitioning&#xff09;是一种在分布式计算和数据存储中常用的分区策略&#xff0c;其目的是将数据或计算任务分配到多个节点或服务器上&#xff0c;以实现负载均衡和提高性能。这种分区策略的核心思想是使用哈希…

通过商品ID获取到京东商品详情页面数据,京东商品详情官方开放平台API接口,京东APP详情接口,可以拿到sku价格,销售价演示案例

淘宝SKU详情接口是指&#xff0c;获取指定商品的SKU的详细信息。SKU是指提供不同的商品参数组合的一个机制&#xff0c;通过不同的SKU来标识商品的不同组合形式&#xff0c;如颜色、尺寸等。SKU详情接口可以帮助开发者获取指定商品的SKU列表&#xff0c;以及每个SKU的属性、库存…

VirtualBox网络地址转换(NAT),宿主机无法访问虚拟机的问题

问题&#xff1a;NAT模式下&#xff0c;默认只能从内访问外面&#xff0c;而不能从外部访问里面&#xff0c;所以只能单向ping通&#xff0c;虚拟机的ip只是内部ip。 PS&#xff1a;桥接则是与主机公用网卡&#xff0c;有独立的外部ip。 解决&#xff1a;NAT模式可以通过配置 …

第十八章 Swing 程序设计

目录 概述 Swing常用窗体 JFrame 窗体 JDialog 对话框 JOptionPane 小型对话框 1.自定义对话框 2.确认框 3.输入框 4.通知框 常用布局管理器 null绝对布局 FlowLayout 流布局管理器 BorderLayout 边界布局管理器 GridLayout 网络布局管理器 常用面板 JPa…

Servlet作业小练习

一.题目 利用JavaBean实现用户类&#xff0c;包含姓名、性别、爱好&#xff0c;爱好需要用多选框 实现表单1进行获取数据&#xff0c;表单2显示获取结果。 利用Servlet实现逻辑代码 二.实现效果 三.具体实现 1.User实体类 package com.hjj.pojo.hw9;/*** author:嘉佳 Dat…

Halcon的相机内参外参的标定

halcon标定相机内参只能使用方向标定板和圆点标定板。并且方向标定板可也可用性极高。 1.打开halcon的标定助手&#xff0c;选择标定板的描述文件&#xff0c;填写标定板的厚度&#xff0c;根据相机选择像元的尺寸和镜头的焦距。如果已有相机内参&#xff0c;只标定外参&#…

设计模式(3)-结构型模式

结构型模式 结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式&#xff0c;前者采用继承机制来组织接口和类&#xff0c;后者釆用组合或聚合来组合对象。 由于组合关系或聚合关系比继承关系耦合度低&#xff0c;满足“合成复用原则…

计算机网络第4章-通用转发和SDN

引子&#xff1a; 在前面&#xff0c;我们将基于目的地转发的特征总结为两个步骤&#xff1a; 查找目的IP地址&#xff08;匹配&#xff09;&#xff0c;然后将分组发送到有特定输出端口的交换结构&#xff08;“动作”&#xff09;。 但是这种转发特征会带来许多问题&#…

webpack babel

构建工具 简介 当我们习惯了在node中编写代码的方式后&#xff0c;在回到前端编写html、css、js这些东西会感觉到各种的不便。比如&#xff1a;不能放心的使用模块化规范&#xff08;浏览器兼容性问题&#xff09;、即使可以使用模块化规范也会面临模块过多时的加载问题。我们…

【Excel】函数sumif范围中符合指定条件的值求和

SUMIF函数是Excel常用函数。使用 SUMIF 函数可以对报表范围中符合指定条件的值求和。 Excel中sumif函数的用法是根据指定条件对若干单元格、区域或引用求和。 sumif函数语法是&#xff1a;SUMIF(range&#xff0c;criteria&#xff0c;sum_range) sumif函数的参数如下&#xff…

多测师肖sir___接口自动化测试框架(python+request+unittest+ddt)

接口自动化测试框架 一、接口自动化测试框架&#xff08;pythonrequestunittestddt&#xff09; 首先我们新建一个新项目:名称zdh 二、在一个项目中&#xff1a;新建6个包 第一个包conf包用来填写配置参数、地址等 第二个包data 包用来存放测试用例的表格 第三个包report 包用来…

vscode 终端进程启动失败: shell 可执行文件“C:\Windows\System32\WindowsPower

vscode 终端进程启动失败: shell 可执行文件“C:\Windows\System32\WindowsPower 第一次用vscode&#xff0c;然后遇到这个问题&#xff0c;在设置里搜索 terminal.integrated.defaultProfile.windows 将这里的null改成"Command Prompt" 重启就可以了

Spring Cloud学习(五)【Feign 远程调用】

文章目录 RestTemplate方式调用存在的问题Feign的介绍定义和使用Feign客户端Feign 的自定义配置Feign 性能优化Feign 的最佳实践 RestTemplate方式调用存在的问题 先来看我们以前利用RestTemplate发起远程调用的代码&#xff1a; 存在下面的问题&#xff1a; 代码可读性差&am…

jmeter接口自动化部署jenkins教程

首先&#xff0c;保证本地安装并部署了jenkins&#xff0c;jmeter&#xff0c;xslproc 我搭建的自动化测试框架是jmeterjenkinsxslproc ---注意&#xff1a;原理是&#xff0c;jmeter自生成的报告jtl文件&#xff0c;通过xslproc工具&#xff0c;再结合jmeter自带的模板修改&…

5 Paimon数据湖之表数据查询详解

更多Paimon数据湖内容请关注&#xff1a;https://edu.51cto.com/course/35051.html 虽然前面我们已经讲过如何查询Paimon表中的数据了&#xff0c;但是有一些细节的东西还需要详细分析一下。 首先是针对Paimon中系统表的查询&#xff0c;例如snapshots\schemas\options等等这些…

Spring Cloud之多级缓存

目录 传统缓存 多级缓存 JVM进程缓存 Caffeine 缓存驱逐策略 实现进程缓存 常用Lua语法 数据类型 变量声明 循环使用 定义函数 条件控制 安装OpenResty 实现Nginx业务逻辑编写 请求参数解析 实现lua访问tomcat JSON的序列化和反序列化 Tomcat的集群负载均衡 …