1. 输入输出操作符简介

C++中输入操作符是>>,输出操作符是<<,又叫做流对象的“插入操作符”和“提取操作符“。其实这两个操作符最初是在C语言中用于整数的移位运算,到了C++中才利用操作符重载的技术将它们应用于输入、输出操作。

2.重载的原因

应用于基本类型的输入、输出操作都已经在C++标准库中定义好,没有必要重新定义,也不允许重新定义。而对于用户自定义类来说,如果想利用输入、输出操作符进行本类对象的输入、输出操作,就需要对<<和>>操作符进行重载。

3.重载的形式

对输出操作符<<进行重载,只能采用友元函数的形式进行,而不能将operator<<()申明为ostream类的成员函数。这是因为ostream是在C++标准中定义的类,不允许用户随便修改。所以,要将类someClass的对象输出到标准输出对象,只能采用将operator<<()重载为全局函数,申明为someClass类的友元的形式进行。而且,这时的输出操作符函数原型下述五种形式之一:

ostream& operator<<(ostream&,const someClass&);
或者
ostream& operator<<(ostream&,const someClass*);ostream& operator<<(ostream&, someClass&);
或者
ostream& operator<<(ostream&, someClass*);ostream& operator<<(ostream&, someClass);

其一,第一种形式最好,也是最常用的。这种函数重载,既安全又高效。

对于输入操作符>>进行重载,也是能采用友元函数的形式进行,而不能讲operator>>()申明为istream类的成员函数。这是因为istream也是C++标准库的类,也不能被用户随意修改。所以,要从标准输入对象将数据读入类someClass的对象中,只能采用operator>>()重载为全局函数,且申明为someClass类的友元的形式。输入操作符函数原型一定是:

istream& ostream>>(istream&,someClass&);
或者
istream& ostream>>(istream&,someClass*);

4.重载的示例

下面是输入和输出操作符的例子。

