在C++中,标准库本身已经对左移运算符<<和右移运算符>>分别进行了重载,使其能够用于不同数据的输入输出,但是输入输出的对象只能是 C++ 内置的数据类型(例如 bool、int、double 等)和标准库所包含的类类型(例如 string、complex、ofstream、ifstream 等)。
如果我们自己定义了一种新的数据类型,需要用输入输出运算符去处理,那么就必须对它们进行重载。
下面以我们c++作业中的一道题为例
【CPP0048】复数类四则运算及插入/提取操作
为复数类Complex重载实现+,-,*,/,<<,>>等运算符,main(void)函数完成对其的测试

#include <iostream>
using namespace std;
#define Complex complex;
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 = B.m_real * B.m_real + B.m_imag * B.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) {if(A.m_imag>0)out << A.m_real << "+" << A.m_imag << "i";elseout << A.m_real<< A.m_imag << "i";return out;}
int main() {complex c1(1, 1), c2(-1, -1), c3;   //定义复数类的对象cin >> c1;cout << c1 << endl;cout << c2 << endl;c3 = c1 - c2;cout << c3 << endl;c3 = c1 + c2;cout << c3 << endl;c3 = c1 * c2;cout << c3 << endl;c3 = c1 / c2;cout << c3 << endl;return 0;
}
问题解答:
1为什么complex里面要用的友元函数?
cout 是 ostream 类的对象,cin 是 istream 类的对象,要想达到这个目标,就必须以全局函数(友元函数)的形式重载">>"和"<<",而且因为重载">>"和"<<"要用到complex的私有成员函数,所以用友元函数实现。
2为什么重载的">>"和"<<"里面的参数有istream,ostream这些东西?
ostream为输出流
&在这里为引用
ostream& out为定义一个名字为out的引用型道输出流对象
同理 in。

复数类四则运算及插入/提取操作zrx相关推荐

  1. 7-1 复数类的操作

    7-1 复数类的操作 1.声明一个复数类Complex(类私有数据成员为double型的real和image) 2.定义构造函数,用于指定复数的实部与虚部. 3.定义取反成员函数,调用时能返回该复数的 ...

  2. 编程题:7-2 复数类的操作

    1.声明一个复数类Complex(类私有数据成员为double型的real和image) 2.定义构造函数,用于指定复数的实部与虚部. 3.定义取反成员函数,调用时能返回该复数的相反数(实部.虚部分别 ...

  3. 7-3 复数类的操作 (20分)----十分简单的代码

    1.声明一个复数类Complex(类私有数据成员为double型的real和image) 2.定义构造函数,用于指定复数的实部与虚部. 3.定义取反成员函数,调用时能返回该复数的相反数(实部.虚部分别 ...

  4. C++ 实现一个复数类

    要求 实现⼀个复数类 Complex . Complex 类包括两个 double 类型的成员 real 和 image ,分别表示复数的实部和虚部. 对 Complex 类,重载其流提取.流插⼊运算 ...

  5. 傅里叶变换基本概念及复数类实现

    最近对图像处理算法比较感兴趣,也看了一些数字图像处理相关书籍,自己也实现过一些简单的图像处理算法.随着了解的深入,发现要真正理解图像处理各种骚操作,绕不开基于傅里叶变换的各种频率域滤波.对于lz这种数 ...

  6. 【C++深度剖析教程11】C++学习之编写代码实现复数类

    今天,我来学习将复数的加减乘除以及比较运算,编写一个复数类,方便计算复数之间的运算.具体用的方法就是之前写过的操作符重载的概念来实现(操作符重载的概念学习). 那么为了显得清晰,今天写的程序运用模块化 ...

  7. C++编程入门--运算符重载复数类

    题目:成运算符重载员函数形式实现复数类的四则运算 上机指导2中,我们以独立函数形式(非成员函数,非友元函数)实现了Complex附属类的加减乘除四则运算,这里要求用Complex成员函数形式实现Com ...

  8. 4-1 复数类的运算符重载

    4-1 复数类的运算符重载 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 通过本题目的练习 ...

  9. 【C语言】复数的四则运算与复数运算的头文件

    目录 一.复数的四则运算 二.复数的头文件#include<complex.h> 三.一些碎碎念 一.复数的四则运算 (1)计算方法 加法:(a+bi)+(c+di)=(a+c)+(c+d ...

最新文章

  1. 长沙望城:当好“贴心人” 扎牢“人民根” 坚守“云阵地”
  2. Asp.net动态加载控件的一些问题
  3. ORA-12545: Connect failed because target host or object does not exist
  4. 第一次scrum冲刺
  5. php fpm工作原理,什么是phpfpm的工作原理?
  6. 想成为企业争抢的目标吗?你需要掌握的五大热门IT技能
  7. QB期刊 | 纪念HGP20周年系列文章3:陈润生院士回顾我国早期生物信息学的发展...
  8. FAST算法学习笔记
  9. 弹性地基梁板实用计算_3款实用性高的农村别墅,造价低,越看越有韵味
  10. Python中hashlib.sha1()和hashlib.MD5()哈希算法的区别
  11. Word一般文章格式
  12. 易宝支付 java_易宝支付工具类
  13. beetl 获取html属性值,Beetl2.7.16中文文档(2)之高级功能
  14. 数据库插入、删除、修改语句
  15. java程序设计特点_Java编程语言的特点
  16. ST-Link烧写简单总结
  17. python伪装浏览器https_Selenium中通过修改User-Agent标识将PhantomJS伪装成Chrome浏览器...
  18. (附源码)springboot毕业论文管理系统 毕业设计 030946
  19. 如何查看linux系统版本
  20. 品牌传播之广告记忆效果研究

热门文章

  1. THE LION KING
  2. 白沙工业园新松机器人_郑州东强再传佳音,总投资约48亿,两大科技园区备案批复,开工时间已拟定!...
  3. python使用matplotlib制作精美的饼图
  4. cross entropy loss = log softmax + nll loss
  5. 【C++练习】4.1假设有三家银行:中国银行BOC、工商银行ICBC和农业银行ABC
  6. 基于WebServices简易网络聊天工具的设计与实现
  7. AV1 1.0 发布
  8. Docker三剑客——Machine
  9. python 正则匹配 手机号 QQ号 邮箱 日期 图片
  10. MOT论文笔记《MOTS: Multi-Object Tracking and Segmentation》