在C++编程中实现数据的输入/输出能够用cin>>ch/cout<<ch;

可是使用cin>>ch或cout<<ch并不能实现一些特殊的数据的输入或者输出,比方输入复数、输出复数、输入时间、输出时间

为了解决对于特殊数据的输入和输出在C++中能够使用运算符重载的方式实现。能够通过重载>>和<<运算符实现特殊数据的输入和输出

1重载>>

重载函数的形式:

<span style="color:#000000;">friend istream&  operator >>(istream& input, Complex& c);</span>

第一个參数: istream表示输入流

第二个參数: Complex& 表示对Complex类实行输入

返回值: istream表示返回输入流

2重载<<

重载函数的形式:

 friend ostream&  operator <<(ostream& output, Complex& c);

第一个參数: ostream表示输入流

第二个參数:
Complex& 表示对Complex类实行输出

返回值:
ostream表示返回输出流

运用实例,通过重载>>和<<实现复数的输入和输出

#include <iostream>

using namespace std;

class Complex
{
public:
Complex( )//定义默认构造函数初始化复数
{
real=0;
imag=0;
} //使用初始化表初始化复数
Complex(double r, double i):real(r),imag(i){} Complex operator+(Complex &c2);//复数的加法
Complex operator-(Complex &c2);//复数的减法
Complex operator*(Complex &c2);//复数的乘法
Complex operator/(Complex &c2);//复数的除法 //重载<<运算符实现输出复数
friend ostream& operator <<(ostream& output, Complex& c); //重载>>运算符实现输入复数
friend istream& operator >>(istream& input, Complex& c); private:
double real;//复数的实部
double imag;//复数的虚部
}; //复数的加法
Complex Complex::operator+(Complex &c2)
{
Complex c3; c3.real = real + c2.real;
c3.imag = imag + c2.imag; return c3;
} //复数的减法
Complex Complex::operator-(Complex &c2)
{
Complex c3; c3.real = real - c2.real;
c3.imag = imag - c2.imag; return c3;
} //复数的乘法
Complex Complex::operator*(Complex &c2)
{
Complex c3; c3.real = real*c2.real - imag * c2.imag;
c3.imag = real*c2.imag + imag * c2.real; return c3;
} //复数的除法
Complex Complex::operator/(Complex &c2)
{
Complex c3; c3.real = (real * c2.real + imag * c2.imag) / (c2.real*c2.real + c2.imag * c2.imag); c3.imag = (imag * c2.real - real * c2.imag) / (c2.real*c2.real + c2.imag * c2.imag); return c3;
} //重载>>运算符实现输入复数
istream& operator >>(istream& input, Complex& c)
{
char op, ch;//保存字符 ,如1+2i, op保存+, ch保存i input>>c.real>>op>>c.imag>>ch; return input;
} //重载<<运算符实现输出复数
ostream& operator <<(ostream& output, Complex& c)
{
output<<c.real<<"+"<<c.imag<<"i"<<endl; return output;
} void main( )
{
//定义三个复数
Complex c1, c2, c3; cout<<"请输入一个复数:";
cin>>c1; cout<<"请输入一个复数:";
cin>>c2; //打印第一个复数
cout<<"c1 = ";
cout<<c1; //打印第二个复数
cout<<"c2 = ";
cout<<c2; //两个复数相加
c3 = c1 + c2;
cout<<"c1 + c2 = ";
cout<<c3; //两个复数想减
c3 = c1 - c2;
cout<<"c1 - c2 = ";
cout<<c3; //两个复数相乘
c3 = c1 * c2;
cout<<"c1 * c2 = ";
cout<<c3; //两个复数相除
c3 = c1 / c2;
cout<<"c1 / c2 = ";
cout<<c3; system("pause");
}

程序运行结果:

在程序中分别输入  5+10i  和  4+8i  后



