如何针对特定函数类型重载流输出操作符?这样做有什么用处?C++语言中,“流”、“操作符”、“函数重载” 这三大军团如何配合作战?
前言
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;
}
这一节我们借助对流、操作符、函数综合复习所要讲的用法,似乎更“高级”了:我们需要用流对象来输入或输出(课程以前者为例)特定类型的函数。
这么做,是为了能够实现类似我们下一节需要的“日志流”功能奠定知识基础;所以这一节课,我们一定要掌握:针对特定类型的函数,为流输出操作符(也就是 << )提供重载。
视频
C++之“流”-第5课-三军联动:流、操作符、函数重载
代码演化
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,2return 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&) 类型的函数示例代码