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

C++波澜壮阔40年|类和对象篇:拷贝构造与赋值重载的演进与实现

C++波澜壮阔40年|类和对象篇:拷贝构造与赋值重载的演进与实现

🔥@雾忱星: 个人主页 👀专栏:《数据结构与算法入门指南》、《C++学习之旅》 💪学习阶段:C/C++、数据结构与算法 ⏳“人理解迭代,神理解递归。” 文章目录 * 引言 * 一、拷贝构造函数 * 1.1 解析:拷贝构造特点 * 1.2 关键:拷贝构造的调用 * 二、赋值运算符重载 * 2.1 铺垫:运算符重载特点 * 2.1.1 核心:理解运算符重载 * 2.2 进阶:赋值运算符重载特点 * 2.2 核心:理解赋值运算符重载 * 总结 引言 在C++面向对象编程中,对象的复制操作无处不在。无论是函数传参、返回值传递,

By Ne0inhk
【C++】C++异常

【C++】C++异常

🎬 个人主页:MSTcheng · ZEEKLOG 🌱 代码仓库 :MSTcheng · Gitee 🔥 精选专栏: 《C语言》 《数据结构》 《算法学习》 《C++由浅入深》 💬座右铭:路虽远行则将至,事虽难做则必成! 在前面的文章中,我们已经介绍了C++11的一些新特性。本文将和下一篇一起为大家讲解C++的最后两个重要主题:异常处理和智能指针。 文章目录 * 一、异常的概念及使用 * 1.1异常的概念 * 1.2异常的分类 * 1.3异常的抛出与捕获 * 1.4栈展开 * 1.5 查找匹配的处理代码 * 1.6异常重新抛出 * 1.7异常的安全问题 * 1.8异常规范 * 二、总结 一、异常的概念及使用 1.1异常的概念 异常(Exception)是指在程序执行过程中发生的意外或错误情况,

By Ne0inhk
【C++】STL详解(四)—从零撸出vector,写完我膨胀了

【C++】STL详解(四)—从零撸出vector,写完我膨胀了

坚持用清晰易懂的图解+代码语言,让每个知识点变得简单! 🚀呆头个人主页详情 🌱 呆头个人Gitee代码仓库 📌 呆头详细专栏系列 座右铭:“不患无位,患所以立。” 【C++】STL详解(四)—从零撸出vector,写完我膨胀了 * 摘要 * 目录 * 一、vector模拟实现的四个关键点 * 二、默认成员函数 * 无参构造 * 析构 * operator= * 三、迭代器相关函数 * begin 和 end的iterator / const_iterator * 四、容量大小相关函数 * size 和 capacity * reserve * resize * empty * 五、修改容器内相关函数 * push_back * pop_back * insert * erase * swap * clear * 六、访问容器相关函数

By Ne0inhk
C++ 模板进阶:特化、萃取与可变参数模板

C++ 模板进阶:特化、萃取与可变参数模板

C++ 模板进阶:特化、萃取与可变参数模板 💡 学习目标:掌握模板进阶技术的核心用法,理解模板特化的深层应用、类型萃取的实现原理,以及可变参数模板的灵活使用,提升泛型编程的实战能力。 💡 学习重点:模板特化的进阶场景、类型萃取工具的设计与应用、可变参数模板的展开技巧、折叠表达式的使用方法。 一、模板特化进阶:处理复杂类型场景 💡 模板特化不只是针对单一类型的定制,还能处理指针、引用、数组等复杂类型,实现更精细的类型适配逻辑。 1.1 指针类型的模板特化 通用模板默认处理普通类型,我们可以为指针类型单独编写特化版本,实现指针专属的逻辑。 #include<iostream>#include<string>usingnamespace std;// 通用模板:处理普通类型template<typenameT>classTypeProcessor{public:staticvoidprocess(T data){ cout

By Ne0inhk