//Foo.h
#include<iostream>
using namespace std;
class Foo
{
public:
Foo(int val = 0);
ostream& operator<<(ostream& os);
friend ostream& operator<<(ostream& os,const Foo& foo);
istream& operator>>(istream& in);
friend istream& operator>>(istream&in,Foo& foo);
~Foo();
private:
int val;
}
//Foo.cpp
#include"Foo.h"
ostream& Foo::operator<<(ostream& os)
{
os<<this->val<<endl;
return os;
}
ostream& operator<<(ostream& os,const Foo& foo)
{
os<<foo.val<<endl;
return os;
}
istream& Foo::operator>>(istream& in)
{
in>>this->val;
return in;
}
istream& operator>>(istream& in,Foo& foo)
{
in>>foo.val;
return in;
}
//main.cpp
#include"Foo.h"
int main()
{
Foo foo = Foo(1);
foo<<cout;//调用的Foo的类成员函数,之所以会出现这种违背习惯的用法是如果声明为类成员函数则会有this默认做为一个形参,且必须为该操作符的左值。
cout<<foo;//调用的Foo类的友元函数
cin>>foo;//友元
foo>>cin;//类成员函数
return 0;
}
//通过以上说明,在重载输出输入运算符的时候,必须声明为友元函数。