C++中,标准库本身已经对左移运算符<<和右移运算符>>分别进行了重载,使其能够用于不同数据的输入输出,但是输入输出的对象只能是 C++ 内置的数据类型(例如 bool、int、double 等)和标准库所包含的类类型(例如 string、complex、ofstream、ifstream 等)。

如果我们自己定义了一种新的数据类型,需要用输入输出运算符去处理,那么就必须对它们进行重载。

其实 C++ 标准库已经提供了 complex 类,能够很好地支持复数运算,但是这里我们又自己定义了一个 complex 类,是为了帮助大家更好的理解。

让复数的输入输出和 int、float 等基本类型一样简单。假设 num1、num2 是复数,那么输出形式就是:

cout<<num1<<num2<<endl;

输入形式就是:

cin>>num1>>num2;

cout 是 ostream 类的对象,cin 是 istream 类的对象,要想达到这个目标,就必须以全局函数(友元函数)的形式重载<<和>>,否则就要修改标准库中的类,这显然不是我们所期望的。

重载输入运算符>>

我们以全局函数的形式重载>>,使它能够读入两个 double 类型的数据,并分别赋值给复数的实部和虚部:

istream & operator>>(istream &in, complex &A){in >> A.m_real >> A.m_imag;return in;
}

istream 表示输入流,cin 是 istream 类的对象,只不过这个对象是在标准库中定义的。之所以返回 istream 类对象的引用,是为了能够连续读取复数,让代码书写更加漂亮,例如:

complex c1, c2;
cin>>c1>>c2;

如果不返回引用,那就只能一个一个地读取了:

complex c1, c2;
cin>>c1;
cin>>c2;

另外,运算符重载函数中用到了 complex 类的 private 成员变量,必须在 complex 类中将该函数声明为友元函数:

friend istream & operator>>(istream & in , complex &a);

>>运算符可以按照下面的方式使用:

complex c;
cin>>c;

当输入1.45 2.34↙后,这两个小数就分别成为对象 c 的实部和虚部了。cin>> c;这一语句其实可以理解为:

operator<<(cin , c);

重载输出运算符<<

我们也可以模仿上面的形式对输出运算符>>进行重载,让它能够输出复数,请看下面的代码:

ostream & operator<<(ostream &out, complex &A){out << A.m_real <<" + "<< A.m_imag <<" i ";return out;
}

ostream 表示输出流,cout 是 ostream 类的对象。由于采用了引用的方式进行参数传递,并且也返回了对象的引用,所以重载后的运算符可以实现连续输出。

为了能够直接访问 complex 类的 private 成员变量,同样需要将该函数声明为 complex 类的友元函数:

friend ostream & operator<<(ostream &out, complex &A);

示例演示

结合输入输出运算符的重载,重新实现 complex 类:

#include <iostream>
using namespace std;class complex{public:complex(double real = 0.0, double imag = 0.0): m_real(real), m_imag(imag){ };
public:friend complex operator+(const complex & A, const complex & B);friend complex operator-(const complex & A, const complex & B);friend complex operator*(const complex & A, const complex & B);friend complex operator/(const complex & A, const complex & B);friend istream & operator>>(istream & in, complex & A);friend ostream & operator<<(ostream & out, complex & A);
private:double m_real;  //实部double m_imag;  //虚部
};//重载加法运算符
complex operator+(const complex & A, const complex &B){complex C;C.m_real = A.m_real + B.m_real;C.m_imag = A.m_imag + B.m_imag;return C;
}//重载减法运算符
complex operator-(const complex & A, const complex &B){complex C;C.m_real = A.m_real - B.m_real;C.m_imag = A.m_imag - B.m_imag;return C;
}//重载乘法运算符
complex operator*(const complex & A, const complex &B){complex C;C.m_real = A.m_real * B.m_real - A.m_imag * B.m_imag;C.m_imag = A.m_imag * B.m_real + A.m_real * B.m_imag;return C;
}//重载除法运算符
complex operator/(const complex & A, const complex & B){complex C;double square = A.m_real * A.m_real + A.m_imag * A.m_imag;C.m_real = (A.m_real * B.m_real + A.m_imag * B.m_imag)/square;C.m_imag = (A.m_imag * B.m_real - A.m_real * B.m_imag)/square;return C;
}//重载输入运算符
istream & operator>>(istream & in, complex & A){in >> A.m_real >> A.m_imag;return in;
}//重载输出运算符
ostream & operator<<(ostream & out, complex & A){out << A.m_real <<" + "<< A.m_imag <<" i ";;return out;
}int main(){complex c1, c2, c3;cin>>c1>>c2;c3 = c1 + c2;cout<<"c1 + c2 = "<<c3<<endl;c3 = c1 - c2;cout<<"c1 - c2 = "<<c3<<endl;c3 = c1 * c2;cout<<"c1 * c2 = "<<c3<<endl;c3 = c1 / c2;cout<<"c1 / c2 = "<<c3<<endl;return 0;
}

