我们在最初学习C++语言时就接触到"cout<<endl;"这样的语句。我们都知道endl表示换行的意思。我一直习惯这样使用,却并不是清楚其内部实现是怎么样的。今天看《C++ Standard Library, Sec. 13.6.1》,才真正弄明白。

首先,endl是一个操作符(Manipulators),但我们必须知道endl是一个什么类型的变量。endl是跟在”<<“运算符后面,故endl应该是一个参数。其实endl是一个函数名,它是一个"<<"运算符重载函数中的参数,参数类型为函数指针。下面我们看下内部函数实现。

1 ostream& ostream::operator << ( ostream& (*op) (ostream&))
2 {
3     // call the function passed as parameter with this stream   as the argument
4      return (*op) (*this);
5 }

1 std::ostream& std::endl (std::ostream& strm)
2 {
3     // write newline
4     strm.put('\n');
5     // flush the output buffer
6     strm.flush();
7     // return strm to allow chaining
8     return strm;
9 }

可以看出,运算符重载函数中的函数参数为一个函数指针,其指向一个输入输出均为ostream类引用的函数。而endl正是这样一个函数。所以我们在运行"cout<<endl;"语句时,endl是一个函数参数,类型为函数指针。然后会执行”return (*endl) (*this);“语句,即执行endl函数。endl函数输出一个换行符,并刷新输出缓冲区。

这样我们知道在标准库中endl是作为一个函数实现的,显然我们也可以直接调用这一函数。我们看下面的测试程序:

1 #include<iostream>
2 using namespace std;
3
4 int main()
5 {
6     cout<<endl;
7     endl(cout);
8     return 0;
9 }

其输出为两个空行。”cout<<endl"中,endl是一个类型为函数指针的函数参数,通过运算符重载函数间接调用了endl函数。而“endl(cout)”中,endl是函数名,直接调用了endl函数。

转载于:https://www.cnblogs.com/ldeng/archive/2012/09/02/2667942.html

C++ endl 详解相关推荐

  1. 详解让人闹心的C++语句 cout<<“Hello“<<endl;

    语句"cout<<"Hello!"<<endl;"的作用是输出字符串Hello和换行符到屏幕,下面详解这句话! cout是标准库iost ...

  2. ORB-SLAM2代码/流程详解

    ORB-SLAM2代码详解 文章目录 ORB-SLAM2代码详解 1. ORB-SLAM2代码详解01_ORB-SLAM2代码运行流程 1 运行官方Demo 1.2. 阅读代码之前你应该知道的事情 1 ...

  3. 【C++】C++对象模型:对象内存布局详解(C#实例)

    C++对象模型:对象内存布局详解 0.前言 C++对象的内存布局.虚表指针.虚基类指针解的探讨,参考. 1.何为C++对象模型? 引用<深度探索C++对象模型>这本书中的话: 有两个概念可 ...

  4. C++条件变量使用详解

    1. condition_variable介绍 在C++11中,我们可以使用条件变量(condition_variable)实现多个线程间的同步操作:当条件不满足时,相关线程被一直阻塞,直到某种条件出 ...

  5. 【OpenCV 4开发详解】分割图像——分水岭法

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  6. 【OpenCV 4开发详解】QR二维码检测

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  7. 【OpenCV 4开发详解】深度神经网络应用实例

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  8. 【OpenCV 4开发详解】图像修复

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  9. 【OpenCV 4开发详解】分割图像——Mean-Shift分割算法

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

最新文章

  1. 乐行科技获1.08亿元A轮融资,并推出艾特好车
  2. JAVA中堆栈和内存分配原理
  3. Python之区块链简单记账本实现
  4. java k均值_算法——K均值聚類算法(Java實現)
  5. tensorflow神经网络结构可视化
  6. [转]CentOS 7忘记root密码解决办法
  7. canvas图形编辑器
  8. profile、服务、特征、属性之间的关系
  9. SQL Server 2005参考:PIVOT
  10. ntext在mysql_varchar和text说不清的那些事
  11. linq to xml查询绑定GridView
  12. How to remove replication in Syteline
  13. 算法速学速用大辞典 pdf_随机梯度蒙特卡洛算法-重要性采样
  14. C语言 图书管理系统(课程设计)
  15. 关闭笔记本电脑计算机键盘,笔记本小键盘怎么关闭,教您怎么关闭笔记本小键盘...
  16. 安卓 USB 无权限请求权限崩溃 UsbManager.requestPermission()空指针异常
  17. 如何在自己的应用中打开支付宝客户端
  18. linux 内核 禁止抢占,内核抢占实现(preempt)
  19. Oracle EBS FSG报表输出记录追溯出错
  20. CDay09 联合和枚举

热门文章

  1. Excel时间做差,统计加班时长
  2. word办公插件中的佼佼者,Word魔方
  3. java jdk7.0安装包_jdk7下载|java jdk 1.7下载 安装包 - 跑跑车手游网
  4. 软件界面原型设计工具(Web):Axure RP
  5. MySQL数据库名字能不能用中划线 ‘-’ ?
  6. 基于PyTorch的生成对抗网络入门(3)——利用PyTorch搭建生成对抗网络(GAN)生成彩色图像超详解
  7. 面对来势汹汹的AI大潮,你该如何应对?
  8. Android app升级完成以后自动重启自身App
  9. linux的pv原语
  10. 自然语言处理与模型评价