深入解析C++输入输出运算符重载
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 其实算不上什么深入解析,只不过最近看CArchive类的实现,其中一些写法完全颠覆了我对输入输出运算符重载的一些理解,所以在这里mark一下。 我们以输出运算符为例。首先输出运算符重载的一般形式是 friend ostream & operator<< ( ostream & o , const ClassName & c );[1] ostream是c++流输出的类,至于友元,只记得说输入输出运算符必须用友元重载,因为ostream是受保护的。今天看CArchive类实现的时候,里面有如下的定义 friend CArchive & AFXAPI operator >>( CArchive & ar , CObject *& pOb ); 于是才发觉ostream并不是必需的,换句话说,从语法上讲,ostream的位置放什么类都可以,只不过语义上要行得通。而友元的重载从语法上讲也不是必须的,比如可以依然用成员函数重载,函数定义变成如下的格式 ostream & operator >>( ostream & o ); 使用的时候只能用object>>cout(或者cout>>object这就太别扭了)形式了,并且不可能连续使用了(比如obj1>>obj2>>cout),这违背了C++规范,但是语法上是的过得去的。