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

news2025/1/18 10:52:24

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指向父类,那么不能转换,转换表达式返回nullptr
	B* 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.coloradmin.cn/o/1197157.html

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

相关文章

MYSQL操作详解

一)计算机的基本结构 但是实际上&#xff0c;更多的是这种情况: 二)MYSQL中的数据类型: 一)数值类型: 数据类型内存大小(字节)说明bit(M)M指定位数,默认为1单个二进制位值&#xff0c;或者为0或者为1&#xff0c;主要用于开/关标志tinyint1字节1个字节的整数值&#xff0c;支持…

iPad系列将在2024年全面更新!

今年还会有新iPad发布吗&#xff1f;答案是否定的。因为早在前几天的季度电话会议上&#xff0c;苹果公司CEO蒂姆・库克就已经宣布&#xff0c;今年不会推出任何新的iPad产品。 这也意味着&#xff0c;今年将是苹果公司自2010年推出首款iPad设备以来&#xff0c;第一次没有发布…

【LeetCode刷题日志】138.随机链表的复制

&#x1f388;个人主页&#xff1a;库库的里昂 &#x1f390;C/C领域新星创作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏✨收录专栏&#xff1a;LeetCode 刷题日志&#x1f91d;希望作者的文章能对你有所帮助&#xff0c;有不足的地方请在评论区留言指正&#xff0c;…

穿越内存迷宫:C语言地址与指针的的冒险之旅

前言 C语言的魅力在于其直接的内存控制&#xff0c;而地址和指针是这种控制的核心。深入了解这些概念&#xff0c;将帮助我们更好地理解和利用C语言的潜力。本文将带领你踏上地址与指针的奇妙之旅&#xff0c;揭示它们在程序设计中的神秘面纱。 奇妙指针之旅&#xff1a;解码…

好物周刊#30:Github 上大学

https://github.com/cunyu1943/JavaPark https://yuque.com/cunyu1943 村雨遥的好物周刊&#xff0c;记录每周看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;每周五发布。 一、项目 1. Fighting Design 一款灵活、优质的组件库&#xff0c;可在 vue3 应用程…

C语言 音乐播放器项目(综合)

1.main.c文件 #include<stdio.h> #include<stdlib.h> #include<string.h> #include <unistd.h>//休眠所需的头文件 #include "./pos/console.h"//光标使用所需的头文件 #include "lrc.h" #include "./mplayer/start_mplayer…

让你的win10/win11系统变得不再卡顿,优雅草伊凡整理-长期更新-如何让windows操作系统不用老是重装在不断的更新中依然保持流畅运行

概述 如题&#xff1a;让你的win10/win11系统变得不再卡顿&#xff0c;优雅草伊凡整理-长期更新-如何让windows操作系统不用老是重装在不断的更新中依然保持流畅运行 本文长期更新&#xff0c;本次更新2023年11月8日&#xff01; 很多时候 我们的win10win11系统不管再怎么关…

基于SSM的软考系统设计实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

Servlet作业小练习

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

【蓝桥杯软件赛 零基础备赛20周】第3周——填空题

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 文章目录 00. 2023年第14届参赛数据0. 上一周答疑1. 填空…

环境变量小节

这是写的第二篇环境变量博客&#xff0c;写了一年多了&#xff0c;第一次出现把自己博客删了的情况&#xff0c;不知道为什么明明发表了&#xff0c;然后就把草稿箱和回收站的删了&#xff0c;结果晚上发现没发表&#xff0c;回收站删除是无法找回的&#xff0c;以后还是要慎重…

酷柚易汛ERP-账户管理操作指南

1、应用场景 对账户进行管理&#xff0c;可设置账户当前余额、期初余额和设置是否为默认账户。 2、主要操作 2.1 新增支付账户 打开【资料】-【账款管理】&#xff0c;点击【新增】添加账户类别&#xff0c;输入相关信息并保存&#xff0c;账户编号和名称为必录项。&#x…

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

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

最简WebClient 同步、异步调用示例

目录 一&#xff0c;序言二&#xff0c;简单示例1. 引入依赖2. 日志配置3. 调用代码4. 运行结果 三&#xff0c;完整代码 一&#xff0c;序言 WebClient是Spring WebFlux模块提供的一个非阻塞的基于响应式编程的进行Http请求的客户端工具&#xff0c;从Spring5.0开始WebClient…

【JavaEE初阶】 TCP协议详细解析

文章目录 &#x1f332;TCP协议的概念&#x1f6a9;TCP协议段格式&#x1f6a9;TCP的特性 &#x1f333;TCP原理&#x1f6a9;确认应答机制&#xff08;安全机制&#xff09;&#x1f6a9;超时重传机制&#xff08;安全机制&#xff09;&#x1f6a9;三次握手四次挥手&#xff…

【蓝桥杯选拔赛真题65】Scratch水下探险 少儿编程scratch图形化编程 蓝桥杯创意编程选拔赛真题解析

目录 scratch水下探险 一、题目要求 编程实现 二、案例分析 1、角色分析

概念解析 | Richardson-Lucy去卷积算法

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:Richardson-Lucy去模糊算法 Richardson-Lucy去模糊算法:重现图像的真实面目 Blind deconvolution by means of the Richardson–Lucy algorithm 背景介绍 在图像处理中,图像获取…

jQuery实现二级菜单

jQuery怎么实现二级菜单呢&#xff1f;让我为大家演示一个例子&#xff01; 上代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title></title><style>* {margin: 0;padding: …

Spring源码系列-Spring事务

声明式事务 spring事务&#xff0c;是通过数据库连接来实现的&#xff0c;当前线程中保存了一个map&#xff0c;key是数据原&#xff0c;value是数据库连接 我们说的同一个事务&#xff0c;其实指的是同一个数据库连接&#xff0c;只有拥有同一个数据库连接才能同时提交和回滚。…

C语言实现编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n

完整代码&#xff1a; /*编写一个函数&#xff0c;输入n为偶数时&#xff0c;调用函数求1/21/4...1/n,当输入n为奇数时&#xff0c; 调用函数1/11/3...1/n */ #include<stdio.h>//n为偶数 double Odd(int n){double sum0;//i为2&#xff0c;4&#xff0c;6....for (int …