运算符重载(2)———流运算符重载函数

来源:互联网 发布:阿里云 发邮件 编辑:程序博客网 时间:2024/06/05 09:32

流插入运算符 <<

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的当前值以便连续输出。

“<<“的重载函数同理,不再赘述。

原创粉丝点击