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呢?这显然是自增工作量。因此在一开始就将名称空间引入是最省事的方法。

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

相关推荐
xiangpanf12 小时前
PHP vs C语言:30字解析两大编程语言差异
c语言·开发语言·php
wdfk_prog13 小时前
MAX14830 可移植 C 驱动实现分析:一个适合多串口扩展场景的开源基础版本
c语言·开发语言·开源
Elnaij13 小时前
从C++开始的编程生活(22)——红黑树
开发语言·c++
Trouvaille ~13 小时前
【项目篇】从零手写高并发服务器(六):EventLoop事件循环——Reactor的心脏
linux·运维·服务器·c++·高并发·epoll·reactor模式
学嵌入式的小杨同学13 小时前
STM32 进阶封神之路(十八):RTC 实战全攻略 —— 时间设置 + 秒中断 + 串口更新 + 闹钟功能(库函数 + 代码落地)
c++·stm32·单片机·嵌入式硬件·mcu·架构·硬件架构
学嵌入式的小杨同学13 小时前
STM32 进阶封神之路(十七):RTC 实时时钟深度解析 —— 从时钟源到寄存器配置(底层原理 + 面试重点)
c++·stm32·单片机·嵌入式硬件·mcu·硬件架构·pcb
.select.13 小时前
STL下常见容器底层数据结构
开发语言·c++
booksyhay13 小时前
XCP协议学习笔记
网络·笔记·学习
计算机魔术师13 小时前
一键沉浸式体验:清华开源OpenMAIC,重塑多智能体学习新范式
学习·typescript·开源·多智能体·openmaic
于先生吖13 小时前
基于 Java 开发短剧系统:完整架构与核心功能实现
java·开发语言·架构