#include <iostream>
using namespace std;class Complex
{double real;double image;
public:Complex(double r=0.0,double i=0.0){real=r;image=i;}friend ostream& operator<<(ostream&,const Complex&);friend istream& operator>>(istream&,Complex&);
};ostream& operator<<(ostream& o,const Complex& c)
{o<<c.real<<"+"<<c.image<<"i";return o;
}istream& operator>>(istream& i,Complex& c)
{bool success=false;char ch;while(!success){cout<<"please input a complex:"<<endl;i>>c.real;i>>ch;if(ch!='+'){//cin.clear();         //清除错误标志//cin.ignore(numeric_limits<std::streamsize>::max(),'\n'); //清除缓冲区的当前行continue;}i>>c.image;i>>ch;if(ch!='i'){//cin.clear();         //清除错误标志//cin.ignore(numeric_limits<std::streamsize>::max(),'\n'); //清除缓冲区的当前行continue;}else success=true;}return i;
}int main(int argc, char* argv[])
{Complex c;cin>>c;cout<<c;return 0;
}

从键盘键入3.4+5.6i然后回车,程序的运行结果是:

please input a complex:
3.4+5.6i
3.4+5.6i

阅读以上程序,要注意以下几点。
(1)对于输入输出操作符进行重载,只能采用友元函数的形式,而不能采用成员函数的形式,原因前面已经讲述。

(2)如果将输入操作符函数申明为:

ostream operator<<(ostream,const Complex&);
//或者将输入操作符申明为:
istream operator>>(istream,Complex&);

都会产生编译错误。原因是istream类和ostream类的拷贝构造函数被申明为私有(private)成员,这样实际上就阻止了istream类型和ostream类型的参数的传值行为,也就阻止了他们成为函数的返回值。

(3)格式化的输出操作比较容易实现,因为输出的内容已经准备好,如何输出完全由程序员来安排。而格式化的输入操作要复杂一些,因为输入的内容事先是不知道的,用户在输入数据的过程中可能会存在违反约定的行为。所以,在格式化输入函数中通常还要加入一些容错的处理。

在上面的程序中,对用户输入的内容的错误性判断还不是特别完善,有兴趣的读者可以自行改进或将程序中continue语句前的两行注释取消,可提高输入的容错性。关于cin的详细用法见我的另一篇blog cin的详细用法。


参考文献

[1]陈刚.C++高级进阶教程[M].武汉:武汉大学出版社,2008[4.7(P320-P322)]

C++输入输出操作符重载相关推荐

  1. C++之操作符重载和运算符重载

    一.学习要点: 1.类中定义的构造器可以必须在类中声明,但定义可以在类内和类外. 2.插入器和吸取器的构造类型必须输入参数和输出参数都含有对象,这样可以不断保证右插. 3.而且输入输出中都含有流的引用 ...

  2. C++基础11-类和对象之操作符重载1

    总结: 1.运算符重载的本质是函数重载 2.运算符重载可分为成员函数重载和全局函数重载(差一个参数) 3.运算符重载函数的参数至少有一个是类对象(或类对象的引用) 4.不可以被重载的操作符有:成员选择 ...

  3. 操作符重载!看这篇就够了!

    实现一个操作符重载的方式通常有两种情况: 将操作符重载实现为类的成员函数. 操作符重载实现为非类的成员函数(即全局函数). 将操作符重载实现为类的成员函数 在类体中声明(定义)需要重载的操作符,声明方 ...

  4. C++拾趣——有趣的操作符重载

    操作符重载是C++语言中一个非常有用的特性.它可以让我们比较优雅的简化代码,从而更加方便的编写逻辑. 为什么要使用操作符重载 一种常见的用法是重载<<运算符,让标准输出可以输出自定义的类型 ...

  5. 操作符重载——C/C++学习笔记

    此篇文章来自于网上,作为自己学习中的笔记,若有侵权行为,请告之,24小时之内必删除!下面就转入正题吧! 一.什么是操作符重载? 一看到重载,很容易就让人联想到成员函数重载,函数重载可以使名称相同的函数 ...

  6. C++——构造函数(拷贝构造,拷贝复制),析构函数,操作符重载

    C++--构造函数(拷贝构造,拷贝复制),析构函数,操作符重载 构造函数与析构函数:: 涉及构造函数还可以看这篇文章C++搞懂深拷贝初始化=与赋值=的区别 1.声明和定义构造函数和析构函数 构造函数在 ...

  7. 【Groovy】map 集合 ( map 集合操作符重载 | 使用 << 操作符添加一个元素 | 代码示例 )

    文章目录 一.使用 " << " 操作符添加一个元素 二.代码示例 一.使用 " << " 操作符添加一个元素 对 map 集合 使用 ...

  8. 【Groovy】map 集合 ( map 集合操作符重载 | *. 展开操作符 | 代码示例 )

    文章目录 一.map 集合 " *. " 展开操作符 二.代码示例 一.map 集合 " *. " 展开操作符 对 map 集合使用 " *. &qu ...

  9. 【Groovy】map 集合 ( map 集合操作符重载 | - 操作符重载 | 代码示例 )

    文章目录 一.map 集合 " - " 操作符重载 二.完整代码示例 一.map 集合 " - " 操作符重载 对 map 集合 使用 " - &qu ...

最新文章

  1. 和12岁小同志搞创客开发:如何驱动LCD1602液晶显示屏?
  2. SAP HUM 内向交货单凭证流和Relationship Browser
  3. CSU 1081集训队分组(搜索)
  4. Cpp / 引用的本质
  5. 文档数据库RavenDB-介绍与初体验
  6. python 上下文管理器、 else 块、@contextmanager
  7. ❤『知识集锦』一文搞懂mysql索引!!(建议收藏)
  8. 数据结构 创建顺序表
  9. [转]自己写PHP扩展之创建一个类
  10. SecureCRT中解决乱码的问题
  11. 用java语言写网上购物的语句_用java代码写一个简单的网上购物车程序
  12. 路由与交换技术考试常见问答
  13. Pytorch——Conv2d、conv2d
  14. 因收费被抵制、如今又被明星索赔百万,丰巢出路在何方?
  15. 不要再「外包」AI 模型了!最新研究发现:有些破坏机器学习模型安全的「后门」无法被检测到...
  16. VS2013写的程序在Win XP下运行的完美解决方案(百分百成功)
  17. 认计算机电源,电脑硬件认识之什么是电脑的电源[图文]
  18. 腾讯地图数据可视化之热力图
  19. 火山安卓-车票查询软件
  20. 测牛学堂:2023软件测试自动化python入门(字符串的格式化输出)

热门文章

  1. 最受企业青睐的开源软件包是什么?它们的三大风险是什么?
  2. 几个大厂及 RCE漏洞二三事
  3. KafKa基本入门教程
  4. 2017-2018-1 20155229 实验五 《通讯协议设计》
  5. Ant构建与部署Java项目---入门
  6. [研究笔记]Lambda表达式学习笔记
  7. WP7中,如何把7.1的项目改为7.0的
  8. 基于报文大小的策略路由
  9. python进阶教程之异常处理
  10. sqlite 按拼音排序