一、模拟 endl 输出换行并将缓冲区的数据刷新输出到屏幕显示

#include <iostream>
#define Stream std::basic_ostream<T1, T2>&template<typename T1, typename T2>
Stream CRLF(Stream _out)
{putchar('\n');return _out.flush(); //清缓冲区
}int main(void)
{std::cout << "第一行" << CRLF;  //已脱离std::空间 CRLF(std::cout);  //还可以这样调用,单独输出一空行 std::cout << "第三行" << CRLF;//std::cout << "第四行" << endl; //必须用std::endl return 0;
}/*
第一行//第二行是空行
第三行--------------------------------
Process exited after 1.197 seconds with return value 0
请按任意键继续. . .
*/

以下这样的代码更简洁:

#include <iostream>std::ostream& endl (std::ostream& _os)
{_os.put('\n');_os.flush();return _os;
}int main(void)
{std::cout << 1 << endl <<endl;   //这是自定义的 endl std::cout << 2 << std::endl;  //这是std的 endl endl(std::cout);          //这是自定义的 endl std::cout << "========" << endl;std::endl(std::cout);       //这是std的 endl std::cout << "========" << std::endl;return 0;
}/*
12================--------------------------------
Process exited after 0.9518 seconds with return value 0
请按任意键继续. . .
*/

二、重载操作符 << 模拟输出语句: cout << 123 << "abc\n" << endl;

#include <iostream>
#include <string>
#include <typeinfo>
#define endl "\n"class myOutText{
public:myOutText &operator << (auto s) {std::string str;if (typeid(s).name()==typeid(std::string("")).name()) str=s;if (str==endl) { std::cout << endl;std::cout.flush();}elsestd::cout << s ;//return *this; //返回自身引用以支持连续操作}
};int main(void)
{myOutText cout; auto a = "abc";double b = 8.9;cout << "string1-" << a;cout << endl;cout << "1<<23<<4.56:" << endl;cout << 1 << 23 << 4.56e-7 << " "<< b << endl << "crlf" << endl;std::string str = "endl";cout << str << endl << endl;return 0;
}/*
string1-abc
1<<23<<4.56:
1234.56e-007 8.9
crlf
endl--------------------------------
Process exited after 1.198 seconds with return value 0
请按任意键继续. . .
*/

关于<<重载后连续使用的问题还上思否去请教过,感谢TianSong小哥的指点:使用 return *this 返回自身引用。在此放出经他修改过的代码:

#include <iostream>class myOutText{
public:myOutText &operator << (auto s) {std::cout << s;return *this;}myOutText &operator << (void(*obj)(myOutText&)) {obj(*this);return *this;}void flush() {std::cout.flush();}
};void endl(myOutText &obj)
{obj << '\n';obj.flush();
}int main(void)
{myOutText cout; std::string str="abcd";cout << "string<<" << str << endl;cout << "1<<2<<" << endl <<endl;cout << 1 << 2.3 << str << endl; return 0;
}/*
string<<abcd
1<<2<<12.3abcd--------------------------------
Process exited after 0.4635 seconds with return value 0
请按任意键继续. . .
*/

TianSong的赠言和遵循的原则,也值得学习:

梅耶(Scott Meyers) 的经典名言 “恭喜大家,坐上了通往未定义道路的宇宙飞船”。

我遵循的两条原则:

  • 编译器警告即错误(除非十分清楚);
  • 违背基础语法、理论的事不做。

附:

例程二用到了操作符 typeid ,详细用法请见: 《用 typeid 操作符 做一个C++数据类型大全》

C++ 重载操作符 <<实现模拟输出语句: cout << endl;相关推荐

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

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

  2. C++用顶层函数重载操作符

    几句话总结:以顶层函数的形式重载操作符时,二元操作符重载函数必须有两个参数,一元操作符重载必须有一个参数.以顶层函数的形式重载操作符时的好处是: c1 = c2 + 13.5; c1 = 13.5 + ...

  3. 重载操作符与转换(上)

    重载操作符的作用: 通过操作符重载,程序员能够针对类类型的操作数定义不同的操作符版本.程序用移位操作符(>> 和 <<)进行输入输出,用加号操作符(+)将两个 Sales_it ...

  4. C++的重载操作符(operator)介绍

    本文主要介绍C++中的重载操作符(operator)的相关知识. 1. 概述     1.1 what operator 是C++的一个关键字,它和运算符(如=)一起使用,表示一个运算符重载函数,在理 ...

  5. c++ primer读书笔记-第十四章 重载操作符与转换

    C++ 允许我们重定义操作符用于类类型对象时的含义.如果需要,可以像内置转换那样使用类类型转换,将一个类型的对象隐式转换到另一类型. 例如标准库为容器类定义了几个重载操作符.这些容器类定义了下标操作符 ...

  6. C++中operator关键字(重载操作符)

    operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名. 这是C++扩展运算符功能的方法,虽然样子古怪,但也可以理解:一方面要使运算 ...

  7. C++高精度运算类bign (重载操作符)

    大数据操作,有例如以下问题: 计算:456789135612326542132123+14875231656511323132 456789135612326542132123*14875231656 ...

  8. C++ operator关键字(重载操作符)

    C++ operator关键字(重载操作符) operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名. 这是C++扩展运算符功能的方 ...

  9. C++用顶层函数重载操作符(三)用友元优化

    我们以顶层函数的形式进行操作符重载,但是因为无法直接访问 complex 类中的私有成员,故而在类中增添了 getimag().getreal().setimag() 和 setreal() 函数以操 ...

最新文章

  1. 模型诊断(Model Diagnostics)是什么?具体包含哪些内容?
  2. 功能强大的 C++ redis 客户端库增加至 acl 项目中
  3. “九头虫”病毒技术分析报告
  4. windows编写linux脚本,Windows PowerShell:共享您的脚本 - 在脚本中编写 Cmdlet | Microsoft Docs...
  5. 几何基础之点在多边形内的判断
  6. hadoop27---netty中handler的执行顺序
  7. mysql 中有没有临时表_MySQL 中的两种临时表
  8. mapreduce 算法_MapReduce算法–了解数据联接第1部分
  9. Kinect for Windows v2.0安装教程
  10. paip.提高稳定性---自动检测sleep mysql数据库死连接以及kill
  11. 430f149有几种封装类型_保险丝类型有哪一些?
  12. linux 文本编辑器Vim/Vi详细介绍
  13. 江苏计算机编程中小学,编程教育走进小学低年级
  14. 微信公众号订阅消息 wx-open-subscribe 的实现及闭坑指南
  15. 基于深度学习的核磁共振影像重建
  16. Android 沉浸式体验
  17. 中国未来经济发展方向,共享经济大势所趋
  18. html 爱心树,jQuery结合HTML5制作的爱心树表白动画
  19. div 自定义拉宽_纯Css实现Div高度根据自适应宽度(百分比)调整
  20. ctfshow七夕杯2022

热门文章

  1. 鱼眼相机1080P的标定内参转换为720P的内参鱼眼相机标定方法
  2. Centos7.x实现Cobbler无人值守安装
  3. vip.163邮箱登录指南,163vip邮箱体验分享
  4. 你是否知到西游记中孙悟空的师傅是什么人?
  5. Bootstrap+web+Idea实现登录页面(含验证码)
  6. 小米ES Pro和X Pro对比有什么区别?哪个更值得入手
  7. 十大开源Web应用安全测试工具
  8. ubuntu 桌面卡死,鼠标能动但是点击无效。
  9. Nginx配置浏览器缓存
  10. php子孙树,递归 迭代 得到家谱树 子孙树