运行结果:

2.4 3.6↙
4.8 1.7↙
c1 + c2 = 7.2 + 5.3 i
c1 - c2 = -2.4 + 1.9 i
c1 * c2 = 5.4 + 21.36 i
c1 / c2 = 0.942308 + 0.705128 i

C++ 重载左移和右移运算符相关推荐

  1. c语言中左移右移有什么作用,C语言中左移和右移运算符详细介绍

    搜索热词 C语言中左移和右移运算符详细介绍 左移运算符(< 左移运算符是用来将一个数的各二进制位左移若干位,移动的位数由右操作数指定(右操作数必须是非负值),其右边空出的位用0填补,高位左移溢出 ...

  2. C++:左移和右移运算符 (> > 和 < <)

    C++:左移和右移运算符 > > 和 < < 简介 语法 备注 左移 右移 移位和提升 其他详细信息 脚注 简介 按位移位运算符是右移位运算符 (>>) ,它将 s ...

  3. 左移和右移运算符的重载问题(里面的绝对盲点)在做了一遍,还是出错了

    #include <iostream> //实现左移和右移的重载. using namespace std;class A { public:friend ostream operator ...

  4. C语言之左移和右移运算符

    1.左移运算符 格式:a<<b 将a这个数的各二进制位左移b位,要求b必须是非负整数,移动过程中,右边空出的位用0填补,高位左移溢出则舍弃该高位. 举例来看: a=5,二进制位:0000 ...

  5. 位运算符之---左移右移运算符(简单易懂)

    前言: 位运算符是用来对二进制位进行操作的 c语言中有6种位运算符: & 按位与 [链接]: https://blog.csdn.net/weixin_42837024/article/det ...

  6. c语言负数左移右移_C语言位运算符:与、或、异或、取反,左移和右移

    C语言位运算符:与.或.异或.取反.左移和右移 个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型. ,则该位的结果值为1,否则为0 | ...

  7. c++ 右移运算符重载 << 参数个数

    自己定义的point类,想使用c++的cout进行输出 有一种办法就是重载ostream的右移运算符 但是cpp源码不太好修改 还有一个办法就是是直接重载右移运算符 #include <iost ...

  8. 左移运算符和右移运算符的使用

    先简单介绍一下,左移运算符和右移运算符的功能:         计算机中的数字是以二进制补码的形式存放的,而左移和右移运算符就是将内存中的二进制补码数字向左或者右移动. 左移的结果: 1.左移会让最高 ...

  9. C符号之逻辑运算符 左移与右移 自增自减

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本篇文章 ...

最新文章

  1. HDU1892(二维树状数组)
  2. 洛谷1197星球大战
  3. Struts2中使用OGNL表达式投影(过滤)集合
  4. mysql relay log时间_如何得到Slave应用relay-log的时间
  5. 【BZOJ 1098】办公楼(补图连通块个数,Bfs)
  6. 【牛客 - 331D】炫酷路途(二进制枚举 或 建图方式+最短路 或 dfs)
  7. MSSQL中实现多表更新
  8. 全面认识UML-类图元素(java)
  9. 万字总结Keras深度学习中文文本分类
  10. gperftools
  11. conda和Anaconda的区别:
  12. 后端已经配置 前端还是报cors错误怎么回事_换一种姿势挖掘CORS漏洞
  13. Fourier分析基础(二)——由级数导出连续Fourier变换
  14. viewstub学习笔记
  15. cad审图软件lisp_cad审图什么软件好 创基出图助手教程(附下载)
  16. excel熵值法计算权重_SPSSAU一众新功能上线:高级公式、综合得分一键计算!
  17. 微信管理工具用什么比较好呀
  18. Navicat远程连接服务器mysql,先后报错10060,10061
  19. xbox手柄映射_如何在Windows 10中重新映射Xbox One控制器的按钮
  20. Image Segmentation Using Deep Learning: A Survery

热门文章

  1. idea序列化自动生成_serialVersionUID在数据序列化中重要性
  2. python爬取百度域名注册_python爬取百度域名_python爬取百度搜索結果url匯總
  3. 主从式网络的优点_贸泽电子原创开发板大赛【创意奖作品】物联网开发板做成主从机形式,是创意还是多此一举?...
  4. mysqldump 忽略视图_Mysql备份迁移——Mysqldump(.NET调用Mysqldump.exe方式)——(解决视图嵌视图报错)...
  5. 怎么在Windows 11中为音频输出选择扬声器
  6. 腾讯视频电脑版下载_腾讯视频~如何用腾讯视频
  7. 12nm 制程、Zen+ 微架构 AMD Ryzen 7 2700X 处理器详细测试 - 电脑领域 HKEPC Hard
  8. C++17新特性之std::string_view
  9. 二进制、八进制、十六进制相互转换
  10. java实现把数据写入到Excel并下载