重载&lt;&lt;和&gt;&gt;的更多相关文章

  1. .NET 基础 一步步 一幕幕[面向对象之方法、方法的重载、方法的重写、方法的递归]

    方法.方法的重载.方法的重写.方法的递归 方法: 将一堆代码进行重用的一种机制. 语法: [访问修饰符] 返回类型 <方法名>(参数列表){ 方法主体: } 返回值类型:如果不需要写返回值 ...

  2. PHP类和对象之重载

    PHP中的重载指的是动态的创建属性与方法,是通过魔术方法来实现的.属性的重载通过__set,__get,__isset,__unset来分别实现对不存在属性的赋值.读取.判断属性是否设置.销毁属性. ...

  3. C#基础回顾(二)—页面值传递、重载与重写、类与结构体、装箱与拆箱

    一.前言 -孤独的路上有梦想作伴,乘风破浪- 二.页面值传递 (1)C#各页面之间可以进行数据的交换和传递,页面之间可根据获取的数据,进行各自的操作(跳转.计算等操作).为了实现多种方式的数据传递,C ...

  4. new/delete重载

    在c++中,有时我们需要在运行阶段为一个变量分配未命名的内存,并使用指针来访问它,这里就可以用到new关键字.另外需要指出的是,new分配的内存块通常与常规变量分配的内存块不同,常规变量的值都储存在被 ...

  5. java重载与覆写

    很多同学对于overload和override傻傻分不清楚,建议不要死记硬背概念性的知识,要理解着去记忆. 先给出我的定义: overload(重载):在同一类或者有着继承关系的类中,一组名称相同,参 ...

  6. 【C++】多态性(函数重载与虚函数)

    多态性就是同一符号或名字在不同情况下具有不同解释的现象.多态性有两种表现形式: 编译时多态性:同一对象收到相同的消息却产生不同的函数调用,一般通过函数重载来实现,在编译时就实现了绑定,属于静态绑定. ...

  7. C++ 运算符重载时,将运算符两边对象交换问题.

    在C++进行运算符重载时, 一般来讲,运算符两边的对象的顺序是不能交换的. 比如下面的例子: #include <iostream> using namespace std; class ...

  8. C++重载new和delete运算符

    内存管理运算符 new.new[].delete 和 delete[] 也可以进行重载,其重载形式既可以是类的成员函数,也可以是全局函数.一般情况下,内建的内存管理运算符就够用了,只有在需要自己管理内 ...

  9. Java学习笔记之方法重载

    被重载的方法必须具有不同的参数列表.不能基于不同修饰符或返回值类型来重载方法. package welcome; public class TestMethodOverloading { public ...

  10. Qt 5.0+ 中 connect 新语法与重载函数不兼容问题的解决方法,以及个人看法

    Qt 5.0+ 版本提供了 connect 的新语法,相比之前的语法新语法可以提供编译期检查,使用也更方便.可是使用过程中发现一个小问题——当某个 signal 和成员函数是重载关系的时候,qmake ...

随机推荐

  1. ZOJ 3497 Mistwald

    矩阵快速幂. 邻接矩阵的$P$次方就是走$P$步之后的方案数,这里只记录能否走到就可以了.然后再判断一下三种情况即可. #pragma comment(linker, "/STACK:102 ...

  2. 关于sql查询语句中的别名

    sql语句中给子查询或其他查询类型加别名的时候可能会报错 java.sql.SQLException: 无法转换为内部表示 原因是select返回类型的实体类中没有写该别名 原来的实体类 更改后的实体 ...

  3. hibernate对象关系映射的配置

    一对一主键关联单双向 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-m ...

  4. Luogu P2486 染色(树链剖分+线段树)

    题解 不妨采取重链剖分的方式把路径剖成区间,然后用线段树维护,考虑如何合并一个区间 struct Node { int lf, rg, tot; }seg[N << 2]; int col ...

  5. 第8天-setInterval/setTimeout

    setInterval是什么? setInterval()方法重复调用一个函数或执行一个代码段,在每次调用之间具有固定的时间延迟. setInterval(函数,间隔时间) 例如 function f ...

  6. Python开发基础-Day18继承派生、组合、接口和抽象类

    类的继承与派生 经典类和新式类 在python3中,所有类默认继承object,但凡是继承了object类的子类,以及该子类的子类,都称为新式类(在python3中所有的类都是新式类) 没有继承obj ...

  7. angularjs学习笔记3-directive中scope的绑定修饰符

    在angularjs中,一个directive返回一个对象,对象存在很多属性,并且可以在directive中自定义自己的scope,而使用自己的scope是为了防止一个directive被使用在多个地 ...

  8. 2. let和const命令--ES6

    1. let命令 let 命令不存在变量提升let 命令 只在let命令所在的代码块内有效. { let a = 10; var b = 1; } a // ReferenceError: a is ...

  9. [BZOJ5251][九省联考2018]劈配(网络流)

    5251: [2018多省省队联测]劈配 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 33  Solved: 22[Submit][Status][ ...

  10. 【容斥原理】Codeforces Round #428 (Div. 2) D. Winter is here

    给你一个序列,让你对于所有gcd不为1的子序列,计算它们的gcd*其元素个数之和. 设sum(i)为i的倍数的数的个数,可以通过容斥算出来. 具体看这个吧:http://blog.csdn.net/j ...