C++——不一样的I/O工具与名称空间

先来个无奖竞猜环节,C++程序的模块叫什么?

回到正题。在C++程序中,我们常会见到的、最熟悉的莫过于main()函数的身影,这和C语言风格下的程序别无二致。不过当我们把视线往上移动,来到代码的第一行:#include<iostream>,?,这是个什么玩意儿?

在C语言中,我们曾接触过这样一段代码:#include "stdio.h",这是通过预处理器将名为stdio的头文件包含进了程序中,而该文件中有我们平常标准输入输出操作所需要的printf()和scanf()函数。

而iostream则担任了如同C语言中stdio文件的责任,它为我们提供了C++风格下常用的输入输出流,或者更具体地说,有了iostream文件的加入,我们才能够正常使用cout和cin进行输出和输入。由于C++新式风格下规定不使用类似".h"这样的扩展名,所以才有了我们现在看到的<iostream>的书写形式。

iostream其实可以拆解为istream和ostream,下面我们分开讲讲。

首先看istream。其实istream可以看作是一个包含输出功能的类,这里的类是C++面向对象特性中非常重要的一个概念,不过这里暂时不展开讲。按照已有的C语言的知识来看,我们大可以暂时将它视作一个结构体的升级promax版本,它为我们提供了非常重要的cout对象(对象也是一个非常重要的概念,不过这里同样不展开讲,先简单地看作是结构体变量吧)。cout类似于C语言中的printf(),能够进行消息的输出,但是cout的书写格式又和printf大不一样,具体见下图代码:

可以看到,cout使用了<<来进行信息输出操作,实际上,<<可以看作消息传输路径,它将双引号中的内容传输给了cout对象,而接下来的显示由cout内部进行,并不需要程序员进行操作。输出语句最后的endl是换行符,它的功能和C语言中的\n一样,当然我们也完全可以去掉endl,在双引号内使用我们熟知的\n进行换行,这种写法C++也是允许的。

下面来看ostream。类比istream,ostream是一个可以帮助实现输入功能的类,作用类似于C语言中的scanf()。它的格式同样有区别,具体见下图代码:

cin同样使用了>>来表示信息传入方向,不过cin的功能远不止于此,这在之后的内容中会见到。

当然,细心的读者一定发现了,在第一张图片包含头文件代码的下方,一条全新的代码出现了,那就是using namespace std。

这using是何许人也?其实它属于C++中的一条编译指令,它帮助你将名称空间拉入程序代码中。

那为什么需要这个名称空间呢?有两点原因。

第一,名称空间支持属于C++的一项特性,可以解决你在编写大型程序或者使用不同厂商的现有代码时出现的名称冲突问题。例如,有两个已经封装好的产品,一个属于A厂商,一个属于B厂商,这两个产品同时包含一个叫做add的函数,如果不添加名称空间,那么编译器并不能分辨到底是用哪个版本。但是,当你用using加入名为A的名称空间时,你的add函数其实就成为了A::add(),这变相地告诉了编译器你要使用A版本的add函数。

第二,提前引入名称空间可以为你编写代码省去很多不必要的麻烦,我们来看下面代码。

可以见到,当去掉using引入的名称空间后,cout和endl都出现了错误,也就是说,我们使用的cout、cin等其实严格来说是std::cout、std::cin,实际应当写成下面的形式:

但是多数时候,谁愿意时刻记着要在名称前加上std呢?这显然是自增工作量。因此在一开始就将名称空间引入是最省事的方法。

当然,上述知识实际会用便好,不用考虑这么多弯弯绕绕。但是对于学习阶段乃至以后的面试而言,多一些储备总不至于是件坏事。

相关推荐
GlueNa2SiO31 小时前
第十八章 Linux故障排查与恢复
linux·服务器·笔记·学习
萧瑟余晖1 小时前
Java深入解析篇十七之Spring Security
java·开发语言·spring
weixin_431600441 小时前
NestJS 入门(3):Guard 如何挡住未登录请求?
前端·后端·学习·nest.js
带娃的IT创业者1 小时前
DeepTutor:当 Agent-Native 架构撞上个性化学习的临界点
学习·架构·ai agent·大模型应用·个性化学习·教育技术·agent-native架构
xian_wwq2 小时前
【学习笔记】Context Engineering,AI Agent 真正的内存管理-4/16
笔记·学习·context
寒月小酒2 小时前
AnythingLLM 学习
学习
C++ 老炮儿的技术栈3 小时前
从 Qt Designer 属性编辑器的层级可以看到继承链
c语言·数据库·c++·qt·sqlite·visual studio
new_zhou3 小时前
C++ 项目 AI 协作指南(Windows / MSVC 环境)
c++·人工智能·windows
二十雨辰4 小时前
[Java]-Spring面试题
java·开发语言
_oP_i4 小时前
python 后缀 mjs文件
开发语言·python