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

流插入运算符 <<

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

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值