输出操作符(<<)的左操作数必须是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。