流插入运算符 <<
class Coordinate{
friend ostream& opeartor<<(ostream &out,const Coordinate &coor);
public:
Coordinate(int x,int y){m_iX=x,m_iY=y;}
private:
int m_iX;
int m_iY;
};
friend ostream& opeartor<<(ostream &out,const Coordinate &coor){
out<<coor.m_iX<<" "<<coor.m_iY;
return out;
}
int main(){
Coordinate coor1(3,5);
cout<<coor1; //operator<<(cout,coor1)
return 0;
}
流提取运算符 >>
class Coordinate{
friend ostream& opeartor>>(istream &out,const Coordinate &coor);
public:
Coordinate(int x,int y){m_iX=x,m_iY=y;}
private:
int m_iX;
int m_iY;
};
friend ostream& opeartor>>(istream &in,const Coordinate &coor){
in>>coor.m_iX>>coor.m_iY;
return in;
}
int main(){
Coordinate coor2(3,5);
in>>coor2; //operator<<(in,coor2)
return 0;
}
大家可能已经注意到了上面的重载函数都是用的类外友元函数,而不能是成员函数,原因是流插入和流提取的重载函数形式如下:
ostream & opeartor >>(ostream& ,自定义类&);
istream & opeartor <<(istream& ,自定义类&);
可以看到流运算符重载函数的第一个参数必须是流类型的(ostream/istream),而我们之前说过成员函数的第一个参数本质上其实是类本身,因此冲突,只能用类外友元函数来重载。
然后,来解释一下“>>“重载函数的最后一行
return out;
先说作用是:保持输出流的现状从而能够连续输出。
假如重载之后有这样一条语句:
cout<<c1<<c2; //c1,c2是对象
先处理前面的cout<
(cout<<c1)<<c2;
由于重载函数最后的返回值类型是ostreams,所以前面的结果
结果是新的流对象cout(新),然后再执行
cout(新)<<c2;
这也就解释了为什么C++规定流运算符重载函数的第一个参数必须是流类型的(ostream/istream),就是为了能返回cout的当前值以便连续输出。
“<<“的重载函数同理,不再赘述。