前言
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();
}