输出操作符(<<)的左操作数必须是ostream对象,右操作数是要输出的值。操作符将其右操作数写到左操作数的ostream对象。


endl是一个特殊值,称为操纵符(manipulator),将它写入输出流时,具有输出换行的效果,并刷新与设备相关联的缓冲区。通过刷新缓冲区,用户可立即看到写入到流中的输出。除此之外,C++还提供了另外两个类似的操纵符,第一个是flush,用于刷新流,但不在输出中添加任何字符。第二个是ends,这个操纵符在缓冲区中插入空字符NULL,然后刷新它。

cout<<'a'<<flush<<'b'<<flush;
cout<<'a'<<ends<<'b'<<ends;


输出操作符重载:

为了与IO标准库一致,操作符应该接受ostream&作为第一个形参,对类类型对象的引用作为第二个形参,并返回ostream &。我们只能将重载函数作为友元函数或普通函数,而不能将其定义为成员函数。

class Complex
{
  public:  .........
  friend ostream& operator<<(ostream&,Complex&);
  private:  
  double real;
  double p_w_picpath;
}
ostream& operator<<(ostream& output, Complex& c)
{ 
  output<<"("<<c.real<<"+"<<c.imag<<"i)"<<endl;
  return output;
}
int main()
{
  Complex c1(2,4),c2(6,10),c3;
  c3=c1+c2;
  cout<<c3<<c2<<endl;
  return 0;
}


因为C++不允许对标准库类型进行复制或赋值操作,所以重载函数的第一个形参必须是对ostream对象的引用,即形参与实参共享同一段存储空间。return output就是return cout,将输出流cout的现状返回,即保留了输出流的现状。执行cout<<c3得到的结果就是具有新内容的流对象cout,因此,(cout<<c3)<<c2相当于cout(新值)<<c2。