C++的IO流和C++的类型转换----《Hello C++ Wrold!》(29)--(C/C++)

C++的IO流和C++的类型转换----《Hello C++ Wrold!》(29)--(C/C++)

文章目录

前言

在 C++ 编程体系中,类型转换与 IO 流是支撑程序数据处理与交互的两大核心环节。类型转换关乎数据在不同类型间的安全传递与运算适配,而 IO 流则负责程序与外部设备(如键盘、屏幕、文件)之间的数据输入与输出,二者共同构成了 C++ 程序实现功能、交互信息的基础框架。​

C 语言中的类型转换方式虽简洁,却存在可视性差、难以追踪的问题,容易在复杂程序中引发潜在的逻辑错误。为解决这一痛点,C++ 引入了四种命名明确的强制类型转换操作符 ——static_cast、reinterpret_cast、const_cast与dynamic_cast,通过规范的语法形式,让类型转换过程更清晰、更可控,同时针对不同转换场景提供了精准的约束与支持。​

而在 IO 流领域,C++ 在兼容 C 语言 IO 函数的基础上,构建了更具面向对象特性的 IO 流体系。从用于控制台交互的istream(输入流)、ostream(输出流),到用于文件操作的ifstream(文件输入流)、ofstream(文件输出流)与fstream(文件读写流),再到用于字符串数据处理的stringstream,C++ 的 IO 流机制为不同场景下的数据传输提供了灵活、统一的接口,尤其对自定义类型的 IO 支持,更是大幅提升了代码的扩展性与复用性。​

本文将系统梳理 C++ 类型转换的四种操作符特性与使用场景,深入解析 IO 流体系的核心组件与实际应用方法,结合具体代码示例,帮助读者理解并掌握这两部分关键知识,从而在实际编程中更安全地处理类型转换、更高效地实现数据 IO 交互,提升代码的质量与开发效率。​

C++的类型转换

C语言的类型转换有隐式类型转换和强制类型转换

但是这个转换的可视性太差了–有时很难意识到发生了类型转换,最终导致运行结果和预期不符
所以在C++中引出了四种命名的强制类型转换操作符,来加强类型转换的可视性

static_castreinterpret_castconst_castdynamic_cast

四种命名的强制类型转换操作符

static_cast

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

reinterpret_cast

reinterpret_cast这个的话就是用于不同类型之间的转换

const_cast

const_cast的作用就是删除变量的const属性
但是要注意:

在用p2去改变n的值的时候,编译器可能会优化掉对n内存的访问操作–比如:用p2去改了n的值,但是程序运行时还是原来那个值

这个时候就需要volatile去让编译器每次都访问内存里的n

dynamic_cast

dynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换)
1.dynamic_cast只能用于父类含有虚函数的类

2.dynamic_cast会检查是否能转换成功,能成功的话就就会转换,不能成功的话会返回空指针
如果是子类转换成父类的话,不需要dynamic_cast,用static_cast就行了

如果是父类转换成子类的话,用dynamic_cast–这是安全的,但不一定能转换成功

RTTI(这个了解一下就行了)

这个的意思就是进行运行时的类型识别
C++支持RTTI的方式有三种:

1.typeid运算符

2.dynamic_cast运算符

3.decltype

C++的IO流

在这里插入图片描述
istream是输入东西 ostream是输出东西

iostream是输入输出东西
C语言的IO流里面主要用到的有fprintf fscanfprintf scanfsprintf sscanf

C++当前也能用这些,但是自定义类型的话得用cin和cout才能支持
引申:如果程序一直要求输入的话,可以ctrl+z终止输入,当然ctrl+c也可以–自己一般用ctrl+z
ios流里面有个operator bool()的成员函数来判断输入输出流的状态:

C++文件的IO流

C语言文件的IO流同样可以使用哈

ifstream:专门用于从文件中读取数据,提供了打开、关闭文件以及读取文件内容的相关操作。

ofstream: 专门用于向文件中写入数据,提供了打开、关闭文件以及写入文件内容的相关操作。

fstream:结合了 ifstreamofstream 的功能,允许对同一个文件进行读写操作。
用法: eg: ifstream ifs("text.txt", ios_base::in | ios_base::binary);//text.txt是文件名//ios_base::in | ios_base::binary是读取模式和二进制模式打开文件 ifs.read((char*)&info,sizeof(info));//读二进制 ifs>>info;//读文本
注意:

