加载中...
三大关联知识点综合强化复习
第1节:“流”的基本概念与应用
第2节:C++和C标准输入输出同步
第3节:C++和C的格式化输入输出
第4节:重温文件流和字符串流
第5节:为自定义类型重载流操作
第6节:三大关联知识点综合强化复习
第7节:从零开始,实现日志流
第8节:“我的日志流”终版
课文封面

深入学习如何针对特定函数类型,为流输出操作符提供新的重载版本;为下一节课亲手打造“日志流”奠定基础。

前言

C++中,“流” 的日常运用,最基本的就是在你的代码里使用 << 和 >> 操作符,比如:

int age; cin >> age; // 使用流输入操作符 >> cout << "你的年龄:" << age; // 使用 流输出操作符 <<

高级一点的使用,就是为自定义的类型,重载 << 和 >> :

struct Point {int x, y;} using namespace std; // 为 Point 类型重载流输出操作 ostream& operator << (ostream& os, Point const& pt) { os << pt.x << ' ' << pt.y; return os; } // 为 Point 类型重载流输入操作 istream& operator >> (istream& is, Point& pt) { is >> pt.x >> pt.y; return is; }

这一节我们借助对流、操作符、函数综合复习所要讲的用法,似乎更“高级”了:我们需要用流对象来输入或输出(课程以前者为例)特定类型的函数。

这么做,是为了能够实现类似我们下一节需要的“日志流”功能奠定知识基础;所以这一节课,我们一定要掌握:针对特定类型的函数,为流输出操作符(也就是 << )提供重载。

视频

代码

视频中使用的在线编程环境:Online GDB

由于某些原因,每次打开该网站,可能需要等可能超出3分钟的,很长一段时间 (但最终确实能打开的)

1:输出 int (int, int) 类型的函数

#include <iostream> using namespace std; /* 下面的 add 和 sub,类型都是 int(int, int) */ int add(int a, int b) { return a + b; } int sub(int a, int b) { return a - b; } // 为 int (int, int) 类型的函数,重载流输出操作符 << ostream& operator << (ostream& os, int (f) (int, int)) { os << f(1, 2); // 参数固定为 1,2 return os; } int main() { cout << add << ", " << sub << endl; // 完美结合 }

在线运行:
流输出 int (int, int) 类型的函数示例代码

2:输出 ostream& (ostream&) 类型的函数

#include <iostream> using namespace std; ostream& say_OK(ostream& os) // 和 std::endl 类型一样的示例函数 { os << "OK!"; return os; } void test() { cout << "Are you OK? " << say_OK << say_OK << say_OK << endl; } int main() { test(); }

在线运行:
流输出 ostream& (ostream&) 类型的函数示例代码