🔷 第二章 C++语言基础
📄 一句话概括

iostream = input + output + stream(输入·输出·流)。它是 C++ 标准库里的一个头文件,作用是告诉编译器"我要用流的方式跟外界打交道",并声明四个现成的对象:cin(键盘 → 程序)、cout(程序 → 屏幕)、cerr(错误,立刻出)、clog(日志,先攒着)。入门阶段只会用到 cin 和 cout,其余两个知道有这么回事就行。

一、名字拆开看,一眼就懂

片段 全称 意思
i input 输入:数据从外面进程序
o output 输出:数据从程序往外出
stream stream 流:把数据看成一串"顺流而下"的字节

"流"这个字的妙处:你不需要关心数据具体怎么搬——只把数据"扔进水流",它自己会流到目的地。关于流,2.5.2 会专门讲;这一节先记住cout 就是一根通向屏幕的水管。

二、它给你四个现成的对象

#include <iostream>
using namespace std;

int main() {
    cout << "这行去屏幕(正常消息)" << endl;
    cerr << "这行也去屏幕(错误消息)" << endl;
    return 0;
}
对象 全称 方向 特点
cin character input 键盘 → 程序 配合 >> 使用(2.5)
cout character output 程序 → 屏幕 配合 << 使用,最常用
cerr character error 程序 → 屏幕 不缓冲,出错时立刻显示(怕程序挂了看不到)
clog character log 程序 → 屏幕 有缓冲,像写日志一样攒一批再输出
📝 为什么 `c` 打头

cout / cin / cerr 开头的 c 都是 character(字符)——流里流的是字符。这是从 C 语言继承来的命名习惯。

三、头文件 ≠ 库本身

这是新手最容易含糊的一点,说清楚:

iostream(头文件)      → 只负责"声明":告诉编译器 cout 长什么样、能怎么用
标准库(libstdc++/msvcprt) → 才放"实现":cout 到底怎么把字送到屏幕的代码

所以完整的链路是:#include <iostream>(编译前把声明贴进来)→ 编译(生成 .o,此时 cout 还只是个"说好了但没实现"的符号)→ 链接(把标准库的实现接上)→ 生成 .exe。

接口与实现分家,就是第 1 章"编译+链接两步"的实证。也解释了 1.3.1 那个现象:头文件找不到 → 编译就报错;库没接上 → 链接才报错。

四、和 C 语言的 <stdio.h> 对比

C 语言 C++
头文件 <stdio.h> <iostream>
输出 printf("%d", n); cout << n;
输入 scanf("%d", &n); cin >> n;
类型安全 差:格式符 %d 写错,编译器不管 好:类型自动识别,不用写格式符
扩展性 只能输出内置类型 你自己定义的类型也能用 << 输出(第 8 章之后会看到)

结论:C++ 用"流"替代 C 的"格式化函数",换来的是少犯错(不用背 %d %f %s)与可扩展。但 C 的 printf 排版控制更顺手,所以教材在实例 04 里也会教它——两把刀都会用,看场合挑。

五、动手 Demo:让 cout 和 cerr 分道扬镳

新建 stream.cpp:

#include <iostream>
using namespace std;

int main() {
    cout << "这是正常输出" << endl;
    cerr << "这是错误信息" << endl;
    return 0;
}

编译运行,屏幕上看不出区别(两行都显示)。真正的区别要这样试:在 Dev-C++ 里先 F11 编译,然后在 PowerShell 里进入工程目录,执行:

cd D:\Dev-Cpp\你的工程目录
.\stream.exe > out.txt 2> err.txt
type out.txt
type err.txt

看到什么算成功:out.txt 里只有"这是正常输出",err.txt 里只有"这是错误信息"——两条流水管果然是分开的。

30 秒实验:把 cerr 那行改成 clog,再用同样方式重定向,结果一样分成两个文件。体会:"显示在屏幕上"不等于"是同一条通道"。

六、常见误区

  1. "iostream 管所有输入输出"——只管控制台(键盘/屏幕)。文件读写是 <fstream>,字符串处理是 <sstream>(第 11 章之后)
  2. "写 #include <iostream.h> 也一样"——老编译器时代的写法,现代标准库没有 .h 版本,写了直接报"找不到文件"
  3. "cerr 和 clog 是多余的"——现在看不出用,等程序变复杂、需要分离"正常消息"和"错误消息"时(比如日志系统、自动化脚本判断程序是否失败),它们就派上用场
  4. "用 cout 输出就万事大吉"——cout 默认不换行,要换行得加 endl 或 "\n"(下一节 2.1.3 起会反复出现)
自测三问(点开对答案) 1. `iostream` 三个片段分别什么意思?——i=input 输入,o=output 输出,stream=流(数据的通道)。 2. `cout` 和 `cerr` 有什么区别?——都往屏幕送,但 `cout` 有缓冲(正常消息),`cerr` 不缓冲、出错时立刻显示(错误消息)。 3. 头文件和库分别负责什么?——头文件只**声明**(长什么样),库负责**实现**(真正干活的代码);所以头文件缺失报编译错误,库没接上报链接错误。

相关笔记