流插入和流提取操作符是两个我们常用的操作符。对于内置类型我们可以很方便的使用,不过对于自定义类型,要想这两个操作符的结果符合我们的预期,则需要我们自己根据自定义类型来重载这两个操作符。
1.流插入操作符:

我们根据标准库里的实现来,可以知道返回值和参数都是一样的ostream的对象
//假设我们已经实现了date类
class date
{
public:
operator <<(ostream& out)
{
out<<_year<<"/"<<_month<<"/"<<_day;
}
};
不过我们这样实现了依旧调不动
date d1;
cout<<d1;
因为顺序有问题,我们实现的是成员函数,它的第一个操作数默认是this指针,所以需要调换一下使用顺序,不过感觉挺不方便的。
date d1;
d1<<cout;
因为不符合我们的使用逻辑。所以,下一步需要把使用顺序调换过来,那样就不能使用成员函数了,只能定义成公有函数,但是我们仍然需要使用成员变量,于是我们需要用到一个关键字——friend。
//假设我们已经实现了date类
class date
{
friend ostream& operator <<(ostream& out,date d1);
public:
};
ostream& operator <<(ostream& out,date d1)
{
out<<_year<<"/"<<_month<<"/"<<_day;
}
这个就是友元声明,友元声明之后,外部的函数或者类就可以访问类里面的所有成员了。关于友元,在该专栏的另一篇文章有更详细的介绍。C++:友元-CSDN博客
注意,函数的返回值也得是ostream的对象,否则
date d1,d2;
cout<<d1<<d2;
以上的情况就无法应对。
同时流插入需要注意是否需要const版本。
2.流提取:
与流插入相似,不过没有const版本。
流插入和流提取都是以空格作为分隔