操纵符(manipulator)endl
“写入endl的效果是结束当前行。”
学习过C语言的程序猿自然会把输出语句与C语言中的输出语句联系起来,也就是说: cout<<”Hello world”<<endl;
相当于printf(“Hello world\n”);
由于endl会导致输出的文字换行,自然而然地我们会想到endl可能就是换行符’\n’。
但是,如果我们定义char c=endl;会得到一个编译错误,这说明endl并不是一个字符,所以应该到系统头文件中去查找endl的定义。通过VS2012转到定义,找到了endl的定义如下:
template<class _Elem,class _Traits> inline basic_ostream<_Elem, _Traits>&
__CLRCALL_OR_CDECL endl(basic_ostream<_Elem, _Traits>& _Ostr)
{ // insert newline and flush stream
_Ostr.put(_Ostr.widen('\n'));
_Ostr.flush();
return (_Ostr);
}
从定义中看出,endl是一个函数模板,它实例化之后变成一个模板函数,其作用如这个函数模板的注释所示,插入换行符并刷新输出流。
“写入endl的效果是结束当前行,并将设备关联的缓冲区(buffer)中的内容都刷到输出设备中。”
其中刷新输出流指的是将缓冲区的数据全部传递到输出设备并将输出缓冲区清空。
“缓冲刷新操作可以保证到目前为止程序所产生的所有输出都真正写入输出流中,而不是仅停留在内存中等待写入流。”