二进制读写不能用string,vector这样的对象存数据–这样写进去的只会是一个指针,如果进程结束了就成野指针了

stringstream

这个其实不常用,了解一下就行
eg:用途:

1.数据转换成字符串

2.序列化和反序列化结构数据(但是一般不用stringstream去实现)

Read more

Python中一切皆对象:深入理解Python的对象模型

Python中一切皆对象:深入理解Python的对象模型

Python中一切皆对象:深入理解Python的对象模型 * 什么是"一切皆对象"? * Python对象的类型层次 * 1. 内置类型对象 * 2. 函数对象 * 3. 类对象和实例对象 * 4. 模块对象 * 对象行为的统一性 * 特殊方法:对象行为的背后 * 对象模型的实际应用 * 性能考虑 * 总结 Python以其"一切皆对象"的设计哲学而闻名,这种设计为语言带来了极大的灵活性和一致性。本文将深入探讨Python的对象模型,解释为什么说"Python中一切皆对象",并通过实例展示这一特性如何影响我们的编程方式。 什么是"一切皆对象"? 在Python中,从简单的数字、字符串到复杂的函数、类甚至模块,所有这些都是对象。这意味着它们都有: 1. 身份(identity):对象在内存中的唯一地址,可通过id()函数获取 2.

By Ne0inhk
Python中的“==“与“is“:深入解析与Vibe Coding时代的优化实践

Python中的“==“与“is“:深入解析与Vibe Coding时代的优化实践

🌟 Python中的"=="与"is":深入解析与Vibe Coding时代的优化实践 * 1. 🧐 `==`与`is`的本质区别 * 2. 🕵️‍♂️ `is`判断对象身份 - 数组与常量池案例 * 案例1:列表对象的身份 * 案例2:小整数常量池 * 案例3:字符串驻留 * 3. 🔍 `==`与`__eq__`魔法函数 * 4. 🔎 类型判断的正确姿势:使用`is` * 5. 🚀 Vibe Coding时代的提示词优化 * 场景1:解释概念 * 场景2:代码生成 * 场景3:调试帮助 * 📊 对比总结表 * 💡 实际应用建议 * 🌈 结语 在Python的奇妙世界中,==和is这两个看似简单的操作符常常让初学者感到困惑。它们如同双胞胎,外表相似却性格迥异。本文将带你深入探索它们的区别,并通过生动的案例和图表展示它们的应用场景,

By Ne0inhk

C++中lower_bound 与 upper_bound 函数详解

目录 一.核心定义与核心区别 lower_bound(下界函数) upper_bound(上界函数) 二.使用前提与参数说明 1. 必须满足的前提 2. 函数参数 3.返回值  三.用法 (1)判断目标值是否存在 (2)计算目标值的出现次数(统计重复元素) (3)在有序容器中插入元素(保持有序) (4)自定义比较函数(降序) lower_bound 和 upper_bound 是 C++ 标准库 <algorithm> 头文件中的二分查找算法,专门用于在有序区间中高效定位元素 一.核心定义与核心区别 函数的头文件: #include <algorithm>

By Ne0inhk
华为OD机试双机位C卷-面试叫号系统 (Py/Java/C/C++/Js/Go)

华为OD机试双机位C卷-面试叫号系统 (Py/Java/C/C++/Js/Go)

面试叫号系统 华为OD机试双机位C卷 - 华为OD上机考试双机位C卷 100分题型 华为OD机试双机位C卷真题目录点击查看: 华为OD机试双机位C卷真题题库目录|机考题库 + 算法考点详解 题目描述 某公司举行招聘会,面试官通过叫号系统,按照应聘者的预约先后次序依次呼叫应聘者面试。如果被叫到的应聘者没有及时到场,面试官叫不到人就会过号处理。第一次过号的应聘者会被排到下一位,第二次过号则会排队下两位,第三次过号则会被安排到下四位。以此类推,按2^x的次序计算步长,过号次数越多则排队越后,直至队尾。也有人因为某些原因需要优先面试,优先面试的人会被提前叫号,如果优先面试的人未及时到场,则取消优先面试资格,按约定规则处理。 请写一段程序,实现以上排队叫号功能。 输入描述 每行输入1个应聘者预约消息,依次为应聘者编号、姓名、是否优先面试(true是,false 否)、预约顺序(整数1至1000)、过号次数(整数 0 至10),最后一行以Exit结束。 输出描述 从第1个人开始叫号,输出所有被叫到的应聘者信息,格式为编号:姓名:

By Ne0inhk